[ecflow] 14/50: upstream release 4.6.0
Alastair McKinstry
mckinstry at moszumanska.debian.org
Wed Sep 20 15:30:43 UTC 2017
This is an automated email from the git hooks/post-receive script.
mckinstry pushed a commit to branch debian/master
in repository ecflow.
commit a8a9e28e72577ceb280a6a8b0f0d1445a77afaed
Author: Alastair McKinstry <mckinstry at debian.org>
Date: Tue May 16 22:45:28 2017 +0100
upstream release 4.6.0
---
ACore/Jamfile.jam | 2 +-
ACore/src/Archive.hpp | 2 +-
ACore/src/ArgvCreator.cpp | 4 +-
ACore/src/ArgvCreator.hpp | 2 +-
ACore/src/AssertTimer.cpp | 2 +-
ACore/src/AssertTimer.hpp | 2 +-
ACore/src/Cal.cpp | 2 +-
ACore/src/Cal.hpp | 2 +-
ACore/src/Calendar.cpp | 2 +-
ACore/src/Calendar.hpp | 2 +-
ACore/src/CalendarUpdateParams.hpp | 2 +-
ACore/src/CheckPt.hpp | 2 +-
ACore/src/Child.cpp | 2 +-
ACore/src/Child.hpp | 2 +-
ACore/src/DState.cpp | 32 +-
ACore/src/DState.hpp | 5 +-
ACore/src/DurationTimer.hpp | 2 +-
ACore/src/Ecf.cpp | 2 +-
ACore/src/Ecf.hpp | 2 +-
ACore/src/EcfPortLock.hpp | 2 +-
ACore/src/Extract.cpp | 2 +-
ACore/src/Extract.hpp | 2 +-
ACore/src/File.cpp | 53 +-
ACore/src/File.hpp | 7 +-
ACore/src/File_r.cpp | 2 +-
ACore/src/File_r.hpp | 2 +-
ACore/src/Host.cpp | 2 +-
ACore/src/Host.hpp | 2 +-
ACore/src/Indentor.cpp | 2 +-
ACore/src/Indentor.hpp | 2 +-
ACore/src/Log.cpp | 2 +-
ACore/src/Log.hpp | 2 +-
ACore/src/LogVerification.cpp | 4 +-
ACore/src/LogVerification.hpp | 2 +-
ACore/src/NOrder.cpp | 2 +-
ACore/src/NOrder.hpp | 2 +-
ACore/src/NState.cpp | 30 +-
ACore/src/NState.hpp | 5 +-
ACore/src/NodePath.cpp | 2 +-
ACore/src/NodePath.hpp | 2 +-
ACore/src/Passwd.cpp | 2 +-
ACore/src/Passwd.hpp | 2 +-
ACore/src/PasswdFile.cpp | 11 +-
ACore/src/PasswdFile.hpp | 2 +-
ACore/src/Pid.cpp | 2 +-
ACore/src/Pid.hpp | 2 +-
ACore/src/PrintStyle.cpp | 2 +-
ACore/src/PrintStyle.hpp | 2 +-
ACore/src/SState.cpp | 2 +-
ACore/src/SState.hpp | 2 +-
ACore/src/Serialization.hpp | 2 +-
ACore/src/SerializationTest.hpp | 2 +-
ACore/src/Stl.hpp | 2 +-
ACore/src/Str.cpp | 2 +-
ACore/src/Str.hpp | 2 +-
ACore/src/TimeSeries.cpp | 2 +-
ACore/src/TimeSeries.hpp | 2 +-
ACore/src/TimeSlot.cpp | 2 +-
ACore/src/TimeSlot.hpp | 2 +-
ACore/src/TimeStamp.cpp | 2 +-
ACore/src/TimeStamp.hpp | 2 +-
ACore/src/Version.cpp | 2 +-
ACore/src/Version.hpp | 2 +-
ACore/src/WhiteListFile.cpp | 6 +-
ACore/src/WhiteListFile.hpp | 2 +-
ACore/src/boost_archive.cpp | 2 +-
ACore/src/boost_archive.hpp | 2 +-
ACore/src/ecflow_version.h | 4 +-
ACore/test/TestArgvCreator.cpp | 2 +-
ACore/test/TestCalendar.cpp | 2 +-
ACore/test/TestExceptionSafety.cpp | 2 +-
ACore/test/TestFile.cpp | 18 +-
ACore/test/TestGetUserDetails.cpp | 2 +-
ACore/test/TestLog.cpp | 4 +-
ACore/test/TestMigration.cpp | 2 +-
ACore/test/TestNodePath.cpp | 2 +-
ACore/test/TestPasswdFile.cpp | 2 +-
ACore/test/TestRealCalendar.cpp | 2 +-
ACore/test/TestSerialisation.cpp | 2 +-
ACore/test/TestStackTrace.cpp | 2 +-
ACore/test/TestStr.cpp | 2 +-
ACore/test/TestTimeSeries.cpp | 2 +-
ACore/test/TestTimeSlot.cpp | 2 +-
ACore/test/TestVersion.cpp | 4 +-
ACore/test/TestVersioning.cpp | 2 +-
ACore/test/TestVersioning.hpp | 2 +-
ACore/test/TestWhiteListFile.cpp | 2 +-
ANattr/jamfile.jam | 2 +-
ANattr/src/AutoCancelAttr.cpp | 2 +-
ANattr/src/AutoCancelAttr.hpp | 2 +-
ANattr/src/ClockAttr.cpp | 2 +-
ANattr/src/ClockAttr.hpp | 2 +-
ANattr/src/CronAttr.cpp | 2 +-
ANattr/src/CronAttr.hpp | 2 +-
ANattr/src/DateAttr.cpp | 2 +-
ANattr/src/DateAttr.hpp | 2 +-
ANattr/src/DayAttr.cpp | 4 +-
ANattr/src/DayAttr.hpp | 6 +-
ANattr/src/LateAttr.cpp | 2 +-
ANattr/src/LateAttr.hpp | 2 +-
ANattr/src/NodeAttr.cpp | 2 +-
ANattr/src/NodeAttr.hpp | 2 +-
ANattr/src/RepeatAttr.cpp | 2 +-
ANattr/src/RepeatAttr.hpp | 4 +-
ANattr/src/TimeAttr.cpp | 2 +-
ANattr/src/TimeAttr.hpp | 2 +-
ANattr/src/TodayAttr.cpp | 2 +-
ANattr/src/TodayAttr.hpp | 2 +-
ANattr/src/Variable.cpp | 2 +-
ANattr/src/Variable.hpp | 2 +-
ANattr/src/VerifyAttr.cpp | 2 +-
ANattr/src/VerifyAttr.hpp | 2 +-
ANattr/src/Zombie.cpp | 2 +-
ANattr/src/Zombie.hpp | 2 +-
ANattr/src/ZombieAttr.cpp | 2 +-
ANattr/src/ZombieAttr.hpp | 2 +-
ANattr/test/TestAttrSerialization.cpp | 2 +-
ANattr/test/TestCron.cpp | 2 +-
ANattr/test/TestDayAttr.cpp | 2 +-
ANattr/test/TestLabel.cpp | 2 +-
ANattr/test/TestLateAttr.cpp | 2 +-
ANattr/test/TestMigration.cpp | 2 +-
ANattr/test/TestRepeat.cpp | 2 +-
ANattr/test/TestTimeAttr.cpp | 2 +-
ANattr/test/TestTodayAttr.cpp | 2 +-
ANattr/test/TestVariable.cpp | 2 +-
ANode/jamfile.jam | 2 +-
ANode/src/AbstractObserver.hpp | 5 +-
ANode/src/Alias.cpp | 2 +-
ANode/src/Alias.hpp | 4 +-
ANode/src/Aspect.hpp | 2 +-
ANode/src/Attr.cpp | 86 +
ANode/src/{CmdContext.cpp => Attr.hpp} | 33 +-
ANode/src/CheckPtContext.cpp | 2 +-
ANode/src/CheckPtContext.hpp | 2 +-
ANode/src/ChildAttrs.cpp | 37 +-
ANode/src/ChildAttrs.hpp | 10 +-
ANode/src/ClientSuiteMgr.cpp | 2 +-
ANode/src/ClientSuiteMgr.hpp | 2 +-
ANode/src/ClientSuites.cpp | 13 +-
ANode/src/ClientSuites.hpp | 2 +-
ANode/src/CmdContext.cpp | 2 +-
ANode/src/CmdContext.hpp | 2 +-
ANode/src/Defs.cpp | 100 +-
ANode/src/Defs.hpp | 23 +-
ANode/src/DefsDelta.cpp | 2 +-
ANode/src/DefsDelta.hpp | 2 +-
ANode/src/EcfFile.cpp | 92 +-
ANode/src/EcfFile.hpp | 2 +-
ANode/src/ExprAst.cpp | 763 +-
ANode/src/ExprAst.hpp | 150 +-
ANode/src/ExprAstVisitor.cpp | 22 +-
ANode/src/ExprAstVisitor.hpp | 12 +-
ANode/src/ExprDuplicate.cpp | 2 +-
ANode/src/ExprDuplicate.hpp | 2 +-
ANode/src/ExprParser.cpp | 78 +-
ANode/src/ExprParser.hpp | 2 +-
ANode/src/Expression.cpp | 2 +-
ANode/src/Expression.hpp | 2 +-
ANode/src/Family.cpp | 2 +-
ANode/src/Family.hpp | 6 +-
ANode/src/Flag.cpp | 2 +-
ANode/src/Flag.hpp | 2 +-
ANode/src/InLimit.cpp | 2 +-
ANode/src/InLimit.hpp | 2 +-
ANode/src/InLimitMgr.cpp | 36 +-
ANode/src/InLimitMgr.hpp | 4 +-
ANode/src/JobCreationCtrl.cpp | 2 +-
ANode/src/JobCreationCtrl.hpp | 2 +-
ANode/src/JobProfiler.cpp | 2 +-
ANode/src/JobProfiler.hpp | 2 +-
ANode/src/Jobs.cpp | 4 +-
ANode/src/Jobs.hpp | 2 +-
ANode/src/JobsParam.cpp | 2 +-
ANode/src/JobsParam.hpp | 2 +-
ANode/src/Limit.cpp | 3 +-
ANode/src/Limit.hpp | 2 +-
ANode/src/LimitFwd.hpp | 2 +-
ANode/src/Memento.cpp | 53 +-
ANode/src/Memento.hpp | 90 +-
.../VItemTmp.cpp => ANode/src/MigrateContext.cpp | 25 +-
ANode/src/{CmdContext.hpp => MigrateContext.hpp} | 22 +-
ANode/src/MiscAttrs.cpp | 2 +-
ANode/src/MiscAttrs.hpp | 2 +-
ANode/src/Node.cpp | 163 +-
ANode/src/Node.hpp | 65 +-
ANode/src/NodeAdd.cpp | 16 +-
ANode/src/NodeChange.cpp | 2 +-
ANode/src/NodeContainer.cpp | 48 +-
ANode/src/NodeContainer.hpp | 16 +-
ANode/src/NodeDelete.cpp | 2 +-
ANode/src/NodeFind.cpp | 7 +-
ANode/src/NodeFwd.hpp | 2 +-
ANode/src/NodeMemento.cpp | 206 +-
ANode/src/NodeState.hpp | 2 +-
ANode/src/NodeTreeVisitor.cpp | 2 +-
ANode/src/NodeTreeVisitor.hpp | 2 +-
ANode/src/ResolveExternsVisitor.cpp | 17 +-
ANode/src/ResolveExternsVisitor.hpp | 5 +-
ANode/src/ServerState.cpp | 26 +-
ANode/src/ServerState.hpp | 6 +-
ANode/src/Signal.cpp | 2 +-
ANode/src/Signal.hpp | 2 +-
ANode/src/Submittable.cpp | 15 +-
ANode/src/Submittable.hpp | 4 +-
ANode/src/Suite.cpp | 21 +-
ANode/src/Suite.hpp | 12 +-
ANode/src/SuiteChanged.cpp | 2 +-
ANode/src/SuiteChanged.hpp | 2 +-
ANode/src/System.cpp | 2 +-
ANode/src/System.hpp | 2 +-
ANode/src/Task.cpp | 27 +-
ANode/src/Task.hpp | 10 +-
ANode/src/TaskScriptGenerator.cpp | 2 +-
ANode/src/TaskScriptGenerator.hpp | 2 +-
ANode/src/TimeDepAttrs.cpp | 28 +-
ANode/src/TimeDepAttrs.hpp | 14 +-
ANode/test/MyDefsFixture.hpp | 2 +-
ANode/test/TestAdd.cpp | 2 +-
ANode/test/TestAlias.cpp | 2 +-
ANode/test/TestAssignmentOperator.cpp | 144 +-
ANode/test/TestChangeMgrSingleton.cpp | 5 +-
ANode/test/TestCopyConstructor.cpp | 2 +-
ANode/test/TestDefStatus.cpp | 2 +-
ANode/test/TestDefs.cpp | 2 +-
ANode/test/TestEcfFile.cpp | 24 +-
ANode/test/TestEcfFileLocator.cpp | 2 +-
ANode/test/TestEnviromentSubstitution.cpp | 2 +-
ANode/test/TestExprParser.cpp | 97 +-
ANode/test/TestExprRepeatDateArithmetic.cpp | 2 +-
ANode/test/TestFindAbsNodePath.cpp | 2 +-
ANode/test/TestFlag.cpp | 2 +-
ANode/test/TestFlagMigrated.cpp | 2 +-
ANode/test/TestHistoryParser.cpp | 2 +-
ANode/test/TestInLimit.cpp | 2 +-
ANode/test/TestJobCreator.cpp | 2 +-
ANode/test/TestJobProfiler.cpp | 4 +-
ANode/test/TestLimit.cpp | 21 +-
ANode/test/TestMigration.cpp | 2 +-
ANode/test/TestMissNextTimeSlot.cpp | 2 +-
ANode/test/TestNodeBeginReque.cpp | 2 +-
ANode/test/TestNodeState.cpp | 2 +-
ANode/test/TestOrder.cpp | 2 +-
ANode/test/TestPersistence.cpp | 2 +-
ANode/test/TestPreProcessing.cpp | 2 +-
ANode/test/TestReplace.cpp | 2 +-
ANode/test/TestSetState.cpp | 2 +-
ANode/test/TestSingleExprParse.cpp | 14 +-
ANode/test/TestTaskScriptGenerator.cpp | 2 +-
ANode/test/TestTimeDependencies.cpp | 2 +-
ANode/test/TestVariableGeneration.cpp | 2 +-
ANode/test/TestVariableInheritance.cpp | 2 +-
ANode/test/TestVariableSubstitution.cpp | 2 +-
ANode/test/TestVariableSubstitutionDefs.cpp | 2 +-
ANode/test/TestZombies.cpp | 2 +-
ANode/test/Test_ECFLOW-195.cpp | 2 +-
ANode/test/Test_ECFLOW-247.cpp | 2 +-
ANode/test/Test_ECFLOW-417.cpp | 2 +-
ANode/test/data/SMSHOME/suite/family/head.h | 2 +-
ANode/test/data/SMSHOME/suite/family/tail.h | 2 +-
.../data/SMSHOME2/bad/includes/recursive_head.h | 2 +-
ANode/test/data/SMSHOME2/good/includes/config.h | 2 +-
ANode/test/data/SMSHOME2/good/includes/config.oc.h | 2 +-
ANode/test/data/SMSHOME2/good/includes/endt.h | 2 +-
ANode/test/data/SMSHOME2/good/includes/head.h | 2 +-
ANode/test/data/SMSHOME2/good/includes/law.h | 2 +-
ANode/test/data/SMSHOME2/good/includes/rcp.h | 2 +-
.../SMSHOME2/good/includes/recursive_include.h | 2 +-
ANode/test/data/SMSHOME2/good/includes/set_traps.h | 2 +-
ANode/test/data/SMSHOME2/good/includes/setup.h | 2 +-
ANode/test/data/SMSHOME2/good/includes/sms.h | 2 +-
ANode/test/data/SMSHOME2/good/includes/tail.h | 2 +-
ANode/test/data/SMSHOME2/good/includes/trap.h | 2 +-
ANode/test/data/includes/head.h | 2 +-
ANode/test/data/includes/tail.h | 2 +-
AParser/Jamfile.jam | 2 +-
AParser/src/AutoCancelParser.cpp | 2 +-
AParser/src/AutoCancelParser.hpp | 2 +-
AParser/src/CalendarParser.cpp | 2 +-
AParser/src/CalendarParser.hpp | 2 +-
AParser/src/ClockParser.cpp | 2 +-
AParser/src/ClockParser.hpp | 2 +-
AParser/src/CronParser.cpp | 2 +-
AParser/src/CronParser.hpp | 2 +-
AParser/src/DateParser.cpp | 2 +-
AParser/src/DateParser.hpp | 2 +-
AParser/src/DayParser.cpp | 2 +-
AParser/src/DayParser.hpp | 2 +-
AParser/src/DefsParser.cpp | 2 +-
AParser/src/DefsParser.hpp | 2 +-
AParser/src/DefsStateParser.cpp | 2 +-
AParser/src/DefsStateParser.hpp | 2 +-
AParser/src/DefsStatusParser.cpp | 2 +-
AParser/src/DefsStatusParser.hpp | 2 +-
AParser/src/DefsStructureParser.cpp | 2 +-
AParser/src/DefsStructureParser.hpp | 2 +-
AParser/src/EventParser.cpp | 2 +-
AParser/src/EventParser.hpp | 2 +-
AParser/src/ExternParser.cpp | 2 +-
AParser/src/ExternParser.hpp | 2 +-
AParser/src/InlimitParser.cpp | 2 +-
AParser/src/InlimitParser.hpp | 2 +-
AParser/src/LabelParser.cpp | 2 +-
AParser/src/LabelParser.hpp | 2 +-
AParser/src/LateParser.cpp | 2 +-
AParser/src/LateParser.hpp | 2 +-
AParser/src/LimitParser.cpp | 2 +-
AParser/src/LimitParser.hpp | 2 +-
AParser/src/MeterParser.cpp | 2 +-
AParser/src/MeterParser.hpp | 2 +-
AParser/src/Parser.cpp | 2 +-
AParser/src/Parser.hpp | 2 +-
AParser/src/RepeatParser.cpp | 2 +-
AParser/src/RepeatParser.hpp | 2 +-
AParser/src/TimeParser.cpp | 2 +-
AParser/src/TimeParser.hpp | 2 +-
AParser/src/TodayParser.cpp | 2 +-
AParser/src/TodayParser.hpp | 2 +-
AParser/src/TriggerParser.cpp | 2 +-
AParser/src/TriggerParser.hpp | 2 +-
AParser/src/VariableParser.cpp | 2 +-
AParser/src/VariableParser.hpp | 2 +-
AParser/src/VerifyParser.cpp | 2 +-
AParser/src/VerifyParser.hpp | 2 +-
AParser/src/ZombieAttrParser.cpp | 2 +-
AParser/src/ZombieAttrParser.hpp | 2 +-
AParser/test/ParseOnly.cpp | 2 +-
AParser/test/ParseTimer.cpp | 2 +-
AParser/test/PersistHelper.cpp | 2 +-
AParser/test/PersistHelper.hpp | 2 +-
AParser/test/TestAutoAddExterns.cpp | 2 +-
AParser/test/TestDefsStructurePersistAndReload.cpp | 2 +-
AParser/test/TestJobGenPerf.log | 1 +
AParser/test/TestMigration.cpp | 6 +-
AParser/test/TestParser.cpp | 2 +-
AParser/test/TestSingleDefsFile.cpp | 2 +-
AParser/test/TestVariableParsing.cpp | 2 +-
AParser/test/data/bad_defs/cron/cron8.def | 3 +
.../data/bad_defs/trigger/suite_with_trigger.def | 6 +
AParser/test/data/good_defs/cron/cron.def | 3 +-
AParser/test/data/good_defs/trigger/ECFLOW_867.def | 9 +
AParser/test/data/good_defs/trigger/late.def | 15 +
Base/Jamfile.jam | 2 +-
Base/src/AbstractClientEnv.hpp | 10 +-
Base/src/AbstractServer.hpp | 2 +-
Base/src/Client.cpp | 2 +-
Base/src/Client.hpp | 2 +-
Base/src/ClientToServerRequest.cpp | 2 +-
Base/src/ClientToServerRequest.hpp | 2 +-
Base/src/Cmd.hpp | 2 +-
Base/src/Connection.cpp | 6 +-
Base/src/Connection.hpp | 6 +-
Base/src/Gnuplot.cpp | 2 +-
Base/src/Gnuplot.hpp | 2 +-
Base/src/Openssl.cpp | 2 +-
Base/src/Openssl.hpp | 2 +-
Base/src/ServerReply.cpp | 2 +-
Base/src/ServerReply.hpp | 2 +-
Base/src/ServerToClientResponse.cpp | 2 +-
Base/src/ServerToClientResponse.hpp | 2 +-
Base/src/Stats.cpp | 2 +-
Base/src/Stats.hpp | 2 +-
Base/src/WhyCmd.cpp | 2 +-
Base/src/WhyCmd.hpp | 2 +-
Base/src/ZombieCtrl.cpp | 24 +-
Base/src/ZombieCtrl.hpp | 2 +-
Base/src/cts/AlterCmd.cpp | 220 +-
Base/src/cts/BeginCmd.cpp | 2 +-
Base/src/cts/CFileCmd.cpp | 14 +-
Base/src/cts/CSyncCmd.cpp | 2 +-
Base/src/cts/CheckPtCmd.cpp | 2 +-
Base/src/cts/ClientHandleCmd.cpp | 4 +-
Base/src/cts/ClientToServerCmd.cpp | 2 +-
Base/src/cts/ClientToServerCmd.hpp | 23 +-
Base/src/cts/CtsApi.cpp | 17 +-
Base/src/cts/CtsApi.hpp | 5 +-
Base/src/cts/CtsCmd.cpp | 13 +-
Base/src/cts/CtsCmdRegistry.cpp | 2 +-
Base/src/cts/CtsCmdRegistry.hpp | 2 +-
Base/src/cts/CtsNodeCmd.cpp | 2 +-
Base/src/cts/EditHistoryMgr.cpp | 2 +-
Base/src/cts/EditHistoryMgr.hpp | 2 +-
Base/src/cts/EditScriptCmd.cpp | 4 +-
Base/src/cts/ForceCmd.cpp | 8 +-
Base/src/cts/FreeDepCmd.cpp | 2 +-
Base/src/cts/GroupCTSCmd.cpp | 2 +-
Base/src/cts/LoadDefsCmd.cpp | 2 +-
Base/src/cts/LogCmd.cpp | 2 +-
Base/src/cts/LogMessageCmd.cpp | 2 +-
Base/src/cts/OrderNodeCmd.cpp | 2 +-
Base/src/cts/PathsCmd.cpp | 2 +-
Base/src/cts/PlugCmd.cpp | 2 +-
Base/src/cts/ReplaceNodeCmd.cpp | 2 +-
Base/src/cts/RequeueNodeCmd.cpp | 2 +-
Base/src/cts/RunNodeCmd.cpp | 2 +-
Base/src/cts/ServerVersionCmd.cpp | 2 +-
Base/src/cts/ShowCmd.cpp | 2 +-
Base/src/cts/TaskApi.cpp | 2 +-
Base/src/cts/TaskApi.hpp | 2 +-
Base/src/cts/TaskCmds.cpp | 5 +-
Base/src/cts/UserCmd.cpp | 43 +-
Base/src/cts/ZombieCmd.cpp | 28 +-
Base/src/stc/DefsCmd.cpp | 12 +-
Base/src/stc/DefsCmd.hpp | 19 +-
Base/src/stc/ErrorCmd.cpp | 2 +-
Base/src/stc/ErrorCmd.hpp | 2 +-
Base/src/stc/GroupSTCCmd.cpp | 9 +-
Base/src/stc/GroupSTCCmd.hpp | 2 +-
Base/src/stc/PreAllocatedReply.cpp | 6 +-
Base/src/stc/PreAllocatedReply.hpp | 4 +-
Base/src/stc/SClientHandleCmd.cpp | 2 +-
Base/src/stc/SClientHandleCmd.hpp | 2 +-
Base/src/stc/SClientHandleSuitesCmd.cpp | 2 +-
Base/src/stc/SClientHandleSuitesCmd.hpp | 2 +-
Base/src/stc/SNewsCmd.cpp | 2 +-
Base/src/stc/SNewsCmd.hpp | 2 +-
Base/src/stc/SNodeCmd.cpp | 2 +-
Base/src/stc/SNodeCmd.hpp | 2 +-
Base/src/stc/SServerLoadCmd.cpp | 2 +-
Base/src/stc/SServerLoadCmd.hpp | 2 +-
Base/src/stc/SStatsCmd.cpp | 2 +-
Base/src/stc/SStatsCmd.hpp | 2 +-
Base/src/stc/SStringCmd.cpp | 2 +-
Base/src/stc/SStringCmd.hpp | 2 +-
Base/src/stc/SStringVecCmd.cpp | 2 +-
Base/src/stc/SStringVecCmd.hpp | 2 +-
Base/src/stc/SSuitesCmd.cpp | 2 +-
Base/src/stc/SSuitesCmd.hpp | 2 +-
Base/src/stc/SSyncCmd.cpp | 2 +-
Base/src/stc/SSyncCmd.hpp | 4 +-
Base/src/stc/ServerToClientCmd.cpp | 2 +-
Base/src/stc/ServerToClientCmd.hpp | 2 +-
Base/src/stc/StcCmd.cpp | 2 +-
Base/src/stc/StcCmd.hpp | 2 +-
Base/src/stc/ZombieGetCmd.cpp | 2 +-
Base/src/stc/ZombieGetCmd.hpp | 2 +-
Base/test/MockServer.hpp | 2 +-
Base/test/TestAlterCmd.cpp | 127 +-
Base/test/TestClientHandleCmd.cpp | 2 +-
Base/test/TestCmd.cpp | 2 +-
Base/test/TestDeleteNodeCmd.cpp | 2 +-
Base/test/TestECFLOW-189.cpp | 2 +-
Base/test/TestForceCmd.cpp | 9 +-
Base/test/TestFreeDepCmd.cpp | 2 +-
Base/test/TestHelper.hpp | 2 +-
Base/test/TestJobGenPerf.cpp | 15 +-
Base/test/TestJobGenPerf.log | 7435 ++++++++++++++++++++
Base/test/TestLimit.cpp | 2 +-
Base/test/TestLogCmd.cpp | 2 +-
Base/test/TestMeterCmd.cpp | 2 +-
Base/test/TestProgramOptions.cpp | 2 +-
Base/test/TestRequest.cpp | 2 +-
Base/test/TestRequeueNodeCmd.cpp | 2 +-
Base/test/TestResolveDependencies.cpp | 2 +-
Base/test/TestSSyncCmd.cpp | 2 +-
Base/test/TestSSyncCmdOrder.cpp | 2 +-
Base/test/TestSSyncCmd_CH1.cpp | 10 +-
CMakeLists.txt | 14 +-
CSim/jamfile.jam | 2 +-
CSim/src/Analyser.cpp | 2 +-
CSim/src/Analyser.hpp | 2 +-
CSim/src/AstAnalyserVisitor.cpp | 6 +-
CSim/src/AstAnalyserVisitor.hpp | 5 +-
CSim/src/DefsAnalyserVisitor.cpp | 2 +-
CSim/src/DefsAnalyserVisitor.hpp | 2 +-
CSim/src/FlatAnalyserVisitor.cpp | 2 +-
CSim/src/FlatAnalyserVisitor.hpp | 2 +-
CSim/src/Simulator.cpp | 27 +-
CSim/src/Simulator.hpp | 2 +-
CSim/src/SimulatorVisitor.cpp | 35 +-
CSim/src/SimulatorVisitor.hpp | 3 +-
CSim/test/TestAnalysis.cpp | 2 +-
CSim/test/TestAutoCancel.cpp | 2 +-
CSim/test/TestMeter.cpp | 2 +-
CSim/test/TestRepeat.cpp | 4 +-
CSim/test/TestSimulator.cpp | 2 +-
CSim/test/TestSingleSimulator.cpp | 2 +-
CSim/test/TestTime.cpp | 2 +-
CSim/test/TestToday.cpp | 16 +-
CSim/test/TestUtil.cpp | 2 +-
CSim/test/TestUtil.hpp | 2 +-
CSim/test/data/good_defs/misc/defstatus.def | 14 +
Client/Jamfile.jam | 278 +-
Client/src/ClientEnvironment.cpp | 2 +-
Client/src/ClientEnvironment.hpp | 2 +-
Client/src/ClientInvoker.cpp | 20 +-
Client/src/ClientInvoker.hpp | 13 +-
Client/src/ClientMain.cpp | 2 +-
Client/src/ClientOptions.cpp | 2 +-
Client/src/ClientOptions.hpp | 2 +-
Client/src/Rtt.cpp | 4 +-
Client/src/Rtt.hpp | 2 +-
Client/src/UrlCmd.cpp | 2 +-
Client/src/UrlCmd.hpp | 2 +-
Client/test/InvokeServer.hpp | 2 +-
Client/test/SCPort.cpp | 2 +-
Client/test/SCPort.hpp | 2 +-
Client/test/TestCheckPtDefsCmd.cpp | 2 +-
Client/test/TestClientEnvironment.cpp | 33 +-
Client/test/TestClientInterface.cpp | 30 +-
Client/test/TestClientInvoker.cpp | 2 +-
Client/test/TestClientTimeout.cpp | 2 +-
Client/test/TestFlagMigrate.cpp | 2 +-
Client/test/TestGroupCmd.cpp | 2 +-
Client/test/TestJobGenOnly.cpp | 2 +-
Client/test/TestLifeCycle.cpp | 2 +-
Client/test/TestLoadDefsCmd.cpp | 2 +-
Client/test/TestMigration.cpp | 2 +-
Client/test/TestPasswdFile.cpp | 2 +-
Client/test/TestPlugCmd.cpp | 2 +-
Client/test/TestRtt.cpp | 2 +-
Client/test/TestServer.cpp | 2 +-
Client/test/TestServerAndLifeCycle.cpp | 2 +-
Client/test/TestServerLoad.cpp | 2 +-
Client/test/TestSignalSIGTERM.cpp | 2 +-
Client/test/TestSinglePerf.cpp | 2 +-
Client/test/TestUrlCmd.cpp | 2 +-
Client/test/TestWhiteListFile.cpp | 2 +-
Jamroot.jam | 52 +-
Pyext/CMakeLists.txt | 1 +
Pyext/ecflow/__init__.py | 4 +-
Pyext/ecflow/__init__.py.in | 2 +-
Pyext/jamfile.jam | 43 +-
Pyext/migrate/ecflow_migrate.py | 7 +-
Pyext/samples/ListVariables.py | 2 +-
Pyext/samples/TestBench.py | 96 +-
Pyext/samples/TestGui.py | 4 +-
Pyext/samples/TestJobGenPerf.py | 2 +-
Pyext/samples/TestServerGetDefs.py | 2 +-
Pyext/samples/TestSyncLocalPerf.py | 2 +-
Pyext/samples/printdefs.py | 2 +-
Pyext/samples/resume.py | 2 +-
Pyext/script.py | 2 +-
Pyext/setup.py | 136 +
Pyext/src/BoostPythonUtil.cpp | 2 +-
Pyext/src/BoostPythonUtil.hpp | 2 +-
Pyext/src/ClientDoc.cpp | 2 +-
Pyext/src/ClientDoc.hpp | 2 +-
Pyext/src/DefsDoc.cpp | 2 +-
Pyext/src/DefsDoc.hpp | 2 +-
Pyext/src/EcfExt.cpp | 2 +-
Pyext/src/ExportClient.cpp | 13 +-
Pyext/src/ExportCore.cpp | 2 +-
Pyext/src/ExportDefs.cpp | 15 +-
Pyext/src/ExportNode.cpp | 14 +-
Pyext/src/ExportNodeAttr.cpp | 14 +-
Pyext/src/ExportSuiteAndFamily.cpp | 2 +-
Pyext/src/ExportTask.cpp | 2 +-
Pyext/src/NodeAttrDoc.cpp | 2 +-
Pyext/src/NodeAttrDoc.hpp | 2 +-
Pyext/test/CleanupOnlineTutorial.py | 2 +-
Pyext/test/TestEmbeddedEcf.cpp | 2 +-
Pyext/test/data/CUSTOMER/ECF_HOME/includes/head.h | 29 +
Pyext/test/data/CUSTOMER/ECF_HOME/includes/tail.h | 3 +
Pyext/test/data/CUSTOMER/ECF_HOME/obs/anon/t1.ecf | 25 +
Pyext/test/data/CUSTOMER/ECF_HOME/obs/anon/t2.ecf | 25 +
Pyext/test/data/CUSTOMER/ECF_HOME/obs/f1/t.ecf | 25 +
Pyext/test/data/CUSTOMER/ECF_HOME/obs/f1/t1.ecf | 26 +
Pyext/test/data/includes/head.h | 2 +-
Pyext/test/ecflow_test_util.py | 2 +-
Pyext/test/py_s_TestClientApi.py | 85 +-
Pyext/test/py_s_TestPythonChildApi.py | 2 +-
Pyext/test/py_u_TestAddDelete.py | 133 +-
Pyext/test/py_u_TestAddDeleteError.py | 2 +-
Pyext/test/py_u_TestAddDeleteFunc.py | 2 +-
Pyext/test/py_u_TestAddNodeFunc.py | 5 +-
Pyext/test/py_u_TestAutoAddExtern.py | 49 +
Pyext/test/py_u_TestCopy.py | 2 +-
Pyext/test/py_u_TestDefs.py | 2 +-
Pyext/test/py_u_TestDefsCheck.py | 2 +-
Pyext/test/py_u_TestDerivable.py | 2 +-
Pyext/test/py_u_TestEcf.py | 2 +-
Pyext/test/py_u_TestError.py | 45 +-
Pyext/test/py_u_TestFind.py | 2 +-
Pyext/test/py_u_TestFlag.py | 2 +-
Pyext/test/py_u_TestGeneratedVariable.py | 2 +-
Pyext/test/py_u_TestGetAllTasks.py | 2 +-
Pyext/test/py_u_TestJobGeneration.py | 2 +-
Pyext/test/py_u_TestParent.py | 2 +-
Pyext/test/py_u_TestRemove.py | 2 +-
Pyext/test/py_u_TestRepeatArithmetic.py | 2 +-
Pyext/test/py_u_TestSimulator.py | 8 +-
Pyext/test/py_u_TestTraversal.py | 2 +-
Pyext/test/py_u_TestUserManual.py | 2 +-
Pyext/test/py_u_TestWith.py | 2 +-
Server/Jamfile.jam | 2 +-
Server/server_environment.cfg | 2 +-
Server/src/CConnection.cpp | 2 +-
Server/src/CConnection.hpp | 2 +-
Server/src/CheckPtSaver.cpp | 2 +-
Server/src/CheckPtSaver.hpp | 2 +-
Server/src/NodeTreeTraverser.cpp | 2 +-
Server/src/NodeTreeTraverser.hpp | 2 +-
Server/src/Server.cpp | 5 +-
Server/src/Server.hpp | 2 +-
Server/src/ServerEnvironment.cpp | 2 +-
Server/src/ServerEnvironment.hpp | 2 +-
Server/src/ServerMain.cpp | 2 +-
Server/src/ServerOptions.cpp | 9 +-
Server/src/ServerOptions.hpp | 2 +-
Server/test/TestServer1.cpp | 10 +-
Server/test/TestServerEnvironment.cpp | 2 +-
Test/DummyMain.cpp | 2 +-
Test/Jamfile.jam | 2 +-
Test/TestAbortCmd.cpp | 2 +-
Test/TestAlias.cpp | 2 +-
Test/TestClkSync.cpp | 2 +-
Test/TestComplete.cpp | 12 +-
Test/TestCron.cpp | 2 +-
Test/TestCtsWaitCmd.cpp | 2 +-
Test/TestEcfNoScriptCmd.cpp | 2 +-
Test/TestEvents.cpp | 2 +-
Test/TestFileCmd.cpp | 2 +-
Test/TestHandle.cpp | 2 +-
Test/TestKillCmd.cpp | 2 +-
Test/TestLate.cpp | 10 +-
Test/TestLimit.cpp | 2 +-
Test/TestOrderCmd.cpp | 2 +-
Test/TestRepeat.cpp | 2 +-
Test/TestRequeueNode.cpp | 2 +-
Test/TestRunner.cpp | 2 +-
Test/TestServer.cpp | 2 +-
Test/TestSingle.cpp | 2 +-
Test/TestSuspend.cpp | 2 +-
Test/TestToday.cpp | 2 +-
Test/TestTrigger.cpp | 2 +-
Test/TestWhyCmd.cpp | 2 +-
Test/TestZombies.cpp | 16 +-
Test/Test_ECF_SCRIPT_CMD.cpp | 2 +-
Test/Test_Time.cpp | 2 +-
Test/src/ServerTestHarness.cpp | 2 +-
Test/src/ServerTestHarness.hpp | 2 +-
Test/src/TestFixture.cpp | 9 +-
Test/src/TestFixture.hpp | 2 +-
Test/src/ZombieUtil.hpp | 2 +-
Test/src/ZombieUtill.cpp | 2 +-
VERSION.cmake | 4 +-
Viewer/images/chain_closed.svg | 122 +
Viewer/images/chain_open.svg | 133 +
Viewer/images/cogwheel.svg | 93 +
Viewer/images/dock_max.svg | 96 +
Viewer/images/dock_max_disabled.svg | 96 +
Viewer/images/dock_restore.svg | 96 +
Viewer/images/icon_complete.svg | 33 +-
Viewer/images/icon_node_log.svg | 90 +-
Viewer/images/icon_rerun.svg | 169 +-
Viewer/images/icon_slow.svg | 92 +-
Viewer/images/node_log.svg | 46 +-
Viewer/images/server_log.svg | 22 +-
Viewer/scripts/CMakeLists.txt | 4 +-
Viewer/scripts/ecflow_test_ui.sh.in | 2 +-
Viewer/scripts/ecflow_ui.in | 58 +-
Viewer/scripts/generate_ui_test_scripts.sh | 2 +-
Viewer/src/AboutDialog.cpp | 4 +-
Viewer/src/AboutDialog.hpp | 2 +-
Viewer/src/AbstractNodeModel.cpp | 2 +-
Viewer/src/AbstractNodeModel.hpp | 21 +-
Viewer/src/AbstractSearchLine.cpp | 2 +-
Viewer/src/AbstractSearchLine.hpp | 2 +-
Viewer/src/AbstractTextEditSearchInterface.cpp | 2 +-
Viewer/src/AbstractTextEditSearchInterface.hpp | 4 +-
Viewer/src/ActionHandler.cpp | 88 +-
Viewer/src/ActionHandler.hpp | 2 +-
Viewer/src/Animation.cpp | 2 +-
Viewer/src/Animation.hpp | 2 +-
Viewer/src/AstCollateVNodesVisitor.cpp | 92 +-
Viewer/src/AstCollateVNodesVisitor.hpp | 11 +-
Viewer/src/AttributeEditor.cpp | 37 +-
Viewer/src/AttributeEditor.hpp | 5 +-
Viewer/src/AttributeEditorFactory.cpp | 2 +-
Viewer/src/AttributeEditorFactory.hpp | 2 +-
Viewer/src/AttributeSearchPanel.cpp | 239 +-
Viewer/src/AttributeSearchPanel.hpp | 2 +-
Viewer/src/AttributeView.hpp | 2 +-
Viewer/src/CMakeLists.txt | 45 +-
Viewer/src/CaseSensitiveButton.cpp | 2 +-
Viewer/src/CaseSensitiveButton.hpp | 2 +-
Viewer/src/ChangeNotify.cpp | 4 +-
Viewer/src/ChangeNotify.hpp | 2 +-
Viewer/src/ChangeNotifyDialog.cpp | 81 +-
Viewer/src/ChangeNotifyDialog.hpp | 6 +-
Viewer/src/ChangeNotifyEditor.cpp | 2 +-
Viewer/src/ChangeNotifyEditor.hpp | 2 +-
Viewer/src/ChangeNotifyModel.cpp | 2 +-
Viewer/src/ChangeNotifyModel.hpp | 2 +-
Viewer/src/ChangeNotifyWidget.cpp | 20 +-
Viewer/src/ChangeNotifyWidget.hpp | 2 +-
Viewer/src/CodeItemWidget.cpp | 7 +-
Viewer/src/CodeItemWidget.hpp | 4 +-
Viewer/src/CodeItemWidget.ui | 30 +-
Viewer/src/ComboMulti.cpp | 2 -
Viewer/src/CommandDesignerWidget.cpp | 9 +-
Viewer/src/CommandDesignerWidget.hpp | 4 +-
Viewer/src/CompactNodeView.cpp | 555 ++
Viewer/src/CompactNodeView.hpp | 103 +
Viewer/src/CompactNodeViewDelegate.cpp | 298 +
...istDelegate.hpp => CompactNodeViewDelegate.hpp} | 38 +-
Viewer/src/CompactView.cpp | 2161 ++++++
Viewer/src/CompactView.hpp | 216 +
Viewer/src/ConfigListDelegate.cpp | 9 +-
Viewer/src/ConfigListDelegate.hpp | 2 +-
Viewer/src/ConnectState.cpp | 2 +-
Viewer/src/ConnectState.hpp | 4 +-
Viewer/src/CustomCommandDialog.cpp | 2 +-
Viewer/src/CustomCommandDialog.hpp | 2 +-
Viewer/src/CustomCommandHandler.cpp | 40 +-
Viewer/src/CustomCommandHandler.hpp | 14 +-
Viewer/src/CustomListWidget.cpp | 2 +-
Viewer/src/CustomListWidget.hpp | 2 +-
Viewer/src/CustomTabWidget.cpp | 2 +-
Viewer/src/CustomTabWidget.hpp | 2 +-
Viewer/src/Dashboard.cpp | 124 +-
Viewer/src/Dashboard.hpp | 17 +-
Viewer/src/DashboardDialog.cpp | 17 +-
Viewer/src/DashboardDialog.hpp | 4 +-
Viewer/src/DashboardDialog.ui | 12 +
Viewer/src/DashboardDock.cpp | 81 +-
Viewer/src/DashboardDock.hpp | 8 +-
Viewer/src/DashboardDockTitleWidget.ui | 72 +-
Viewer/src/DashboardTitle.cpp | 7 +-
Viewer/src/DashboardTitle.hpp | 2 +-
Viewer/src/DashboardWidget.cpp | 74 +-
Viewer/src/DashboardWidget.hpp | 23 +-
Viewer/src/DirectoryHandler.cpp | 4 +-
Viewer/src/DirectoryHandler.hpp | 2 +-
Viewer/src/EditItemWidget.cpp | 2 +-
Viewer/src/EditItemWidget.hpp | 2 +-
Viewer/src/EditProvider.cpp | 5 +-
Viewer/src/EditProvider.hpp | 2 +-
Viewer/src/EditorInfoLabel.cpp | 2 +-
Viewer/src/EditorInfoLabel.hpp | 2 +-
Viewer/src/ExpandState.cpp | 151 +-
Viewer/src/ExpandState.hpp | 66 +-
Viewer/src/{VItem.cpp => ExpandStateNode.cpp} | 33 +-
Viewer/src/{Palette.hpp => ExpandStateNode.hpp} | 27 +-
Viewer/src/FileInfoLabel.cpp | 9 +-
Viewer/src/FileInfoLabel.hpp | 2 +-
Viewer/src/FileWatcher.cpp | 2 +-
Viewer/src/FileWatcher.hpp | 2 +-
Viewer/src/FilterWidget.cpp | 17 +-
Viewer/src/FilterWidget.hpp | 2 +-
Viewer/src/FlagSet.hpp | 2 +-
Viewer/src/FontMetrics.cpp | 58 +
Viewer/src/{FileWatcher.hpp => FontMetrics.hpp} | 35 +-
Viewer/src/GotoLineDialog.cpp | 2 +-
Viewer/src/GotoLineDialog.hpp | 2 +-
Viewer/src/Highlighter.cpp | 2 +-
Viewer/src/Highlighter.hpp | 2 +-
Viewer/src/HistoryItemWidget.cpp | 2 +-
Viewer/src/HistoryItemWidget.hpp | 2 +-
Viewer/src/HtmlItemWidget.cpp | 67 +
.../src/{CodeItemWidget.hpp => HtmlItemWidget.hpp} | 28 +-
.../src/{CodeItemWidget.ui => HtmlItemWidget.ui} | 74 +-
Viewer/src/IconProvider.cpp | 2 +-
Viewer/src/IconProvider.hpp | 2 +-
Viewer/src/InfoPanel.cpp | 134 +-
Viewer/src/InfoPanel.hpp | 9 +-
Viewer/src/InfoPanel.ui | 13 +-
Viewer/src/InfoPanelHandler.cpp | 11 +-
Viewer/src/InfoPanelHandler.hpp | 11 +-
Viewer/src/InfoPanelItem.cpp | 9 +-
Viewer/src/InfoPanelItem.hpp | 2 +-
Viewer/src/InfoPresenter.hpp | 2 +-
Viewer/src/InfoProvider.cpp | 6 +-
Viewer/src/InfoProvider.hpp | 8 +-
Viewer/src/InputEventLog.cpp | 2 +-
Viewer/src/InputEventLog.hpp | 2 +-
Viewer/src/JobItemWidget.cpp | 35 +-
Viewer/src/JobItemWidget.hpp | 5 +-
Viewer/src/LabelEditor.cpp | 2 +-
Viewer/src/LabelEditor.hpp | 2 +-
Viewer/src/LimitEditor.cpp | 155 +-
Viewer/src/LimitEditor.hpp | 14 +-
Viewer/src/LimitEditorWidget.ui | 150 +-
Viewer/src/LineEdit.cpp | 2 +-
Viewer/src/LineEdit.hpp | 2 +-
Viewer/src/LogModel.cpp | 10 +-
Viewer/src/LogModel.hpp | 2 +-
Viewer/src/LogProvider.cpp | 11 +-
Viewer/src/LogProvider.hpp | 2 +-
Viewer/src/LogServer.cpp | 252 -
Viewer/src/LogServer.hpp | 43 -
Viewer/src/LogTruncator.cpp | 7 +-
Viewer/src/LogTruncator.hpp | 2 +-
Viewer/src/MainWindow.cpp | 8 +-
Viewer/src/MainWindow.hpp | 2 +-
Viewer/src/ManualItemWidget.cpp | 37 +-
Viewer/src/ManualItemWidget.hpp | 5 +-
Viewer/src/MenuConfigDialog.cpp | 9 +-
Viewer/src/MenuConfigDialog.hpp | 2 +-
Viewer/src/MenuHandler.cpp | 81 +-
Viewer/src/MenuHandler.hpp | 37 +-
Viewer/src/MessageItemWidget.cpp | 2 +-
Viewer/src/MessageItemWidget.hpp | 2 +-
Viewer/src/MessageLabel.cpp | 4 +-
Viewer/src/MessageLabel.hpp | 2 +-
Viewer/src/MeterEditor.cpp | 2 +-
Viewer/src/MeterEditor.hpp | 2 +-
Viewer/src/ModelColumn.cpp | 2 +-
Viewer/src/ModelColumn.hpp | 2 +-
Viewer/src/NodeExpression.cpp | 13 +-
Viewer/src/NodeExpression.hpp | 25 +-
Viewer/src/NodeFilterDialog.cpp | 2 +-
Viewer/src/NodeFilterDialog.hpp | 2 +-
Viewer/src/NodeObserver.hpp | 2 +-
Viewer/src/NodePanel.cpp | 2 +-
Viewer/src/NodePanel.hpp | 2 +-
Viewer/src/NodePathWidget.cpp | 291 +-
Viewer/src/NodePathWidget.hpp | 51 +-
Viewer/src/NodeQuery.cpp | 15 +-
Viewer/src/NodeQuery.hpp | 2 +-
Viewer/src/NodeQueryCombo.cpp | 2 +-
Viewer/src/NodeQueryCombo.hpp | 2 +-
Viewer/src/NodeQueryEditor.cpp | 2 +-
Viewer/src/NodeQueryEditor.hpp | 2 +-
Viewer/src/NodeQueryEngine.cpp | 34 +-
Viewer/src/NodeQueryEngine.hpp | 2 +-
Viewer/src/NodeQueryHandler.cpp | 2 +-
Viewer/src/NodeQueryHandler.hpp | 2 +-
Viewer/src/NodeQueryOption.cpp | 2 +-
Viewer/src/NodeQueryOption.hpp | 2 +-
Viewer/src/NodeQueryOptionEdit.cpp | 2 +-
Viewer/src/NodeQueryOptionEdit.hpp | 2 +-
Viewer/src/NodeQueryResult.cpp | 2 +-
Viewer/src/NodeQueryResult.hpp | 2 +-
Viewer/src/NodeQueryResultModel.cpp | 4 +-
Viewer/src/NodeQueryResultModel.hpp | 2 +-
Viewer/src/NodeQueryResultTmp.hpp | 2 +-
Viewer/src/NodeQueryResultView.cpp | 2 +-
Viewer/src/NodeQueryResultView.hpp | 2 +-
Viewer/src/NodeQueryViewDelegate.cpp | 171 +-
Viewer/src/NodeQueryViewDelegate.hpp | 4 +-
Viewer/src/NodeSearchDialog.cpp | 2 +-
Viewer/src/NodeSearchDialog.hpp | 2 +-
Viewer/src/NodeSearchWidget.cpp | 7 +-
Viewer/src/NodeSearchWidget.hpp | 2 +-
Viewer/src/NodeViewBase.cpp | 2 +-
Viewer/src/NodeViewBase.hpp | 2 +-
Viewer/src/NodeViewDelegate.cpp | 927 +--
Viewer/src/NodeViewDelegate.hpp | 151 +-
Viewer/src/NodeWidget.cpp | 2 +-
Viewer/src/NodeWidget.hpp | 2 +-
Viewer/src/OneLineTextEdit.cpp | 2 +-
Viewer/src/OneLineTextEdit.hpp | 2 +-
Viewer/src/OutputBrowser.cpp | 5 +-
Viewer/src/OutputBrowser.hpp | 2 +-
Viewer/src/OutputCache.cpp | 2 +-
Viewer/src/OutputCache.hpp | 2 +-
Viewer/src/OutputClient.cpp | 2 +-
Viewer/src/OutputClient.hpp | 2 +-
Viewer/src/OutputDirClient.cpp | 7 +-
Viewer/src/OutputDirClient.hpp | 2 +-
Viewer/src/OutputDirProvider.cpp | 14 +-
Viewer/src/OutputDirProvider.hpp | 2 +-
Viewer/src/OutputFetchInfo.cpp | 2 +-
Viewer/src/OutputFetchInfo.hpp | 2 +-
Viewer/src/OutputFileClient.cpp | 2 +-
Viewer/src/OutputFileClient.hpp | 2 +-
Viewer/src/OutputFileProvider.cpp | 3 +-
Viewer/src/OutputFileProvider.hpp | 2 +-
Viewer/src/OutputItemWidget.cpp | 4 +-
Viewer/src/OutputItemWidget.hpp | 2 +-
Viewer/src/OutputModel.cpp | 4 +-
Viewer/src/OverviewItemWidget.cpp | 39 +-
Viewer/src/OverviewItemWidget.hpp | 5 +-
Viewer/src/OverviewProvider.cpp | 16 +-
Viewer/src/OverviewProvider.hpp | 2 +-
Viewer/src/Palette.cpp | 14 +-
Viewer/src/Palette.hpp | 5 +-
Viewer/src/PlainTextEdit.cpp | 2 +-
Viewer/src/PlainTextEdit.hpp | 2 +-
Viewer/src/PlainTextSearchInterface.cpp | 2 +-
Viewer/src/PlainTextSearchInterface.hpp | 2 +-
Viewer/src/PlainTextSearchLine.cpp | 2 +-
Viewer/src/PlainTextSearchLine.hpp | 4 +-
Viewer/src/PropertyDialog.cpp | 2 +-
Viewer/src/PropertyDialog.hpp | 2 +-
Viewer/src/PropertyEditor.cpp | 46 +-
Viewer/src/PropertyEditor.hpp | 4 +-
Viewer/src/PropertyLine.cpp | 47 +-
Viewer/src/PropertyLine.hpp | 17 +-
Viewer/src/PropertyMapper.cpp | 2 +-
Viewer/src/PropertyMapper.hpp | 2 +-
Viewer/src/RectMetrics.cpp | 60 +
.../src/{CustomTabWidget.hpp => RectMetrics.hpp} | 25 +-
Viewer/src/RepeatEditor.cpp | 57 +-
Viewer/src/RepeatEditor.hpp | 10 +-
Viewer/src/RichTextEdit.cpp | 89 +
Viewer/src/{LineEdit.hpp => RichTextEdit.hpp} | 37 +-
Viewer/src/RichTextSearchInterface.cpp | 231 +
...chInterface.hpp => RichTextSearchInterface.hpp} | 31 +-
Viewer/src/RichTextSearchLine.cpp | 32 +
...riggerTextWidget.hpp => RichTextSearchLine.hpp} | 24 +-
Viewer/src/SaveSessionAsDialog.cpp | 2 +-
Viewer/src/SaveSessionAsDialog.hpp | 2 +-
Viewer/src/ScriptItemWidget.cpp | 37 +-
Viewer/src/ScriptItemWidget.hpp | 5 +-
Viewer/src/ServerComQueue.cpp | 129 +-
Viewer/src/ServerComQueue.hpp | 5 +-
Viewer/src/ServerComThread.cpp | 23 +-
Viewer/src/ServerComThread.hpp | 5 +-
Viewer/src/ServerDefsAccess.cpp | 2 +-
Viewer/src/ServerDefsAccess.hpp | 2 +-
Viewer/src/ServerFilter.cpp | 4 +-
Viewer/src/ServerFilter.hpp | 2 +-
Viewer/src/ServerHandler.cpp | 71 +-
Viewer/src/ServerHandler.hpp | 2 +-
Viewer/src/ServerItem.cpp | 11 +-
Viewer/src/ServerItem.hpp | 2 +-
Viewer/src/ServerList.cpp | 188 +-
Viewer/src/ServerList.hpp | 12 +-
Viewer/src/ServerListDialog.cpp | 25 +-
Viewer/src/ServerListDialog.hpp | 2 +-
Viewer/src/ServerListSyncWidget.cpp | 2 +-
Viewer/src/ServerListSyncWidget.hpp | 2 +-
Viewer/src/ServerObserver.hpp | 2 +-
Viewer/src/ServerSettingsItemWidget.cpp | 2 +-
Viewer/src/ServerSettingsItemWidget.hpp | 2 +-
Viewer/src/SessionDialog.cpp | 2 +-
Viewer/src/SessionDialog.hpp | 2 +-
Viewer/src/SessionHandler.cpp | 16 +-
Viewer/src/SessionHandler.hpp | 27 +-
Viewer/src/SessionRenameDialog.cpp | 2 +-
Viewer/src/SessionRenameDialog.hpp | 2 +-
Viewer/src/Sound.cpp | 2 +-
Viewer/src/Sound.hpp | 2 +-
Viewer/src/StringMatchCombo.cpp | 2 +-
Viewer/src/StringMatchCombo.hpp | 2 +-
Viewer/src/StringMatchMode.cpp | 2 +-
Viewer/src/StringMatchMode.hpp | 2 +-
Viewer/src/SuiteFilter.cpp | 2 +-
Viewer/src/SuiteFilter.hpp | 2 +-
Viewer/src/SuiteFilterObserver.hpp | 2 +-
Viewer/src/SuiteItemWidget.cpp | 2 +-
Viewer/src/SuiteItemWidget.hpp | 2 +-
Viewer/src/SuiteModel.cpp | 5 +-
Viewer/src/TabWidget.cpp | 6 +-
Viewer/src/TabWidget.hpp | 2 +-
Viewer/src/TableFilterWidget.cpp | 2 +-
Viewer/src/TableFilterWidget.hpp | 2 +-
Viewer/src/TableNodeModel.cpp | 52 +-
Viewer/src/TableNodeModel.hpp | 2 +-
Viewer/src/TableNodeSortModel.cpp | 2 +-
Viewer/src/TableNodeSortModel.hpp | 2 +-
Viewer/src/TableNodeView.cpp | 9 +-
Viewer/src/TableNodeView.hpp | 2 +-
Viewer/src/TableNodeViewDelegate.cpp | 181 +-
Viewer/src/TableNodeViewDelegate.hpp | 5 +-
Viewer/src/TableNodeWidget.cpp | 30 +-
Viewer/src/TableNodeWidget.hpp | 2 +-
Viewer/src/TableNodeWidget.ui | 26 +-
Viewer/src/TextEditSearchLine.cpp | 2 +-
Viewer/src/TextEditSearchLine.hpp | 2 +-
Viewer/src/TextPager/TextPagerDocument.cpp | 22 +-
Viewer/src/TextPager/TextPagerEdit.cpp | 23 +-
Viewer/src/TextPager/TextPagerEdit.hpp | 2 +
.../src/TextPager/TextPagerSearchHighlighter.cpp | 2 +-
.../src/TextPager/TextPagerSearchHighlighter.hpp | 2 +-
Viewer/src/TextPager/TextPagerSearchInterface.cpp | 2 +-
Viewer/src/TextPager/TextPagerSearchInterface.hpp | 2 +-
Viewer/src/TextPager/TextPagerWidget.cpp | 2 +-
Viewer/src/TextPager/TextPagerWidget.hpp | 2 +-
Viewer/src/TimeItemWidget.cpp | 2 +-
Viewer/src/TimeItemWidget.hpp | 2 +-
Viewer/src/TreeNodeModel.cpp | 495 +-
Viewer/src/TreeNodeModel.hpp | 22 +-
Viewer/src/TreeNodeView.cpp | 140 +-
Viewer/src/TreeNodeView.hpp | 24 +-
Viewer/src/TreeNodeViewDelegate.cpp | 949 +--
Viewer/src/TreeNodeViewDelegate.hpp | 72 +-
Viewer/src/TreeNodeViewDelegateBase.cpp | 1128 +++
...ewDelegate.hpp => TreeNodeViewDelegateBase.hpp} | 45 +-
Viewer/src/TreeNodeWidget.cpp | 184 +-
Viewer/src/TreeNodeWidget.hpp | 23 +-
Viewer/src/TreeNodeWidget.ui | 28 +-
Viewer/src/TreeView.cpp | 2 +-
Viewer/src/TreeView.hpp | 2 +-
Viewer/src/TriggerBrowser.cpp | 2 +-
Viewer/src/TriggerBrowser.hpp | 2 +-
Viewer/src/TriggerCollector.cpp | 20 +-
Viewer/src/TriggerCollector.hpp | 38 +-
Viewer/src/TriggerEditor.cpp | 2 +-
Viewer/src/TriggerEditor.hpp | 2 +-
Viewer/src/TriggerItemWidget.cpp | 2 +-
Viewer/src/TriggerItemWidget.hpp | 2 +-
Viewer/src/TriggerProvider.cpp | 3 +-
Viewer/src/TriggerProvider.hpp | 2 +-
Viewer/src/TriggerTextWidget.cpp | 2 +-
Viewer/src/TriggerTextWidget.hpp | 2 +-
Viewer/src/TriggerView.cpp | 2 +-
Viewer/src/TriggerView.hpp | 2 +-
Viewer/src/TriggeredScanner.cpp | 2 +-
Viewer/src/TriggeredScanner.hpp | 2 +-
Viewer/src/UIDebug.cpp | 2 +-
Viewer/src/UIDebug.hpp | 2 +-
Viewer/src/UiLog.cpp | 31 +-
Viewer/src/UiLog.hpp | 15 +-
Viewer/src/UpdateTimer.cpp | 2 +-
Viewer/src/UpdateTimer.hpp | 2 +-
Viewer/src/UserMessage.cpp | 16 +-
Viewer/src/UserMessage.hpp | 2 +-
Viewer/src/VAttribute.cpp | 201 +-
Viewer/src/VAttribute.hpp | 32 +-
Viewer/src/VAttributeType.cpp | 2203 +-----
Viewer/src/VAttributeType.hpp | 53 +-
Viewer/src/VConfig.cpp | 6 +-
Viewer/src/VConfig.hpp | 8 +-
Viewer/src/VConfigLoader.cpp | 2 +-
Viewer/src/VConfigLoader.hpp | 2 +-
Viewer/src/VDateAttr.cpp | 151 +
Viewer/src/VDateAttr.hpp | 45 +
Viewer/src/VDir.cpp | 2 +-
Viewer/src/VDir.hpp | 2 +-
Viewer/src/VEventAttr.cpp | 112 +
Viewer/src/{FileWatcher.hpp => VEventAttr.hpp} | 39 +-
Viewer/src/VFile.cpp | 5 +-
Viewer/src/VFile.hpp | 2 +-
Viewer/src/VFileInfo.cpp | 2 +-
Viewer/src/VFileInfo.hpp | 2 +-
Viewer/src/VFilter.cpp | 161 +-
Viewer/src/VFilter.hpp | 33 +-
Viewer/src/VGenVarAttr.cpp | 109 +
Viewer/src/{FileWatcher.hpp => VGenVarAttr.hpp} | 37 +-
Viewer/src/VIcon.cpp | 31 +-
Viewer/src/VIcon.hpp | 3 +-
Viewer/src/VInfo.cpp | 101 +-
Viewer/src/VInfo.hpp | 6 +-
Viewer/src/VItem.cpp | 2 +-
Viewer/src/VItem.hpp | 5 +-
Viewer/src/VItemPathParser.cpp | 9 +-
Viewer/src/VItemPathParser.hpp | 6 +-
Viewer/src/VItemTmp.hpp | 38 -
Viewer/src/VLabelAttr.cpp | 131 +
Viewer/src/{FileWatcher.hpp => VLabelAttr.hpp} | 40 +-
Viewer/src/VLateAttr.cpp | 98 +
Viewer/src/VLateAttr.hpp | 27 +
Viewer/src/VLimitAttr.cpp | 159 +
Viewer/src/VLimitAttr.hpp | 42 +
Viewer/src/VLimiterAttr.cpp | 117 +
Viewer/src/{FileWatcher.hpp => VLimiterAttr.hpp} | 37 +-
Viewer/src/VMeterAttr.cpp | 114 +
Viewer/src/{FileWatcher.hpp => VMeterAttr.hpp} | 38 +-
Viewer/src/VModelData.cpp | 251 +-
Viewer/src/VModelData.hpp | 11 +-
Viewer/src/VNState.cpp | 2 +-
Viewer/src/VNState.hpp | 2 +-
Viewer/src/VNode.cpp | 416 +-
Viewer/src/VNode.hpp | 88 +-
Viewer/src/VNodeList.cpp | 2 +-
Viewer/src/VNodeList.hpp | 2 +-
Viewer/src/VParam.cpp | 168 +-
Viewer/src/VParam.hpp | 5 +-
Viewer/src/VProperty.cpp | 8 +-
Viewer/src/VProperty.hpp | 6 +-
Viewer/src/VRepeat.cpp | 215 -
Viewer/src/VRepeat.hpp | 94 -
Viewer/src/VRepeatAttr.cpp | 418 ++
Viewer/src/VRepeatAttr.hpp | 107 +
Viewer/src/VReply.cpp | 2 +-
Viewer/src/VReply.hpp | 6 +-
Viewer/src/VSState.cpp | 2 +-
Viewer/src/VSState.hpp | 2 +-
Viewer/src/VServerSettings.cpp | 2 +-
Viewer/src/VServerSettings.hpp | 2 +-
Viewer/src/VSettings.cpp | 12 +-
Viewer/src/VSettings.hpp | 2 +-
Viewer/src/VTask.cpp | 9 +-
Viewer/src/VTask.hpp | 8 +-
Viewer/src/VTaskNode.cpp | 2 +-
Viewer/src/VTaskNode.hpp | 2 +-
Viewer/src/VTaskObserver.hpp | 2 +-
Viewer/src/VTimeAttr.cpp | 190 +
Viewer/src/VTimeAttr.hpp | 48 +
Viewer/src/VTree.cpp | 13 +-
Viewer/src/VTree.hpp | 2 +-
Viewer/src/VTriggerAttr.cpp | 139 +
Viewer/src/VTriggerAttr.hpp | 40 +
Viewer/src/VUserVarAttr.cpp | 144 +
Viewer/src/{FileWatcher.hpp => VUserVarAttr.hpp} | 38 +-
Viewer/src/VariableItemWidget.cpp | 84 +-
Viewer/src/VariableItemWidget.hpp | 2 +-
Viewer/src/VariableModel.cpp | 106 +-
Viewer/src/VariableModel.hpp | 3 -
Viewer/src/VariableModelData.cpp | 60 +-
Viewer/src/VariableModelData.hpp | 7 +-
Viewer/src/VariableModelDataObserver.hpp | 2 +-
Viewer/src/VariableSearchLine.cpp | 2 +-
Viewer/src/VariableSearchLine.hpp | 2 +-
Viewer/src/VariableView.cpp | 9 +-
Viewer/src/VariableView.hpp | 2 +-
Viewer/src/Viewer.hpp | 2 +-
Viewer/src/ViewerMain.cpp | 36 +-
Viewer/src/WhyItemWidget.cpp | 154 +-
Viewer/src/WhyItemWidget.hpp | 11 +-
Viewer/src/WidgetNameProvider.cpp | 27 +-
Viewer/src/WidgetNameProvider.hpp | 2 +-
Viewer/src/ZombieItemWidget.cpp | 549 +-
Viewer/src/ZombieItemWidget.hpp | 136 +-
Viewer/src/ZombieModel.cpp | 35 +-
Viewer/src/ZombieModel.hpp | 1 +
Viewer/src/trigger.css | 4 +-
Viewer/src/viewer.qrc | 6 +
build_scripts/aix_fix/README | 2 +-
build_scripts/boost_1_47_fix.sh | 2 +-
build_scripts/boost_1_48_fix.sh | 2 +-
build_scripts/boost_1_51_fix.sh | 2 +-
build_scripts/boost_1_53_fix.sh | 2 +-
build_scripts/boost_1_56_fix.sh | 2 +-
build_scripts/boost_1_57_fix.sh | 2 +-
build_scripts/boost_build.sh | 12 +-
build_scripts/clean.sh | 2 +-
build_scripts/hpux_fix/README | 2 +-
build_scripts/kill_ecf.sh | 2 +-
build_scripts/massif.sh | 2 +-
build_scripts/profile.sh | 2 +-
build_scripts/rmbin.sh | 2 +-
build_scripts/site_config/site-config-AIX.jam | 30 +-
build_scripts/site_config/site-config-HPUX.jam | 36 +-
build_scripts/site_config/site-config-Linux.jam | 22 +-
.../site_config/site-config-Linux64-clang.jam | 2 +-
.../site_config/site-config-Linux64-intel.jam | 2 +-
build_scripts/site_config/site-config-Linux64.jam | 2 +-
build_scripts/site_config/site-config-cray.jam | 2 +-
build_scripts/tar_ecflow.sh | 2 +-
build_scripts/test.sh | 2 +-
build_scripts/update_site_config.sh | 2 +-
build_scripts/val.sh | 2 +-
cmake.sh | 58 +-
cmake/FindADSM.cmake | 2 +-
cmake/FindAEC.cmake | 2 +-
cmake/FindAIO.cmake | 2 +-
cmake/FindArmadillo.cmake | 2 +-
cmake/FindCMath.cmake | 2 +-
cmake/FindDl.cmake | 2 +-
cmake/FindEMOS.cmake | 2 +-
cmake/FindFDB.cmake | 2 +-
cmake/FindFFTW.cmake | 2 +-
cmake/FindGeoTIFF.cmake | 2 +-
cmake/FindHPSS.cmake | 2 +-
cmake/FindLEX.cmake | 2 +-
cmake/FindLibGFortran.cmake | 2 +-
cmake/FindLibIFort.cmake | 2 +-
cmake/FindLustreAPI.cmake | 43 +
cmake/FindMKL.cmake | 2 +-
cmake/FindNDBM.cmake | 2 +-
cmake/FindNetCDF.cmake | 2 +-
cmake/FindNetCDF3.cmake | 2 +-
cmake/FindODB.cmake | 2 +-
cmake/FindOpenCL.cmake | 2 +-
cmake/FindOpenJPEG.cmake | 2 +-
cmake/FindPGIFortran.cmake | 2 +-
cmake/FindPango.cmake | 2 +-
cmake/FindPangoCairo.cmake | 2 +-
cmake/FindREADLINE.cmake | 2 +-
cmake/FindRPCGEN.cmake | 2 +-
cmake/FindRealtime.cmake | 2 +-
cmake/FindSZip.cmake | 2 +-
cmake/FindTrilinos.cmake | 2 +-
cmake/FindViennaCL.cmake | 2 +-
cmake/FindXLFortranLibs.cmake | 2 +-
cmake/FindYACC.cmake | 2 +-
cmake/Findgrib_api.cmake | 2 +-
cmake/Findodb_api.cmake | 2 +-
cmake/Findspot.cmake | 2 +-
cmake/VERSION.cmake | 4 +-
cmake/compiler_flags/Clang_C.cmake | 2 +-
cmake/compiler_flags/Clang_CXX.cmake | 2 +-
cmake/compiler_flags/Cray_C.cmake | 2 +-
cmake/compiler_flags/Cray_CXX.cmake | 2 +-
cmake/compiler_flags/Cray_Fortran.cmake | 2 +-
cmake/compiler_flags/GNU_C.cmake | 2 +-
cmake/compiler_flags/GNU_CXX.cmake | 2 +-
cmake/compiler_flags/GNU_Fortran.cmake | 2 +-
cmake/compiler_flags/Intel_C.cmake | 2 +-
cmake/compiler_flags/Intel_CXX.cmake | 2 +-
cmake/compiler_flags/Intel_Fortran.cmake | 2 +-
cmake/compiler_flags/PGI_C.cmake | 2 +-
cmake/compiler_flags/PGI_CXX.cmake | 2 +-
cmake/compiler_flags/PGI_Fortran.cmake | 2 +-
cmake/ecbuild-config-version.cmake | 2 +-
cmake/ecbuild-config.cmake | 10 +-
cmake/ecbuild_add_c_flags.cmake | 2 +-
cmake/ecbuild_add_cxx11_flags.cmake | 2 +-
cmake/ecbuild_add_cxx_flags.cmake | 2 +-
cmake/ecbuild_add_executable.cmake | 70 +-
cmake/ecbuild_add_extra_search_paths.cmake | 2 +-
cmake/ecbuild_add_fortran_flags.cmake | 2 +-
cmake/ecbuild_add_library.cmake | 80 +-
cmake/ecbuild_add_option.cmake | 71 +-
cmake/ecbuild_add_persistent.cmake | 2 +-
cmake/ecbuild_add_resources.cmake | 2 +-
cmake/ecbuild_add_test.cmake | 2 +-
cmake/ecbuild_append_to_rpath.cmake | 2 +-
cmake/ecbuild_bundle.cmake | 21 +-
cmake/ecbuild_cache.cmake | 2 +-
cmake/ecbuild_check_c_source_return.cmake | 2 +-
cmake/ecbuild_check_compiler.cmake | 2 +-
cmake/ecbuild_check_cxx11.cmake | 2 +-
cmake/ecbuild_check_cxx_source_return.cmake | 2 +-
cmake/ecbuild_check_fortran.cmake | 2 +-
cmake/ecbuild_check_fortran_source_return.cmake | 2 +-
cmake/ecbuild_check_functions.cmake | 2 +-
cmake/ecbuild_check_os.cmake | 335 +-
cmake/ecbuild_compiler_flags.cmake | 8 +-
cmake/ecbuild_config.h.in | 2 +-
cmake/ecbuild_declare_project.cmake | 2 +-
cmake/ecbuild_define_build_types.cmake | 2 +-
cmake/ecbuild_define_libs_and_execs_target.cmake | 2 +-
cmake/ecbuild_define_links_target.cmake | 2 +-
cmake/ecbuild_define_options.cmake | 2 +-
cmake/ecbuild_define_paths.cmake | 2 +-
cmake/ecbuild_dont_pack.cmake | 2 +-
cmake/ecbuild_download_resource.cmake | 34 +-
cmake/ecbuild_echo_targets.cmake | 2 +-
cmake/ecbuild_enable_fortran.cmake | 10 +-
cmake/ecbuild_features.cmake | 43 +-
cmake/ecbuild_find_fortranlibs.cmake | 2 +-
cmake/ecbuild_find_lexyacc.cmake | 2 +-
cmake/ecbuild_find_mpi.cmake | 2 +-
cmake/ecbuild_find_omp.cmake | 2 +-
cmake/ecbuild_find_package.cmake | 81 +-
cmake/ecbuild_find_perl.cmake | 2 +-
cmake/ecbuild_find_python.cmake | 55 +-
cmake/ecbuild_generate_config_headers.cmake | 2 +-
cmake/ecbuild_generate_fortran_interfaces.cmake | 2 +-
cmake/ecbuild_generate_rpc.cmake | 2 +-
cmake/ecbuild_generate_yy.cmake | 2 +-
cmake/ecbuild_get_cxx11_flags.cmake | 2 +-
cmake/ecbuild_get_date.cmake | 2 +-
cmake/ecbuild_get_resources.cmake | 2 +-
cmake/ecbuild_get_test_data.cmake | 21 +-
cmake/ecbuild_git.cmake | 2 +-
cmake/ecbuild_install_project.cmake | 37 +-
cmake/ecbuild_list_add_pattern.cmake | 2 +-
cmake/ecbuild_list_exclude_pattern.cmake | 2 +-
cmake/ecbuild_list_extra_search_paths.cmake | 2 +-
cmake/ecbuild_list_macros.cmake | 2 +-
cmake/ecbuild_log.cmake | 46 +-
cmake/ecbuild_pkgconfig.cmake | 2 +-
cmake/ecbuild_policies.cmake | 2 +-
cmake/ecbuild_print_summary.cmake | 18 +-
cmake/ecbuild_project_files.cmake | 2 +-
cmake/ecbuild_remove_fortran_flags.cmake | 2 +-
cmake/ecbuild_requires_macro_version.cmake | 2 +-
cmake/ecbuild_separate_sources.cmake | 26 +-
cmake/ecbuild_source_flags.cmake | 2 +-
cmake/ecbuild_system.cmake | 14 +-
cmake/ecbuild_target_flags.cmake | 2 +-
cmake/ecbuild_use_package.cmake | 57 +-
cmake/ecbuild_version.h.in | 2 +-
cmake/ecbuild_warn_unused_files.cmake | 2 +-
cmake/gen_source_flags.py | 2 +-
cmake/include/ecbuild/boost_test_framework.h | 2 +-
cmake/sg.pl | 2 +-
share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake | 14 +-
share/ecbuild/toolchains/ecmwf-XC30-GNU.cmake | 14 +-
share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake | 14 +-
...wf-XC30-Intel.cmake => ichec-fionn-Intel.cmake} | 28 +-
share/ecflow/etc/ecflowview_attribute_conf.json | 24 +-
share/ecflow/etc/ecflowview_gui.json | 40 +-
share/ecflow/etc/ecflowview_highlighter.json | 2 +-
share/ecflow/etc/ecflowview_menus.json | 14 +-
share/ecflow/etc/ecflowview_notification_conf.json | 18 +-
share/ecflow/etc/ecflowview_panels.json | 24 +-
share/ecflow/etc/ecflowview_view_conf.json | 65 +-
share/ecflow/etc/viewer.qss | 13 +-
tools/ecf_cmd | 2 +-
tools/ecflow_load.sh | 2 +-
tools/ecflow_logsvr.pl | Bin 2981 -> 2980 bytes
tools/ecflow_logsvr.sh | 2 +-
tools/ecflow_start.sh | 2 +-
tools/ecflow_stop.sh | 2 +-
tools/noconnect.sh | 2 +-
view/Jamfile.jam | 2 +-
view/src/ArrayP.h | 2 +-
view/src/Hyper.c | 4 +-
view/src/Hyper.h | 2 +-
view/src/HyperP.h | 2 +-
view/src/SimpleBase.c | 2 +-
view/src/SimpleBase.h | 2 +-
view/src/SimpleBaseP.h | 2 +-
view/src/SimpleGraph.c | 2 +-
view/src/SimpleGraph.h | 2 +-
view/src/SimpleGraphP.h | 2 +-
view/src/SimpleTime.c | 52 +-
view/src/SimpleTime.h | 2 +-
view/src/SimpleTimeP.h | 2 +-
view/src/SimpleTree.c | 2 +-
view/src/SimpleTree.h | 2 +-
view/src/SimpleTreeP.h | 2 +-
view/src/Tab.c | 2 +-
view/src/Tab.h | 2 +-
view/src/TabP.h | 2 +-
view/src/aborted.cc | 2 +-
view/src/aborted.h | 2 +-
view/src/alerts.cc | 2 +-
view/src/alias.cc | 2 +-
view/src/arch.h | 2 +-
view/src/array.cc | 2 +-
view/src/array.h | 2 +-
view/src/ask.cc | 2 +-
view/src/ask.h | 2 +-
view/src/autoAlarm.h | 2 +-
view/src/auto_alarm.cc | 2 +-
view/src/auto_alarm.h | 2 +-
view/src/base.cc | 2 +-
view/src/base.h | 2 +-
view/src/bool.h | 2 +-
view/src/choice.h | 2 +-
view/src/collector.cc | 2 +-
view/src/collector.h | 2 +-
view/src/colors_prefs.cc | 2 +-
view/src/colors_prefs.h | 2 +-
view/src/configurable.cc | 2 +-
view/src/configurable.h | 2 +-
view/src/configurator.h | 2 +-
view/src/confirm.cc | 2 +-
view/src/confirm.h | 2 +-
view/src/counted.cc | 2 +-
view/src/counted.h | 2 +-
view/src/date.cc | 2 +-
view/src/date.h | 2 +-
view/src/depend.cc | 2 +-
view/src/depend.h | 2 +-
view/src/dialog.cc | 2 +-
view/src/dialog.h | 2 +-
view/src/directory.cc | 2 +-
view/src/directory.h | 2 +-
view/src/doer.sh | 2 +-
view/src/dummy_node.cc | 2 +-
view/src/dummy_node.h | 2 +-
view/src/ecf_node.cc | 7 +-
view/src/ecf_node.h | 8 +-
view/src/ecflow.cc | 2 +-
view/src/ecflow.h | 2 +-
view/src/ecflowview.cc | 2 +-
view/src/ecflowview.h | 2 +-
view/src/ecflowview.menu | 2 +-
view/src/ecflowview.menu.h | 2 +-
view/src/edit.cc | 6 +-
view/src/edit.h | 2 +-
view/src/edit_label.cc | 2 +-
view/src/edit_label.h | 2 +-
view/src/edit_limit.cc | 2 +-
view/src/edit_limit.h | 2 +-
view/src/edit_meter.cc | 2 +-
view/src/edit_meter.h | 2 +-
view/src/edit_repeat.cc | 2 +-
view/src/edit_repeat.h | 2 +-
view/src/edit_variable.cc | 2 +-
view/src/edit_variable.h | 2 +-
view/src/editor.cc | 2 +-
view/src/editor.h | 2 +-
view/src/error.cc | 2 +-
view/src/error.h | 2 +-
view/src/eval.h | 2 +-
view/src/event_node.cc | 2 +-
view/src/event_node.h | 2 +-
view/src/events.h | 2 +-
view/src/extent.h | 2 +-
view/src/external.cc | 2 +-
view/src/external.h | 2 +-
view/src/find.cc | 2 +-
view/src/find.h | 2 +-
view/src/flags.cc | 2 +-
view/src/flags.h | 2 +-
view/src/fonts_prefs.cc | 2 +-
view/src/fonts_prefs.h | 2 +-
view/src/fsb.cc | 2 +-
view/src/fsb.h | 2 +-
view/src/gen_translator.h | 2 +-
view/src/globals.cc | 2 +-
view/src/globals.h | 2 +-
view/src/graph_layout.cc | 2 +-
view/src/graph_layout.h | 2 +-
view/src/gui.cc | 2 +-
view/src/gui.h | 2 +-
view/src/history.cc | 2 +-
view/src/history.h | 2 +-
view/src/host.cc | 2 +-
view/src/host.h | 2 +-
view/src/host_prefs.cc | 2 +-
view/src/host_prefs.h | 2 +-
view/src/html_lister.cc | 2 +-
view/src/html_lister.h | 2 +-
view/src/http.cc | 2 +-
view/src/http.h | 2 +-
view/src/hyper_lister.cc | 2 +-
view/src/hyper_lister.h | 2 +-
view/src/icon_Josstatus3.cc | 2 +-
view/src/icon_W.cc | 2 +-
view/src/info.cc | 2 +-
view/src/info.h | 2 +-
view/src/init.cc | 2 +-
view/src/init.h | 2 +-
view/src/inlimit_node.cc | 2 +-
view/src/inlimit_node.h | 2 +-
view/src/input.cc | 2 +-
view/src/input.h | 2 +-
view/src/interface.cc | 2 +-
view/src/interface.h | 2 +-
view/src/job.cc | 2 +-
view/src/job.h | 2 +-
view/src/jobcheck_panel.cc | 2 +-
view/src/jobcheck_panel.h | 2 +-
view/src/jobstatus.cc | 2 +-
view/src/jobstatus.h | 2 +-
view/src/label.cc | 2 +-
view/src/label_node.h | 2 +-
view/src/late.cc | 2 +-
view/src/late.h | 2 +-
view/src/late_node.cc | 2 +-
view/src/late_node.h | 2 +-
view/src/layout.cc | 2 +-
view/src/layout.h | 2 +-
view/src/lexyacc.h | 2 +-
view/src/libicon/icon_Apply.cc | 2 +-
view/src/libicon/icon_Apply.xpm | 2 +-
view/src/libicon/icon_Chat.cc | 2 +-
view/src/libicon/icon_Chat.xpm | 2 +-
view/src/libicon/icon_Check.cc | 2 +-
view/src/libicon/icon_Check.xpm | 2 +-
view/src/libicon/icon_Edit.cc | 2 +-
view/src/libicon/icon_Edit.xpm | 2 +-
view/src/libicon/icon_Info.cc | 2 +-
view/src/libicon/icon_Info.xpm | 2 +-
view/src/libicon/icon_Jobstatus.cc | 2 +-
view/src/libicon/icon_Jobstatus.xpm | 2 +-
view/src/libicon/icon_Josstatus3.xpm | 2 +-
view/src/libicon/icon_Load.cc | 2 +-
view/src/libicon/icon_Load.xpm | 2 +-
view/src/libicon/icon_Manual.cc | 2 +-
view/src/libicon/icon_Manual.xpm | 2 +-
view/src/libicon/icon_Merge.cc | 2 +-
view/src/libicon/icon_Merge.xpm | 2 +-
view/src/libicon/icon_Messages.cc | 2 +-
view/src/libicon/icon_Messages.xpm | 2 +-
view/src/libicon/icon_Output.cc | 2 +-
view/src/libicon/icon_Output.xpm | 2 +-
view/src/libicon/icon_QuickFind.cc | 2 +-
view/src/libicon/icon_QuickFind.xpm | 2 +-
view/src/libicon/icon_Script.cc | 2 +-
view/src/libicon/icon_Script.xpm | 2 +-
view/src/libicon/icon_Search.cc | 2 +-
view/src/libicon/icon_Search.xpm | 2 +-
view/src/libicon/icon_Status.cc | 2 +-
view/src/libicon/icon_Status.xpm | 2 +-
view/src/libicon/icon_Submit.cc | 2 +-
view/src/libicon/icon_Submit.xpm | 2 +-
view/src/libicon/icon_Time_line.cc | 2 +-
view/src/libicon/icon_Time_line.xpm | 2 +-
view/src/libicon/icon_Triggers.cc | 2 +-
view/src/libicon/icon_Triggers.xpm | 2 +-
view/src/libicon/icon_Update.cc | 2 +-
view/src/libicon/icon_Update.xpm | 2 +-
view/src/libicon/icon_Use_external_editor.cc | 2 +-
view/src/libicon/icon_Use_external_editor.xpm | 2 +-
view/src/libicon/icon_Use_external_viewer.cc | 2 +-
view/src/libicon/icon_Use_external_viewer.xpm | 2 +-
view/src/libicon/icon_Variables.cc | 2 +-
view/src/libicon/icon_Variables.xpm | 2 +-
view/src/libicon/icon_W.xpm | 2 +-
view/src/libicon/icon_Why_.cc | 2 +-
view/src/libicon/icon_Z.cc | 2 +-
view/src/libicon/icon_calendar.cc | 2 +-
view/src/libicon/icon_calendar.xpm | 2 +-
view/src/libicon/icon_clock.cc | 2 +-
view/src/libicon/icon_clock.xpm | 2 +-
view/src/libicon/icon_clock_free.cc | 2 +-
view/src/libicon/icon_complete.cc | 2 +-
view/src/libicon/icon_complete.xpm | 2 +-
view/src/libicon/icon_defstatus.cc | 2 +-
view/src/libicon/icon_defstatus.xpm | 2 +-
view/src/libicon/icon_folded.cc | 2 +-
view/src/libicon/icon_folded.xpm | 2 +-
view/src/libicon/icon_late.cc | 2 +-
view/src/libicon/icon_late.xpm | 2 +-
view/src/libicon/icon_limit0.cc | 2 +-
view/src/libicon/icon_limit0.xpm | 2 +-
view/src/libicon/icon_limit1.cc | 2 +-
view/src/libicon/icon_limit1.xpm | 2 +-
view/src/libicon/icon_limit2.cc | 2 +-
view/src/libicon/icon_limit2.xpm | 2 +-
view/src/libicon/icon_locked.cc | 2 +-
view/src/libicon/icon_locked.xpm | 2 +-
view/src/libicon/icon_memo.cc | 2 +-
view/src/libicon/icon_memo.xpm | 2 +-
view/src/libicon/icon_message.cc | 2 +-
view/src/libicon/icon_message.xpm | 2 +-
view/src/libicon/icon_migrated.cc | 2 +-
view/src/libicon/icon_migrated.xpm | 2 +-
view/src/libicon/icon_noway.cc | 2 +-
view/src/libicon/icon_noway.xpm | 2 +-
view/src/libicon/icon_rerun.cc | 2 +-
view/src/libicon/icon_rerun.xpm | 2 +-
view/src/libicon/icon_waiting.cc | 2 +-
view/src/libicon/icon_waiting.xpm | 2 +-
view/src/libui/uiask.cc | 1 -
view/src/libui/uicollector.cc | 1 -
view/src/libui/uicolors.cc | 1 -
view/src/libui/uiconfirm.cc | 1 -
view/src/libui/uidepend.cc | 1 -
view/src/libui/uiedit.cc | 1 -
view/src/libui/uiedit_label.cc | 1 -
view/src/libui/uiedit_limit.cc | 1 -
view/src/libui/uiedit_meter.cc | 1 -
view/src/libui/uiedit_repeat.cc | 1 -
view/src/libui/uiedit_variable.cc | 1 -
view/src/libui/uifind.cc | 1 -
view/src/libui/uifonts.cc | 1 -
view/src/libui/uifsb.cc | 1 -
view/src/libui/uihistory.cc | 1 -
view/src/libui/uiinfo.cc | 1 -
view/src/libui/uijob.cc | 1 -
view/src/libui/uijobcheck.cc | 1 -
view/src/libui/uijobstatus.cc | 3 +-
view/src/libui/uijobstatus.h | 2 +-
view/src/libui/uimail.cc | 1 -
view/src/libui/uimanual.cc | 1 -
view/src/libui/uimenu.cc | 1 -
view/src/libui/uimessages.cc | 1 -
view/src/libui/uinode_alert.cc | 1 -
view/src/libui/uioption.cc | 2 -
view/src/libui/uioutput.cc | 1 -
view/src/libui/uipanel.cc | 1 -
view/src/libui/uipasswd.cc | 1 -
view/src/libui/uipref.cc | 1 -
view/src/libui/uiscript.cc | 1 -
view/src/libui/uisearch.cc | 1 -
view/src/libui/uiservers.cc | 1 -
view/src/libui/uisuites.cc | 1 -
view/src/libui/uitimetable.cc | 1 -
view/src/libui/uitip.cc | 1 -
view/src/libui/uitop.cc | 1 -
view/src/libui/uitree.cc | 1 -
view/src/libui/uitriggers.cc | 2 -
view/src/libui/uiuser.cc | 1 -
view/src/libui/uiusers.cc | 1 -
view/src/libui/uivariables.cc | 1 -
view/src/libui/uiwhy.cc | 1 -
view/src/libui/uizombies.cc | 1 -
view/src/libxec/xec_Cursor.c | 2 +-
view/src/libxec/xec_Label.c | 2 +-
view/src/libxec/xec_List.c | 2 +-
view/src/libxec/xec_Regexp.c | 2 +-
view/src/libxec/xec_Strings.c | 2 +-
view/src/libxec/xec_Text.c | 2 +-
view/src/libxec/xec_Toggle.c | 2 +-
view/src/libxec/xec_Widget.c | 2 +-
view/src/limit_node.cc | 2 +-
view/src/limit_node.h | 2 +-
view/src/line.c | 2 +-
view/src/lister.cc | 2 +-
view/src/lister.h | 2 +-
view/src/log_event.cc | 33 +-
view/src/log_event.h | 2 +-
view/src/log_file.h | 2 +-
view/src/logsvr.cc | 2 +-
view/src/logsvr.h | 2 +-
view/src/mail.cc | 2 +-
view/src/mail.h | 2 +-
view/src/manual.cc | 2 +-
view/src/manual.h | 2 +-
view/src/menu2c.sh | 2 +-
view/src/menu_prefs.cc | 2 +-
view/src/menu_prefs.h | 2 +-
view/src/menul.c | 2 +-
view/src/menul.l | 2 +-
view/src/menus.cc | 2 +-
view/src/menus.h | 2 +-
view/src/menuy.y | 2 +-
view/src/messages.cc | 2 +-
view/src/messages.h | 2 +-
view/src/meter_node.cc | 2 +-
view/src/meter_node.h | 2 +-
view/src/node.cc | 2 +-
view/src/node.h | 2 +-
view/src/node_alert.cc | 2 +-
view/src/node_alert.h | 2 +-
view/src/node_editor.cc | 2 +-
view/src/node_editor.h | 2 +-
view/src/node_list.cc | 2 +-
view/src/node_list.h | 2 +-
view/src/node_lister.h | 2 +-
view/src/node_window.cc | 2 +-
view/src/node_window.h | 2 +-
view/src/not_enqueued.cc | 2 +-
view/src/not_enqueued.h | 2 +-
view/src/observable.cc | 2 +-
view/src/observable.h | 2 +-
view/src/observer.cc | 2 +-
view/src/observer.h | 2 +-
view/src/opener.h | 2 +-
view/src/option.cc | 2 +-
view/src/option.h | 2 +-
view/src/option_panel.cc | 2 +-
view/src/option_panel.h | 2 +-
view/src/output.cc | 2 +-
view/src/output.h | 2 +-
view/src/panel.cc | 2 +-
view/src/panel.h | 2 +-
view/src/panel_factories.h | 2 +-
view/src/panel_window.cc | 2 +-
view/src/panel_window.h | 2 +-
view/src/parser.cc | 2 +-
view/src/parser.h | 2 +-
view/src/passwrd.cc | 2 +-
view/src/passwrd.h | 2 +-
view/src/persist.cc | 2 +-
view/src/persist.h | 2 +-
view/src/pixmap.cc | 2 +-
view/src/pixmap.h | 2 +-
view/src/pref_editor.cc | 2 +-
view/src/pref_editor.h | 2 +-
view/src/pref_window.cc | 2 +-
view/src/pref_window.h | 2 +-
view/src/prefs.cc | 2 +-
view/src/prefs.h | 2 +-
view/src/re.h | 2 +-
view/src/reach.cc | 2 +-
view/src/reach.h | 2 +-
view/src/relation.cc | 2 +-
view/src/relation.h | 2 +-
view/src/repeat.h | 2 +-
view/src/repeat_node.cc | 2 +-
view/src/repeat_node.h | 2 +-
view/src/resource.cc | 2 +-
view/src/resource.h | 2 +-
view/src/restart.cc | 2 +-
view/src/restart.h | 2 +-
view/src/result.cc | 2 +-
view/src/result.h | 2 +-
view/src/runnable.cc | 2 +-
view/src/runnable.h | 2 +-
view/src/script_panel.cc | 2 +-
view/src/script_panel.h | 2 +-
view/src/scripting.cc | 2 +-
view/src/scripting.h | 2 +-
view/src/search.cc | 2 +-
view/src/search.h | 2 +-
view/src/searchable.cc | 2 +-
view/src/searchable.h | 2 +-
view/src/selection.cc | 2 +-
view/src/selection.h | 2 +-
view/src/server.cc | 2 +-
view/src/server.h | 2 +-
view/src/servers_prefs.cc | 2 +-
view/src/servers_prefs.h | 2 +-
view/src/show.cc | 2 +-
view/src/show.h | 2 +-
view/src/simple_node.cc | 24 +-
view/src/simple_node.h | 2 +-
view/src/singleton.h | 2 +-
view/src/str.cc | 2 +-
view/src/str.h | 2 +-
view/src/substitute.cc | 2 +-
view/src/substitute.h | 2 +-
view/src/suites_panel.cc | 2 +-
view/src/suites_panel.h | 2 +-
view/src/super_node.cc | 2 +-
view/src/super_node.h | 2 +-
view/src/task_node.cc | 2 +-
view/src/task_node.h | 2 +-
view/src/text_layout.cc | 2 +-
view/src/text_layout.h | 2 +-
view/src/text_lister.h | 2 +-
view/src/text_window.cc | 2 +-
view/src/text_window.h | 2 +-
view/src/time.cc | 2 +-
view/src/time_node.h | 2 +-
view/src/timeout.cc | 2 +-
view/src/timeout.h | 2 +-
view/src/timetable_panel.cc | 68 +-
view/src/timetable_panel.h | 2 +-
view/src/tip.cc | 2 +-
view/src/tip.h | 2 +-
view/src/tmp_file.cc | 2 +-
view/src/tmp_file.h | 2 +-
view/src/tmpnam.c | 2 +-
view/src/to_check.h | 2 +-
view/src/top.cc | 2 +-
view/src/top.h | 2 +-
view/src/translator.cc | 2 +-
view/src/translator.h | 2 +-
view/src/tree.cc | 2 +-
view/src/tree.h | 2 +-
view/src/trigger_lister.h | 2 +-
view/src/trigger_node.cc | 4 +-
view/src/trigger_node.h | 2 +-
view/src/trigger_panel.cc | 2 +-
view/src/trigger_panel.h | 2 +-
view/src/url.cc | 2 +-
view/src/url.h | 2 +-
view/src/user_prefs.cc | 2 +-
view/src/user_prefs.h | 2 +-
view/src/users.cc | 2 +-
view/src/users.h | 2 +-
view/src/variable_node.cc | 2 +-
view/src/variable_node.h | 2 +-
view/src/variables.cc | 2 +-
view/src/variables.h | 2 +-
view/src/viewer.cc | 2 +-
view/src/viewer.h | 2 +-
view/src/why.cc | 2 +-
view/src/why.h | 2 +-
view/src/window.cc | 2 +-
view/src/window.h | 2 +-
view/src/x.c | 2 +-
view/src/xcdp.menu | 2 +-
view/src/xcdp.menu.h | 2 +-
view/src/xdclass.h | 2 +-
view/src/xdxmdialog.cc | 2 +-
view/src/xdxtclass.cc | 2 +-
view/src/xec.h | 2 +-
view/src/xecp.h | 2 +-
view/src/xmstring.cc | 2 +-
view/src/xmstring.h | 2 +-
view/src/xnode.cc | 2 +-
view/src/xnode.h | 2 +-
view/src/xresources.h | 2 +-
view/src/zombie.h | 2 +-
view/src/zombies_panel.cc | 2 +-
view/src/zombies_panel.h | 2 +-
view/test/TestRunner.cpp | 2 +-
view/test/TestView.cpp | 2 +-
view/test/ViewTestFixture.hpp | 2 +-
1726 files changed, 27319 insertions(+), 11286 deletions(-)
diff --git a/ACore/Jamfile.jam b/ACore/Jamfile.jam
index d24b8f6..8443a1a 100755
--- a/ACore/Jamfile.jam
+++ b/ACore/Jamfile.jam
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Archive.hpp b/ACore/src/Archive.hpp
index 1d86bb1..08d1bd5 100644
--- a/ACore/src/Archive.hpp
+++ b/ACore/src/Archive.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/ArgvCreator.cpp b/ACore/src/ArgvCreator.cpp
index ff5debc..5816e8c 100644
--- a/ACore/src/ArgvCreator.cpp
+++ b/ACore/src/ArgvCreator.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -30,7 +30,7 @@ ArgvCreator::ArgvCreator( const std::vector<std::string>& theArgs)
assert(argv_ != NULL);
for(size_t i = 0; i < theArgs.size(); i++) {
- argv_[i] = (char*) malloc (sizeof (char *) * (theArgs[i].size() + 1)); // allow +1 for \0
+ argv_[i] = (char*) malloc (sizeof(char) * (theArgs[i].size() + 1)); // allow +1 for \0
strcpy (argv_[i], theArgs[i].c_str() );
}
argv_[argc_] = NULL;
diff --git a/ACore/src/ArgvCreator.hpp b/ACore/src/ArgvCreator.hpp
index 2461d71..b22c0fa 100644
--- a/ACore/src/ArgvCreator.hpp
+++ b/ACore/src/ArgvCreator.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/AssertTimer.cpp b/ACore/src/AssertTimer.cpp
index 8185940..081344b 100644
--- a/ACore/src/AssertTimer.cpp
+++ b/ACore/src/AssertTimer.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/AssertTimer.hpp b/ACore/src/AssertTimer.hpp
index 6aadf84..6affc6c 100644
--- a/ACore/src/AssertTimer.hpp
+++ b/ACore/src/AssertTimer.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Cal.cpp b/ACore/src/Cal.cpp
index bb88cb8..cc55f87 100644
--- a/ACore/src/Cal.cpp
+++ b/ACore/src/Cal.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Cal.hpp b/ACore/src/Cal.hpp
index 76b7163..f60690c 100644
--- a/ACore/src/Cal.hpp
+++ b/ACore/src/Cal.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Calendar.cpp b/ACore/src/Calendar.cpp
index f673c8d..4575d05 100644
--- a/ACore/src/Calendar.cpp
+++ b/ACore/src/Calendar.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #65 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Calendar.hpp b/ACore/src/Calendar.hpp
index 92c3af5..ecb8fe1 100644
--- a/ACore/src/Calendar.hpp
+++ b/ACore/src/Calendar.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #48 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/CalendarUpdateParams.hpp b/ACore/src/CalendarUpdateParams.hpp
index df36d3c..f06fe44 100644
--- a/ACore/src/CalendarUpdateParams.hpp
+++ b/ACore/src/CalendarUpdateParams.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/CheckPt.hpp b/ACore/src/CheckPt.hpp
index 00ef9ab..8772a91 100644
--- a/ACore/src/CheckPt.hpp
+++ b/ACore/src/CheckPt.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Child.cpp b/ACore/src/Child.cpp
index 40c5aac..2b89a69 100644
--- a/ACore/src/Child.cpp
+++ b/ACore/src/Child.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Child.hpp b/ACore/src/Child.hpp
index 421e22a..b9e90f0 100644
--- a/ACore/src/Child.hpp
+++ b/ACore/src/Child.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/DState.cpp b/ACore/src/DState.cpp
index 3ae92d3..5eb4270 100644
--- a/ACore/src/DState.cpp
+++ b/ACore/src/DState.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -70,6 +70,36 @@ const char* DState::toString( DState::State s ) {
return NULL;
}
+const char* DState::to_html( DState::State s ) {
+ switch ( s ) {
+ case DState::UNKNOWN:
+ return "<state>unknown</state>";
+ break;
+ case DState::COMPLETE:
+ return "<state>complete</state>";
+ break;
+ case DState::QUEUED:
+ return "<state>queued</state>";
+ break;
+ case DState::ABORTED:
+ return "<state>aborted</state>";
+ break;
+ case DState::SUBMITTED:
+ return "<state>submitted</state>";
+ break;
+ case DState::SUSPENDED:
+ return "<state>suspended</state>";
+ break;
+ case DState::ACTIVE:
+ return "<state>active</state>";
+ break;
+ default:
+ assert(false);break;
+ }
+ assert(false);
+ return NULL;
+}
+
DState::State DState::toState( const std::string& str ) {
if ( str == "complete" )
return DState::COMPLETE;
diff --git a/ACore/src/DState.hpp b/ACore/src/DState.hpp
index cb2bcd7..23cc359 100644
--- a/ACore/src/DState.hpp
+++ b/ACore/src/DState.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -46,7 +46,8 @@ public:
static DState::State default_state() { return DState::QUEUED; }
static NState::State convert(DState::State);
- static const char* toString(DState::State s);
+ static const char* toString(DState::State s);
+ static const char* to_html(DState::State s);
static const char* toString(const DState& ns) { return toString(ns.state());}
static DState::State toState(const std::string& state);
static bool isValid(const std::string& state);
diff --git a/ACore/src/DurationTimer.hpp b/ACore/src/DurationTimer.hpp
index ba87c3b..19ed121 100644
--- a/ACore/src/DurationTimer.hpp
+++ b/ACore/src/DurationTimer.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Ecf.cpp b/ACore/src/Ecf.cpp
index bf14ceb..7f308ac 100644
--- a/ACore/src/Ecf.cpp
+++ b/ACore/src/Ecf.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #16 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Ecf.hpp b/ACore/src/Ecf.hpp
index 3037784..f7f4257 100644
--- a/ACore/src/Ecf.hpp
+++ b/ACore/src/Ecf.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #13 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/EcfPortLock.hpp b/ACore/src/EcfPortLock.hpp
index 9b98c57..bb4bb34 100644
--- a/ACore/src/EcfPortLock.hpp
+++ b/ACore/src/EcfPortLock.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Extract.cpp b/ACore/src/Extract.cpp
index e8788eb..1e47415 100644
--- a/ACore/src/Extract.cpp
+++ b/ACore/src/Extract.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Extract.hpp b/ACore/src/Extract.hpp
index b32926f..b489e2f 100644
--- a/ACore/src/Extract.hpp
+++ b/ACore/src/Extract.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/File.cpp b/ACore/src/File.cpp
index 652a42c..063b1a5 100644
--- a/ACore/src/File.cpp
+++ b/ACore/src/File.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #70 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -93,7 +93,9 @@ void File::replaceExt(std::string& file, const std::string& newExt)
bool File::splitFileIntoLines(const std::string& filename, std::vector<std::string>& lines,bool ignoreEmptyLine)
{
std::ifstream the_file(filename.c_str(),std::ios_base::in);
- if ( !the_file ) return false;
+ if ( !the_file ) {
+ return false;
+ }
lines.reserve(lines.size() + 100);
// Note if we use: while( getline( theEcfFile, line)), then we will miss the *last* *empty* line
@@ -160,7 +162,10 @@ std::string File::get_last_n_lines(const std::string& filename,int last_n_lines,
std::ifstream source( filename.c_str(), std::ios_base::in );
if (!source) {
error_msg = "File::get_last_n_lines: Could not open file " + filename;
- return string();
+ error_msg += " (";
+ error_msg += strerror(errno);
+ error_msg += ")";
+ return string();
}
size_t const granularity = 100 * last_n_lines;
@@ -200,6 +205,9 @@ std::string File::get_first_n_lines(const std::string& filename,int n_lines, std
std::ifstream source( filename.c_str(), std::ios_base::in );
if (!source) {
error_msg = "File::get_first_n_lines: Could not open file " + filename;
+ error_msg += " (";
+ error_msg += strerror(errno);
+ error_msg += ")";
return string();
}
@@ -229,12 +237,6 @@ bool File::open(const std::string& filePath, std::string& contents)
return true;
}
-//std::string File::tmpFile(std::string& contents)
-//{
-//
-//}
-
-
bool File::create(const std::string& filename,const std::vector<std::string>& lines, std::string& errorMsg)
{
// For very large file. This is about 1 second quicker. Than using streams
@@ -242,7 +244,7 @@ bool File::create(const std::string& filename,const std::vector<std::string>& li
FILE * theFile = fopen (filename.c_str(),"w");
if (theFile==NULL) {
std::stringstream ss;
- ss << "Could not create file '" << filename << "'\n";
+ ss << "Could not create file '" << filename << " (" << strerror(errno) << "'\n";
errorMsg += ss.str();
return false;
}
@@ -251,7 +253,7 @@ bool File::create(const std::string& filename,const std::vector<std::string>& li
if (i != 0) {
if (fputs("\n",theFile) == EOF) {
std::stringstream ss;
- ss << "Could not write to file '" << filename << "'\n";
+ ss << "Could not write to file '" << filename << "' (" << strerror(errno) << ")\n";
errorMsg += ss.str();
fclose (theFile);
return false;
@@ -259,7 +261,7 @@ bool File::create(const std::string& filename,const std::vector<std::string>& li
}
if (fputs(lines[i].c_str(),theFile) == EOF) {
std::stringstream ss;
- ss << "Could not write to file '" << filename << "'\n";
+ ss << "Could not write to file '" << filename << "' (" << strerror(errno) << ")\n";
errorMsg += ss.str();
fclose (theFile);
return false;
@@ -297,7 +299,7 @@ bool File::create(const std::string& filename, const std::string& contents, std:
std::ofstream theFile( filename.c_str() );
if ( !theFile ) {
std::stringstream ss;
- ss << "Could not create file '" << filename << "'\n";
+ ss << "Could not create file '" << filename << "' (" << strerror(errno) << ")\n";
errorMsg += ss.str();
return false;
}
@@ -305,7 +307,7 @@ bool File::create(const std::string& filename, const std::string& contents, std:
theFile << contents;
if (!theFile.good()) {
std::stringstream ss;
- ss << "Could not write to file '" << filename << "'\n";
+ ss << "Could not write to file '" << filename << "' (" << strerror(errno) << ")\n";
errorMsg += ss.str();
theFile.close();
return false;
@@ -562,11 +564,11 @@ std::string File::diff(const std::string& file,
std::vector<std::string> file2Lines;
if (!splitFileIntoLines(file, fileLines, ignoreBlanksLine)) {
- errorMsg += "First argument File " + file + " could not be opened";
+ errorMsg += "First argument File " + file + " could not be opened : " + strerror(errno);
return std::string();
}
if (!splitFileIntoLines(file2, file2Lines, ignoreBlanksLine)) {
- errorMsg += "Second argument File " + file2 + " could not be opened";
+ errorMsg += "Second argument File " + file2 + " could not be opened : " + strerror(errno);
return std::string();
}
@@ -971,5 +973,24 @@ std::string File::root_build_dir()
return std::string();
}
+int File::max_open_file_allowed()
+{
+#ifdef OPEN_MAX
+ return OPEN_MAX;
+#else
+ static int max_open_file_allowed_ = -1;
+ if (max_open_file_allowed_ != -1) return max_open_file_allowed_;
+
+ max_open_file_allowed_ = sysconf(_SC_OPEN_MAX);
+ if (max_open_file_allowed_ < 0) {
+ ecf::LogToCout logToCout;
+ std::string msg = "sysconf (_SC_OPEN_MAX) failed ";
+ msg += " ("; msg += strerror(errno); msg += ")";
+ log(Log::ERR,msg);
+ }
+ return max_open_file_allowed_;
+#endif
+}
+
}
diff --git a/ACore/src/File.hpp b/ACore/src/File.hpp
index 7bab2a0..60af4e5 100644
--- a/ACore/src/File.hpp
+++ b/ACore/src/File.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #41 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -134,7 +134,6 @@ public:
// Remove a directory recursively ****
static bool removeDir( const boost::filesystem::path& p);
-
// Locate the path to the server exe
static std::string find_ecf_server_path();
@@ -147,6 +146,10 @@ public:
// return root source
static std::string root_source_dir();
static std::string root_build_dir();
+
+
+ static int max_open_file_allowed();
+
};
}
diff --git a/ACore/src/File_r.cpp b/ACore/src/File_r.cpp
index a073d80..a819b07 100644
--- a/ACore/src/File_r.cpp
+++ b/ACore/src/File_r.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/File_r.hpp b/ACore/src/File_r.hpp
index ad3d067..d60b953 100644
--- a/ACore/src/File_r.hpp
+++ b/ACore/src/File_r.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Host.cpp b/ACore/src/Host.cpp
index 6b3d34d..5527dc0 100644
--- a/ACore/src/Host.cpp
+++ b/ACore/src/Host.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Host.hpp b/ACore/src/Host.hpp
index 99755a5..63fc5dd 100644
--- a/ACore/src/Host.hpp
+++ b/ACore/src/Host.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Indentor.cpp b/ACore/src/Indentor.cpp
index 9d97783..f9302d8 100644
--- a/ACore/src/Indentor.cpp
+++ b/ACore/src/Indentor.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Indentor.hpp b/ACore/src/Indentor.hpp
index e535c4b..c5c7562 100644
--- a/ACore/src/Indentor.hpp
+++ b/ACore/src/Indentor.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Log.cpp b/ACore/src/Log.cpp
index 54f73c4..93f35a8 100644
--- a/ACore/src/Log.cpp
+++ b/ACore/src/Log.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #57 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Log.hpp b/ACore/src/Log.hpp
index a0bbad3..20ffe0f 100644
--- a/ACore/src/Log.hpp
+++ b/ACore/src/Log.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #31 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/LogVerification.cpp b/ACore/src/LogVerification.cpp
index b9865b1..d451b52 100644
--- a/ACore/src/LogVerification.cpp
+++ b/ACore/src/LogVerification.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -35,7 +35,7 @@ bool LogVerification::extractNodePathAndState( const std::string& logfile,
// Open log file, and collate of the node paths and corresponding states
std::vector<std::string> lines;
if (!File::splitFileIntoLines(logfile,lines)) {
- errorMsg = "Could not open log file " + logfile + " for test verification";
+ errorMsg = "Could not open log file " + logfile + " for test verification (" + strerror(errno) + ")";
return false;
}
diff --git a/ACore/src/LogVerification.hpp b/ACore/src/LogVerification.hpp
index 40c2e72..a78b52d 100644
--- a/ACore/src/LogVerification.hpp
+++ b/ACore/src/LogVerification.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/NOrder.cpp b/ACore/src/NOrder.cpp
index c736255..a27aa80 100644
--- a/ACore/src/NOrder.cpp
+++ b/ACore/src/NOrder.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/NOrder.hpp b/ACore/src/NOrder.hpp
index 2f93b73..58a0444 100644
--- a/ACore/src/NOrder.hpp
+++ b/ACore/src/NOrder.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/NState.cpp b/ACore/src/NState.cpp
index 210792d..1a8b3cf 100644
--- a/ACore/src/NState.cpp
+++ b/ACore/src/NState.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #20 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -54,6 +54,34 @@ const char* NState::toString( NState::State s ) {
return NULL;
}
+
+const char* NState::to_html( NState::State s ) {
+ switch ( s ) {
+ case NState::UNKNOWN:
+ return "<state>unknown</state>";
+ break;
+ case NState::COMPLETE:
+ return "<state>complete</state>";
+ break;
+ case NState::QUEUED:
+ return "<state>queued</state>";
+ break;
+ case NState::ABORTED:
+ return "<state>aborted</state>";
+ break;
+ case NState::SUBMITTED:
+ return "<state>submitted</state>";
+ break;
+ case NState::ACTIVE:
+ return "<state>active</state>";
+ break;
+ default:
+ assert(false); break;
+ }
+ assert(false);
+ return NULL;
+}
+
NState::State NState::toState( const std::string& str ) {
if ( str == "complete" )
return NState::COMPLETE;
diff --git a/ACore/src/NState.hpp b/ACore/src/NState.hpp
index 2601462..027cf20 100644
--- a/ACore/src/NState.hpp
+++ b/ACore/src/NState.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #16 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -43,7 +43,8 @@ public:
bool operator==(State s) const { return s == state_;}
bool operator!=(State s) const { return s != state_;}
- static const char* toString(NState::State s);
+ static const char* toString(NState::State s);
+ static const char* to_html(NState::State s);
static const char* toString(const NState& ns) { return toString(ns.state());}
static NState::State toState(const std::string& state);
static bool isValid(const std::string& state);
diff --git a/ACore/src/NodePath.cpp b/ACore/src/NodePath.cpp
index e3cae23..82b199c 100644
--- a/ACore/src/NodePath.cpp
+++ b/ACore/src/NodePath.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/NodePath.hpp b/ACore/src/NodePath.hpp
index e4e05c7..5c8ede8 100644
--- a/ACore/src/NodePath.hpp
+++ b/ACore/src/NodePath.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Passwd.cpp b/ACore/src/Passwd.cpp
index ba0cef4..ee110bf 100644
--- a/ACore/src/Passwd.cpp
+++ b/ACore/src/Passwd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Passwd.hpp b/ACore/src/Passwd.hpp
index 655ee6c..1b6f525 100644
--- a/ACore/src/Passwd.hpp
+++ b/ACore/src/Passwd.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/PasswdFile.cpp b/ACore/src/PasswdFile.cpp
index 3df8a62..9ed8d9b 100644
--- a/ACore/src/PasswdFile.cpp
+++ b/ACore/src/PasswdFile.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -92,7 +92,9 @@ bool PasswdFile::load(const std::string& file, bool debug, std::string& errorMs
errorMsg += "Could not open file specified by ECF_PASSWD ";
errorMsg += passwd_file_;
- errorMsg += "\n";
+ errorMsg += " (";
+ errorMsg += strerror(errno);
+ errorMsg += ")";
if (debug) std::cout << dump() << "\n";
return false;
}
@@ -309,6 +311,9 @@ bool PasswdFile::clear(
return true;
}
errorMsg += "PasswdFile::clear: Could not open file ";
- errorMsg += errorMsg;
+ errorMsg += pathToFile;
+ errorMsg += " (";
+ errorMsg += strerror(errno);
+ errorMsg += ")";
return false;
}
diff --git a/ACore/src/PasswdFile.hpp b/ACore/src/PasswdFile.hpp
index 359fb46..c948970 100644
--- a/ACore/src/PasswdFile.hpp
+++ b/ACore/src/PasswdFile.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Pid.cpp b/ACore/src/Pid.cpp
index 32e1a09..cee31a9 100644
--- a/ACore/src/Pid.cpp
+++ b/ACore/src/Pid.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Pid.hpp b/ACore/src/Pid.hpp
index cfa6da5..3f18e70 100644
--- a/ACore/src/Pid.hpp
+++ b/ACore/src/Pid.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/PrintStyle.cpp b/ACore/src/PrintStyle.cpp
index f0e87ae..70cda91 100644
--- a/ACore/src/PrintStyle.cpp
+++ b/ACore/src/PrintStyle.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/PrintStyle.hpp b/ACore/src/PrintStyle.hpp
index d49add3..122f091 100644
--- a/ACore/src/PrintStyle.hpp
+++ b/ACore/src/PrintStyle.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #12 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/SState.cpp b/ACore/src/SState.cpp
index 21f7576..e6a7da1 100644
--- a/ACore/src/SState.cpp
+++ b/ACore/src/SState.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/SState.hpp b/ACore/src/SState.hpp
index 73eb4a8..79708c6 100644
--- a/ACore/src/SState.hpp
+++ b/ACore/src/SState.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Serialization.hpp b/ACore/src/Serialization.hpp
index 5aafe84..fab11a2 100644
--- a/ACore/src/Serialization.hpp
+++ b/ACore/src/Serialization.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/SerializationTest.hpp b/ACore/src/SerializationTest.hpp
index 3bc231f..ee49e45 100644
--- a/ACore/src/SerializationTest.hpp
+++ b/ACore/src/SerializationTest.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #16 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Stl.hpp b/ACore/src/Stl.hpp
index efab80d..7b61b8c 100644
--- a/ACore/src/Stl.hpp
+++ b/ACore/src/Stl.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Str.cpp b/ACore/src/Str.cpp
index b3c4aa3..fc3f087 100644
--- a/ACore/src/Str.cpp
+++ b/ACore/src/Str.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #49 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Str.hpp b/ACore/src/Str.hpp
index a6a35b4..6b61dec 100644
--- a/ACore/src/Str.hpp
+++ b/ACore/src/Str.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #50 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/TimeSeries.cpp b/ACore/src/TimeSeries.cpp
index 1466ffa..e18490f 100644
--- a/ACore/src/TimeSeries.cpp
+++ b/ACore/src/TimeSeries.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #78 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/TimeSeries.hpp b/ACore/src/TimeSeries.hpp
index c2d9198..9873e89 100644
--- a/ACore/src/TimeSeries.hpp
+++ b/ACore/src/TimeSeries.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #57 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/TimeSlot.cpp b/ACore/src/TimeSlot.cpp
index e7d6911..efbc030 100644
--- a/ACore/src/TimeSlot.cpp
+++ b/ACore/src/TimeSlot.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #16 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/TimeSlot.hpp b/ACore/src/TimeSlot.hpp
index 08ee8b1..e396956 100644
--- a/ACore/src/TimeSlot.hpp
+++ b/ACore/src/TimeSlot.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/TimeStamp.cpp b/ACore/src/TimeStamp.cpp
index 55b54df..32c7f9d 100644
--- a/ACore/src/TimeStamp.cpp
+++ b/ACore/src/TimeStamp.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #57 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/TimeStamp.hpp b/ACore/src/TimeStamp.hpp
index e4f17a6..ba368c8 100644
--- a/ACore/src/TimeStamp.hpp
+++ b/ACore/src/TimeStamp.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #31 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Version.cpp b/ACore/src/Version.cpp
index afb01bd..66f5dbc 100644
--- a/ACore/src/Version.cpp
+++ b/ACore/src/Version.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #132 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/Version.hpp b/ACore/src/Version.hpp
index 19d79ff..55da2e0 100644
--- a/ACore/src/Version.hpp
+++ b/ACore/src/Version.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #15 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/WhiteListFile.cpp b/ACore/src/WhiteListFile.cpp
index d0d1f96..1a8a30a 100644
--- a/ACore/src/WhiteListFile.cpp
+++ b/ACore/src/WhiteListFile.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -204,7 +204,9 @@ bool WhiteListFile::load(const std::string& file, bool debug, std::string& error
errorMsg += "Could not open file specified by ECF_LISTS ";
errorMsg += white_list_file_;
- errorMsg += "\n";
+ errorMsg += " (";
+ errorMsg += strerror(errno);
+ errorMsg += ")";
if (debug) std::cout << dump_valid_users() << "\n";
return false;
}
diff --git a/ACore/src/WhiteListFile.hpp b/ACore/src/WhiteListFile.hpp
index 1b70f5e..327ffa7 100644
--- a/ACore/src/WhiteListFile.hpp
+++ b/ACore/src/WhiteListFile.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/boost_archive.cpp b/ACore/src/boost_archive.cpp
index 48a3067..437be10 100644
--- a/ACore/src/boost_archive.cpp
+++ b/ACore/src/boost_archive.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/boost_archive.hpp b/ACore/src/boost_archive.hpp
index 409c7ea..d43f84a 100644
--- a/ACore/src/boost_archive.hpp
+++ b/ACore/src/boost_archive.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/src/ecflow_version.h b/ACore/src/ecflow_version.h
index 8f233f6..29a7792 100644
--- a/ACore/src/ecflow_version.h
+++ b/ACore/src/ecflow_version.h
@@ -1,10 +1,10 @@
#ifndef ecflow_version_config_h
#define ecflow_version_config_h
-#define ECFLOW_VERSION "4.5.0"
+#define ECFLOW_VERSION "4.6.0"
#define ECFLOW_RELEASE "4"
-#define ECFLOW_MAJOR "5"
+#define ECFLOW_MAJOR "6"
#define ECFLOW_MINOR "0"
#endif
diff --git a/ACore/test/TestArgvCreator.cpp b/ACore/test/TestArgvCreator.cpp
index 420bb91..97edd67 100644
--- a/ACore/test/TestArgvCreator.cpp
+++ b/ACore/test/TestArgvCreator.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/test/TestCalendar.cpp b/ACore/test/TestCalendar.cpp
index 60d151e..3414294 100644
--- a/ACore/test/TestCalendar.cpp
+++ b/ACore/test/TestCalendar.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #20 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/test/TestExceptionSafety.cpp b/ACore/test/TestExceptionSafety.cpp
index 2c9efa4..016ee63 100644
--- a/ACore/test/TestExceptionSafety.cpp
+++ b/ACore/test/TestExceptionSafety.cpp
@@ -3,7 +3,7 @@
//// Author : Avi
//// Revision : $Revision: #5 $
////
-//// Copyright 2009-2016 ECMWF.
+//// Copyright 2009-2017 ECMWF.
//// This software is licensed under the terms of the Apache Licence version 2.0
//// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
//// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/test/TestFile.cpp b/ACore/test/TestFile.cpp
index 84204a5..ebc0e96 100644
--- a/ACore/test/TestFile.cpp
+++ b/ACore/test/TestFile.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #24 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -52,7 +52,7 @@ BOOST_AUTO_TEST_CASE( test_splitFileIntoLines )
}
std::vector<std::string> lines;
- BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path);
+ BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path << " (" << strerror(errno) << ")");
BOOST_CHECK_MESSAGE( lines.size() == 1," Expected 1 line but found " << lines.size());
fs::remove(path); // Remove the file. Comment out for debugging
@@ -65,7 +65,7 @@ BOOST_AUTO_TEST_CASE( test_splitFileIntoLines )
}
std::vector<std::string> lines;
- BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path);
+ BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path << " (" << strerror(errno) << ")");
BOOST_CHECK_MESSAGE( lines.size() == 1," Expected 1 line but found " << lines.size());
fs::remove(path); // Remove the file. Comment out for debugging
@@ -79,7 +79,7 @@ BOOST_AUTO_TEST_CASE( test_splitFileIntoLines )
}
std::vector<std::string> lines;
- BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path);
+ BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path << " (" << strerror(errno) << ")");
BOOST_CHECK_MESSAGE( lines.size() == 2," Expected 2 line but found " << lines.size());
fs::remove(path); // Remove the file. Comment out for debugging
@@ -94,7 +94,7 @@ BOOST_AUTO_TEST_CASE( test_splitFileIntoLines )
}
std::vector<std::string> lines;
- BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path);
+ BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path<< " (" << strerror(errno) << ")");
BOOST_CHECK_MESSAGE( lines.size() == 3," Expected 3 line but found " << lines.size());
fs::remove(path); // Remove the file. Comment out for debugging
@@ -109,7 +109,7 @@ BOOST_AUTO_TEST_CASE( test_splitFileIntoLines )
}
std::vector<std::string> lines;
- BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path);
+ BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path<< " (" << strerror(errno) << ")");
BOOST_CHECK_MESSAGE( lines.size() == 3," Expected 3 line but found " << lines.size());
fs::remove(path); // Remove the file. Comment out for debugging
@@ -133,14 +133,14 @@ BOOST_AUTO_TEST_CASE( test_file_tokenizer )
}
{
std::vector<std::string> lines;
- BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines,true/*ignore empty lines*/)," Failed to open file " << path);
+ BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines,true/*ignore empty lines*/)," Failed to open file " << path<< " (" << strerror(errno) << ")");
BOOST_CHECK_MESSAGE( lines.size() == linesWithText,"Expected " << linesWithText << " but found " << lines.size());
BOOST_CHECK_MESSAGE( lines[0] == theText,"Expected '" << theText << "' but found " << lines[0]);
BOOST_CHECK_MESSAGE( lines[linesWithText-1] == theText,"Expected '" << theText << "' but found " << lines[linesWithText-1]);
lines.clear();
size_t totalLines = 151;
- BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path);
+ BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path<< " (" << strerror(errno) << ")");
BOOST_CHECK_MESSAGE( lines.size() == totalLines-1,"Expected " << totalLines-1 << " but found " << lines.size());
BOOST_CHECK_MESSAGE( lines[0] == "","Expected empty string but found " << lines[0]);
BOOST_CHECK_MESSAGE( lines[1] == theText,"Expected '" << theText << "' but found " << lines[1]);
@@ -154,7 +154,7 @@ BOOST_AUTO_TEST_CASE( test_file_tokenizer )
boost::timer timer; // measures CPU, replace with cpu_timer with boost > 1.51, measures cpu & elapsed
for (size_t i = 0; i < openFileNTimes; i++) {
std::vector<std::string> lines;
- BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path);
+ BOOST_CHECK_MESSAGE( File::splitFileIntoLines(path,lines)," Failed to open file " << path<< " (" << strerror(errno) << ")");
}
cout << "Time for opening file " << openFileNTimes << " times = " << timer.elapsed() << "\n";
}
diff --git a/ACore/test/TestGetUserDetails.cpp b/ACore/test/TestGetUserDetails.cpp
index 55a74df..3aca6d9 100644
--- a/ACore/test/TestGetUserDetails.cpp
+++ b/ACore/test/TestGetUserDetails.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/test/TestLog.cpp b/ACore/test/TestLog.cpp
index 0aa47af..81305bf 100644
--- a/ACore/test/TestLog.cpp
+++ b/ACore/test/TestLog.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #21 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -80,7 +80,7 @@ BOOST_AUTO_TEST_CASE( test_log_append )
// Load the log file into a vector, of strings, and test content
std::vector<std::string> lines;
- BOOST_REQUIRE_MESSAGE(File::splitFileIntoLines(path,lines,true/*IGNORE EMPTY LINE AT THE END*/),"Failed to open log file");
+ BOOST_REQUIRE_MESSAGE(File::splitFileIntoLines(path,lines,true/*IGNORE EMPTY LINE AT THE END*/),"Failed to open log file"<< " (" << strerror(errno) << ")");
BOOST_REQUIRE(lines.size() != 0);
BOOST_CHECK_MESSAGE(lines.size() == 10," Expected 10 lines in log, but found " << lines.size() << "\n");
BOOST_CHECK_MESSAGE(lines[0].find("First Message") != string::npos,"Expected first line to contain 'First Message' but found " << lines[0] << "\n");
diff --git a/ACore/test/TestMigration.cpp b/ACore/test/TestMigration.cpp
index b33373d..cd91db9 100644
--- a/ACore/test/TestMigration.cpp
+++ b/ACore/test/TestMigration.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/test/TestNodePath.cpp b/ACore/test/TestNodePath.cpp
index 88fbb06..510d576 100644
--- a/ACore/test/TestNodePath.cpp
+++ b/ACore/test/TestNodePath.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/test/TestPasswdFile.cpp b/ACore/test/TestPasswdFile.cpp
index 8a54bb9..8dab19c 100644
--- a/ACore/test/TestPasswdFile.cpp
+++ b/ACore/test/TestPasswdFile.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/test/TestRealCalendar.cpp b/ACore/test/TestRealCalendar.cpp
index f60b683..426ba90 100644
--- a/ACore/test/TestRealCalendar.cpp
+++ b/ACore/test/TestRealCalendar.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/test/TestSerialisation.cpp b/ACore/test/TestSerialisation.cpp
index 42482b8..1eaa85c 100644
--- a/ACore/test/TestSerialisation.cpp
+++ b/ACore/test/TestSerialisation.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #12 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/test/TestStackTrace.cpp b/ACore/test/TestStackTrace.cpp
index 6eabc4a..47b760d 100644
--- a/ACore/test/TestStackTrace.cpp
+++ b/ACore/test/TestStackTrace.cpp
@@ -3,7 +3,7 @@
//// Author : Avi
//// Revision : $Revision: #8 $
////
-//// Copyright 2009-2016 ECMWF.
+//// Copyright 2009-2017 ECMWF.
//// This software is licensed under the terms of the Apache Licence version 2.0
//// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
//// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/test/TestStr.cpp b/ACore/test/TestStr.cpp
index d3c460b..70a1521 100644
--- a/ACore/test/TestStr.cpp
+++ b/ACore/test/TestStr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #24 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/test/TestTimeSeries.cpp b/ACore/test/TestTimeSeries.cpp
index 3296532..4c9d2dc 100644
--- a/ACore/test/TestTimeSeries.cpp
+++ b/ACore/test/TestTimeSeries.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #32 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/test/TestTimeSlot.cpp b/ACore/test/TestTimeSlot.cpp
index 4db33dc..6913f70 100644
--- a/ACore/test/TestTimeSlot.cpp
+++ b/ACore/test/TestTimeSlot.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #29 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/test/TestVersion.cpp b/ACore/test/TestVersion.cpp
index 1eced7d..81143c5 100644
--- a/ACore/test/TestVersion.cpp
+++ b/ACore/test/TestVersion.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #23 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -47,7 +47,7 @@ BOOST_AUTO_TEST_CASE( test_version_against_VERSION_cmake )
// Open the file VERSION.cmake
std::string version_cmake_file = File::root_source_dir() + "/VERSION.cmake";
std::vector<std::string> lines;
- BOOST_REQUIRE_MESSAGE(File::splitFileIntoLines(version_cmake_file,lines,true/* impore empty lines */),"Failed to open file " << version_cmake_file);
+ BOOST_REQUIRE_MESSAGE(File::splitFileIntoLines(version_cmake_file,lines,true/* impore empty lines */),"Failed to open file " << version_cmake_file<< " (" << strerror(errno) << ")");
BOOST_REQUIRE_MESSAGE(!lines.empty(),"File " << version_cmake_file << " does not contain version info ??");
// Expecting lines like:
diff --git a/ACore/test/TestVersioning.cpp b/ACore/test/TestVersioning.cpp
index 608886a..616a362 100644
--- a/ACore/test/TestVersioning.cpp
+++ b/ACore/test/TestVersioning.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/test/TestVersioning.hpp b/ACore/test/TestVersioning.hpp
index 17f7d6c..a864d2e 100644
--- a/ACore/test/TestVersioning.hpp
+++ b/ACore/test/TestVersioning.hpp
@@ -1,6 +1,6 @@
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ACore/test/TestWhiteListFile.cpp b/ACore/test/TestWhiteListFile.cpp
index 8a174d4..7c968e2 100644
--- a/ACore/test/TestWhiteListFile.cpp
+++ b/ACore/test/TestWhiteListFile.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/jamfile.jam b/ANattr/jamfile.jam
index 211f2fc..9587164 100644
--- a/ANattr/jamfile.jam
+++ b/ANattr/jamfile.jam
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/AutoCancelAttr.cpp b/ANattr/src/AutoCancelAttr.cpp
index 140568e..98b44fd 100644
--- a/ANattr/src/AutoCancelAttr.cpp
+++ b/ANattr/src/AutoCancelAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/AutoCancelAttr.hpp b/ANattr/src/AutoCancelAttr.hpp
index 654e8d8..647fbb6 100644
--- a/ANattr/src/AutoCancelAttr.hpp
+++ b/ANattr/src/AutoCancelAttr.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/ClockAttr.cpp b/ANattr/src/ClockAttr.cpp
index 5d35382..7467457 100644
--- a/ANattr/src/ClockAttr.cpp
+++ b/ANattr/src/ClockAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #21 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/ClockAttr.hpp b/ANattr/src/ClockAttr.hpp
index f5728ef..9e2540c 100644
--- a/ANattr/src/ClockAttr.hpp
+++ b/ANattr/src/ClockAttr.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #18 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/CronAttr.cpp b/ANattr/src/CronAttr.cpp
index 8524c3d..addcc7c 100644
--- a/ANattr/src/CronAttr.cpp
+++ b/ANattr/src/CronAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #59 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/CronAttr.hpp b/ANattr/src/CronAttr.hpp
index 4739350..6d0be69 100644
--- a/ANattr/src/CronAttr.hpp
+++ b/ANattr/src/CronAttr.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #32 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/DateAttr.cpp b/ANattr/src/DateAttr.cpp
index ae7c104..5bd2168 100644
--- a/ANattr/src/DateAttr.cpp
+++ b/ANattr/src/DateAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #31 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/DateAttr.hpp b/ANattr/src/DateAttr.hpp
index 383c032..7bdbb24 100644
--- a/ANattr/src/DateAttr.hpp
+++ b/ANattr/src/DateAttr.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #24 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/DayAttr.cpp b/ANattr/src/DayAttr.cpp
index 22812cf..876966e 100644
--- a/ANattr/src/DayAttr.cpp
+++ b/ANattr/src/DayAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #32 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -110,7 +110,7 @@ bool DayAttr::why(const ecf::Calendar& c, std::string& theReasonWhy) const
{
if (isFree(c)) return false;
- theReasonWhy += " is day dependent ( next run on ";
+ theReasonWhy += " is day dependent ( next run on ";
theReasonWhy += theDay(day_);
theReasonWhy += " the current day is ";
theReasonWhy += theDay(static_cast<DayAttr::Day_t>(c.day_of_week()));
diff --git a/ANattr/src/DayAttr.hpp b/ANattr/src/DayAttr.hpp
index 8284432..b08c5d5 100644
--- a/ANattr/src/DayAttr.hpp
+++ b/ANattr/src/DayAttr.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #27 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -83,8 +83,8 @@ private:
};
// This should ONLY be added to objects that are *NOT* serialised through a pointer
-BOOST_CLASS_IMPLEMENTATION(DayAttr, boost::serialization::object_serializable);
-BOOST_CLASS_TRACKING(DayAttr,boost::serialization::track_never);
+BOOST_CLASS_IMPLEMENTATION(DayAttr, boost::serialization::object_serializable)
+BOOST_CLASS_TRACKING(DayAttr,boost::serialization::track_never)
#endif
diff --git a/ANattr/src/LateAttr.cpp b/ANattr/src/LateAttr.cpp
index 9813361..1f5549a 100644
--- a/ANattr/src/LateAttr.cpp
+++ b/ANattr/src/LateAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #16 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/LateAttr.hpp b/ANattr/src/LateAttr.hpp
index 3888962..f3efcb1 100644
--- a/ANattr/src/LateAttr.hpp
+++ b/ANattr/src/LateAttr.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #13 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/NodeAttr.cpp b/ANattr/src/NodeAttr.cpp
index fb91f99..38c3f83 100644
--- a/ANattr/src/NodeAttr.cpp
+++ b/ANattr/src/NodeAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #67 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/NodeAttr.hpp b/ANattr/src/NodeAttr.hpp
index f8ee5b4..cfa8a46 100644
--- a/ANattr/src/NodeAttr.hpp
+++ b/ANattr/src/NodeAttr.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #61 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/RepeatAttr.cpp b/ANattr/src/RepeatAttr.cpp
index 4876c34..e1dc3c6 100644
--- a/ANattr/src/RepeatAttr.cpp
+++ b/ANattr/src/RepeatAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #57 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/RepeatAttr.hpp b/ANattr/src/RepeatAttr.hpp
index f9445b9..40bde2e 100644
--- a/ANattr/src/RepeatAttr.hpp
+++ b/ANattr/src/RepeatAttr.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #51 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -360,7 +360,7 @@ public:
virtual bool compare(RepeatBase*) const;
virtual bool valid() const { return valid_;}
virtual std::string valueAsString() const { return std::string(); } ;
- virtual std::string value_as_string(int index) const { return std::string(); }
+ virtual std::string value_as_string(int ) const { return std::string(); }
virtual void setToLastValue() { /* do nothing ?? */ }
virtual void reset() { valid_ = true; }
virtual void change(const std::string& /*newValue*/) { /* do nothing */ }
diff --git a/ANattr/src/TimeAttr.cpp b/ANattr/src/TimeAttr.cpp
index de45244..552edab 100644
--- a/ANattr/src/TimeAttr.cpp
+++ b/ANattr/src/TimeAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #40 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/TimeAttr.hpp b/ANattr/src/TimeAttr.hpp
index bc357e9..da1ce3b 100644
--- a/ANattr/src/TimeAttr.hpp
+++ b/ANattr/src/TimeAttr.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #32 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/TodayAttr.cpp b/ANattr/src/TodayAttr.cpp
index a9068cb..693d543 100644
--- a/ANattr/src/TodayAttr.cpp
+++ b/ANattr/src/TodayAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #38 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/TodayAttr.hpp b/ANattr/src/TodayAttr.hpp
index 2ea163d..8d56b0f 100644
--- a/ANattr/src/TodayAttr.hpp
+++ b/ANattr/src/TodayAttr.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #30 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/Variable.cpp b/ANattr/src/Variable.cpp
index 4050880..be83ee1 100644
--- a/ANattr/src/Variable.cpp
+++ b/ANattr/src/Variable.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #56 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/Variable.hpp b/ANattr/src/Variable.hpp
index 678f3c0..0796228 100644
--- a/ANattr/src/Variable.hpp
+++ b/ANattr/src/Variable.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #56 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/VerifyAttr.cpp b/ANattr/src/VerifyAttr.cpp
index 9cfca3e..12d7541 100644
--- a/ANattr/src/VerifyAttr.cpp
+++ b/ANattr/src/VerifyAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #19 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/VerifyAttr.hpp b/ANattr/src/VerifyAttr.hpp
index 5bab60e..fb79dc9 100644
--- a/ANattr/src/VerifyAttr.hpp
+++ b/ANattr/src/VerifyAttr.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/Zombie.cpp b/ANattr/src/Zombie.cpp
index bbe60fd..76016f9 100644
--- a/ANattr/src/Zombie.cpp
+++ b/ANattr/src/Zombie.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #15 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/Zombie.hpp b/ANattr/src/Zombie.hpp
index 4bfed12..11f40d3 100644
--- a/ANattr/src/Zombie.hpp
+++ b/ANattr/src/Zombie.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #15 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/ZombieAttr.cpp b/ANattr/src/ZombieAttr.cpp
index 1be0a57..f20f13c 100644
--- a/ANattr/src/ZombieAttr.cpp
+++ b/ANattr/src/ZombieAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #13 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/src/ZombieAttr.hpp b/ANattr/src/ZombieAttr.hpp
index 3be4652..1f8ff6b 100644
--- a/ANattr/src/ZombieAttr.hpp
+++ b/ANattr/src/ZombieAttr.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/test/TestAttrSerialization.cpp b/ANattr/test/TestAttrSerialization.cpp
index 854d894..a998bf1 100644
--- a/ANattr/test/TestAttrSerialization.cpp
+++ b/ANattr/test/TestAttrSerialization.cpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #24 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/test/TestCron.cpp b/ANattr/test/TestCron.cpp
index 4552866..e6f5079 100644
--- a/ANattr/test/TestCron.cpp
+++ b/ANattr/test/TestCron.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/test/TestDayAttr.cpp b/ANattr/test/TestDayAttr.cpp
index 2486db1..f70cd0e 100644
--- a/ANattr/test/TestDayAttr.cpp
+++ b/ANattr/test/TestDayAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/test/TestLabel.cpp b/ANattr/test/TestLabel.cpp
index 5425a4f..ad9a7f4 100644
--- a/ANattr/test/TestLabel.cpp
+++ b/ANattr/test/TestLabel.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/test/TestLateAttr.cpp b/ANattr/test/TestLateAttr.cpp
index 31212e8..5810d69 100644
--- a/ANattr/test/TestLateAttr.cpp
+++ b/ANattr/test/TestLateAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/test/TestMigration.cpp b/ANattr/test/TestMigration.cpp
index d3f0a1d..df4d8b4 100644
--- a/ANattr/test/TestMigration.cpp
+++ b/ANattr/test/TestMigration.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #13 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/test/TestRepeat.cpp b/ANattr/test/TestRepeat.cpp
index a95a10f..3a25070 100644
--- a/ANattr/test/TestRepeat.cpp
+++ b/ANattr/test/TestRepeat.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #16 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/test/TestTimeAttr.cpp b/ANattr/test/TestTimeAttr.cpp
index 38956d9..552ca93 100644
--- a/ANattr/test/TestTimeAttr.cpp
+++ b/ANattr/test/TestTimeAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/test/TestTodayAttr.cpp b/ANattr/test/TestTodayAttr.cpp
index f31e493..53a3bcc 100644
--- a/ANattr/test/TestTodayAttr.cpp
+++ b/ANattr/test/TestTodayAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANattr/test/TestVariable.cpp b/ANattr/test/TestVariable.cpp
index 3cf8127..13549cc 100644
--- a/ANattr/test/TestVariable.cpp
+++ b/ANattr/test/TestVariable.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/jamfile.jam b/ANode/jamfile.jam
index d4336ea..f35fa00 100644
--- a/ANode/jamfile.jam
+++ b/ANode/jamfile.jam
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/AbstractObserver.hpp b/ANode/src/AbstractObserver.hpp
index c3759c0..ed2299a 100644
--- a/ANode/src/AbstractObserver.hpp
+++ b/ANode/src/AbstractObserver.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -24,6 +24,9 @@ class AbstractObserver {
public:
virtual ~AbstractObserver() {}
+ virtual void update_start(const Node*, const std::vector<ecf::Aspect::Type>&) = 0;
+ virtual void update_start(const Defs*, const std::vector<ecf::Aspect::Type>&) = 0;
+
virtual void update(const Node*, const std::vector<ecf::Aspect::Type>&) = 0;
virtual void update(const Defs*, const std::vector<ecf::Aspect::Type>&) = 0;
diff --git a/ANode/src/Alias.cpp b/ANode/src/Alias.cpp
index ea8914b..f7d9e92 100644
--- a/ANode/src/Alias.cpp
+++ b/ANode/src/Alias.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #19 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/Alias.hpp b/ANode/src/Alias.hpp
index 2b28575..67e7665 100644
--- a/ANode/src/Alias.hpp
+++ b/ANode/src/Alias.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #17 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -51,7 +51,7 @@ public:
virtual const std::string& script_extension() const;
virtual void collateChanges(DefsDelta&) const;
- void set_memento(const SubmittableMemento* m,std::vector<ecf::Aspect::Type>& aspects) { Submittable::set_memento(m,aspects); }
+ void set_memento(const SubmittableMemento* m,std::vector<ecf::Aspect::Type>& aspects,bool f) { Submittable::set_memento(m,aspects,f); }
virtual node_ptr find_node_up_the_tree(const std::string& name) const;
diff --git a/ANode/src/Aspect.hpp b/ANode/src/Aspect.hpp
index f67e3d9..70ad77a 100644
--- a/ANode/src/Aspect.hpp
+++ b/ANode/src/Aspect.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/Attr.cpp b/ANode/src/Attr.cpp
new file mode 100644
index 0000000..2d667d5
--- /dev/null
+++ b/ANode/src/Attr.cpp
@@ -0,0 +1,86 @@
+//============================================================================
+// Name :
+// Author : Avi
+// Revision : $Revision: #20 $
+//
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+// Description :
+//============================================================================
+
+#include <assert.h>
+#include "Attr.hpp"
+
+namespace ecf {
+
+enum Type { EVENT =0, METER=1, LABEL=2, LIMIT=3, VARIABLE=4, };
+
+const char* Attr::to_string( Attr::Type s ) {
+ switch ( s ) {
+ case Attr::EVENT:
+ return "event";
+ break;
+ case Attr::METER:
+ return "meter";
+ break;
+ case Attr::LABEL:
+ return "label";
+ break;
+ case Attr::LIMIT:
+ return "limit";
+ break;
+ case Attr::VARIABLE:
+ return "variable";
+ break;
+ case Attr::UNKNOWN:
+ return "unknown";
+ break;
+ default:
+ assert(false); break;
+ }
+ assert(false);
+ return NULL;
+}
+
+Attr::Type Attr::to_attr( const std::string& str ) {
+ if ( str == "event" ) return Attr::EVENT;
+ if ( str == "meter" ) return Attr::METER;
+ if ( str == "label" ) return Attr::LABEL;
+ if ( str == "limit" ) return Attr::LIMIT;
+ if ( str == "variable" ) return Attr::VARIABLE;
+ return Attr::UNKNOWN;
+}
+
+bool Attr::is_valid( const std::string& str ) {
+ return (to_attr(str) == Attr::UNKNOWN) ? false : true;
+}
+
+std::vector< std::string > Attr::all_attrs() {
+ std::vector<std::string> vec;
+ vec.reserve( 5 );
+ vec.push_back( "event" );
+ vec.push_back( "meter" );
+ vec.push_back( "label" );
+ vec.push_back( "limit" );
+ vec.push_back( "variable" );
+ return vec;
+}
+
+std::vector<Attr::Type> Attr::attrs()
+{
+ std::vector<Attr::Type> vec;
+ vec.reserve(5);
+ vec.push_back( Attr::UNKNOWN );
+ vec.push_back( Attr::EVENT );
+ vec.push_back( Attr::METER );
+ vec.push_back( Attr::LABEL );
+ vec.push_back( Attr::LIMIT );
+ vec.push_back( Attr::VARIABLE );
+ return vec;
+}
+}
diff --git a/ANode/src/CmdContext.cpp b/ANode/src/Attr.hpp
similarity index 52%
copy from ANode/src/CmdContext.cpp
copy to ANode/src/Attr.hpp
index 19165c2..a4e9f2e 100644
--- a/ANode/src/CmdContext.cpp
+++ b/ANode/src/Attr.hpp
@@ -1,29 +1,34 @@
-//============================================================================
+#ifndef ATTR_HPP_
+#define ATTR_HPP_
// Name :
+//============================================================================
// Author : Avi
// Revision : $Revision: #16 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
// granted to it by virtue of its status as an intergovernmental organisation
// nor does it submit to any jurisdiction.
+//
+// Description :
//============================================================================
-#include "CmdContext.hpp"
+#include <boost/noncopyable.hpp>
+#include <string>
+#include <vector>
namespace ecf {
-bool CmdContext::in_command_ = false;
-
-CmdContext::CmdContext()
-{
- in_command_ = true;
-}
-
-CmdContext::~CmdContext()
-{
- in_command_ = false;
-}
+class Attr : private boost::noncopyable {
+public:
+ enum Type { UNKNOWN=0, EVENT=1, METER=2, LABEL=3, LIMIT=4, VARIABLE=5 };
+ static const char* to_string(Attr::Type s);
+ static Attr::Type to_attr(const std::string& attr);
+ static bool is_valid(const std::string& state);
+ static std::vector<std::string> all_attrs();
+ static std::vector<Attr::Type> attrs();
+};
}
+#endif
diff --git a/ANode/src/CheckPtContext.cpp b/ANode/src/CheckPtContext.cpp
index f0c9583..c2e0935 100644
--- a/ANode/src/CheckPtContext.cpp
+++ b/ANode/src/CheckPtContext.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #16 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/CheckPtContext.hpp b/ANode/src/CheckPtContext.hpp
index 11c5043..d35c35d 100644
--- a/ANode/src/CheckPtContext.hpp
+++ b/ANode/src/CheckPtContext.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/ChildAttrs.cpp b/ANode/src/ChildAttrs.cpp
index 3d51027..48c68c1 100644
--- a/ANode/src/ChildAttrs.cpp
+++ b/ANode/src/ChildAttrs.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #285 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -13,6 +13,7 @@
// Description :
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
#include <assert.h>
+#include <boost/bind.hpp>
#include "ChildAttrs.hpp"
#include "Str.hpp"
@@ -57,6 +58,31 @@ void ChildAttrs::requeue_labels()
for(size_t i = 0; i < labels_.size(); i++) { labels_[i].reset(); }
}
+void ChildAttrs::sort_attributes( ecf::Attr::Type attr)
+{
+ switch ( attr ) {
+ case Attr::EVENT:
+ sort(events_.begin(),events_.end(),boost::bind(Str::caseInsLess,
+ boost::bind(&Event::name_or_number,_1),
+ boost::bind(&Event::name_or_number,_2)));
+ break;
+ case Attr::METER:
+ sort(meters_.begin(),meters_.end(),boost::bind(Str::caseInsLess,
+ boost::bind(&Meter::name,_1),
+ boost::bind(&Meter::name,_2)));
+ break;
+ case Attr::LABEL:
+ sort(labels_.begin(),labels_.end(),boost::bind(Str::caseInsLess,
+ boost::bind(&Label::name,_1),
+ boost::bind(&Label::name,_2)));
+ break;
+ case Attr::LIMIT: break;
+ case Attr::VARIABLE: break;
+ case Attr::UNKNOWN: break;
+ default: break;
+ }
+}
+
void ChildAttrs::clear()
{
meters_.clear();
@@ -522,33 +548,31 @@ const Label& ChildAttrs::find_label(const std::string& name) const
}
-void ChildAttrs::set_memento( const NodeEventMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void ChildAttrs::set_memento( const NodeEventMemento* memento) {
#ifdef DEBUG_MEMENTO
std::cout << "ChildAttrs::set_memento(const NodeEventMemento* memento) " << node_->debugNodePath() << "\n";
#endif
if (set_event(memento->event_.name_or_number(), memento->event_.value())) {
- aspects.push_back(ecf::Aspect::EVENT);
return;
}
addEvent( memento->event_);
}
-void ChildAttrs::set_memento( const NodeMeterMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void ChildAttrs::set_memento( const NodeMeterMemento* memento) {
#ifdef DEBUG_MEMENTO
std::cout << "ChildAttrs::set_memento(const NodeMeterMemento* memento) " << node_->debugNodePath() << "\n";
#endif
if (set_meter(memento->meter_.name(), memento->meter_.value())) {
- aspects.push_back(ecf::Aspect::METER);
return;
}
addMeter(memento->meter_);
}
-void ChildAttrs::set_memento( const NodeLabelMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void ChildAttrs::set_memento( const NodeLabelMemento* memento) {
#ifdef DEBUG_MEMENTO
std::cout << "ChildAttrs::set_memento(const NodeLabelMemento* memento) " << node_->debugNodePath() << "\n";
@@ -558,7 +582,6 @@ void ChildAttrs::set_memento( const NodeLabelMemento* memento,std::vector<ecf::A
for(size_t i = 0; i < theSize; i++) {
if (labels_[i].name() == memento->label_.name()) {
labels_[i] = memento->label_;
- aspects.push_back(ecf::Aspect::LABEL);
return;
}
}
diff --git a/ANode/src/ChildAttrs.hpp b/ANode/src/ChildAttrs.hpp
index 3a24850..aa75804 100644
--- a/ANode/src/ChildAttrs.hpp
+++ b/ANode/src/ChildAttrs.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #234 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -25,6 +25,7 @@
#include "NodeAttr.hpp"
#include "NodeFwd.hpp"
#include "Aspect.hpp"
+#include "Attr.hpp"
class ChildAttrs : private boost::noncopyable {
public:
@@ -39,6 +40,7 @@ public:
void begin();
void requeue();
void requeue_labels();
+ void sort_attributes( ecf::Attr::Type at);
// standard functions: ==============================================
std::ostream& print(std::ostream&) const;
@@ -79,9 +81,9 @@ public:
bool clear_event( const std::string& event_name_or_number);
// mementos functions:
- void set_memento(const NodeEventMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeMeterMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeLabelMemento*,std::vector<ecf::Aspect::Type>& aspects );
+ void set_memento(const NodeEventMemento*);
+ void set_memento(const NodeMeterMemento*);
+ void set_memento(const NodeLabelMemento*);
// Find functions: ============================================================
bool findLabel(const std::string& name) const;
diff --git a/ANode/src/ClientSuiteMgr.cpp b/ANode/src/ClientSuiteMgr.cpp
index 281b1bf..672963a 100644
--- a/ANode/src/ClientSuiteMgr.cpp
+++ b/ANode/src/ClientSuiteMgr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #23 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/ClientSuiteMgr.hpp b/ANode/src/ClientSuiteMgr.hpp
index f63458f..efc20a0 100644
--- a/ANode/src/ClientSuiteMgr.hpp
+++ b/ANode/src/ClientSuiteMgr.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #24 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/ClientSuites.cpp b/ANode/src/ClientSuites.cpp
index b7caddb..5e2c0e8 100644
--- a/ANode/src/ClientSuites.cpp
+++ b/ANode/src/ClientSuites.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #35 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -182,16 +182,7 @@ defs_ptr ClientSuites::create_defs(defs_ptr server_defs) const
// Create defs to be sent to the client, with the registered suites.
defs_ptr newly_created_defs = Defs::create();
- {
- // Initialise the defs state. We need to reflect the real state.
- newly_created_defs->set_state( server_defs->state() );
-
- // Initialise the server state
- newly_created_defs->set_server().set_state( server_defs->server().get_state() );
- newly_created_defs->set_server().set_user_variables( server_defs->server().user_variables() );
- newly_created_defs->set_server().set_server_variables( server_defs->server().server_variables() );
- }
-
+ newly_created_defs->copy_defs_state_only(server_defs);
// Store the state/modify change number to the newly created defs *over* the objects that have changed
unsigned int the_max_state_change_no = server_defs->defs_only_max_state_change_no();
diff --git a/ANode/src/ClientSuites.hpp b/ANode/src/ClientSuites.hpp
index 156c114..8e97b0b 100644
--- a/ANode/src/ClientSuites.hpp
+++ b/ANode/src/ClientSuites.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #26 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/CmdContext.cpp b/ANode/src/CmdContext.cpp
index 19165c2..8f4fc4d 100644
--- a/ANode/src/CmdContext.cpp
+++ b/ANode/src/CmdContext.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #16 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/CmdContext.hpp b/ANode/src/CmdContext.hpp
index 60d5815..0013ade 100644
--- a/ANode/src/CmdContext.hpp
+++ b/ANode/src/CmdContext.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/Defs.cpp b/ANode/src/Defs.cpp
index 8f67664..cdab6aa 100644
--- a/ANode/src/Defs.cpp
+++ b/ANode/src/Defs.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #270 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -41,6 +41,7 @@
#include "Indentor.hpp"
#include "AbstractObserver.hpp"
#include "CheckPtContext.hpp"
+#include "SuiteChanged.hpp"
using namespace ecf;
using namespace std;
@@ -86,10 +87,26 @@ Defs::Defs(const Defs& rhs) :
// std::vector<AbstractObserver*> observers_;
}
+void Defs::copy_defs_state_only(defs_ptr server_defs)
+{
+ if ( !server_defs ) return;
+
+ // Initialise the defs state. We need to reflect the real state.
+ set_state( server_defs->state() );
+
+ // initialise flag
+ flag_ = server_defs->get_flag();
+
+ // Initialise the server state
+ set_server().set_state( server_defs->server().get_state() );
+ set_server().set_user_variables( server_defs->server().user_variables() );
+ set_server().set_server_variables( server_defs->server().server_variables() );
+}
+
Defs& Defs::operator=(const Defs& rhs)
{
if (this != &rhs) {
- Defs tmp(rhs);
+ Defs tmp(rhs); // does *NOT* use Suite::operator=(const Suite& rhs), we use copy/swap
std::swap(state_,tmp.state_);
std::swap(server_,tmp.server_);
@@ -506,6 +523,18 @@ void Defs::requeue()
set_most_significant_state();
}
+void Defs::sort_attributes(ecf::Attr::Type attr,bool recursive)
+{
+ if (attr == ecf::Attr::VARIABLE) server_.sort_variables();
+
+ if (recursive) {
+ size_t theSuiteVecSize = suiteVec_.size();
+ for(size_t s = 0; s < theSuiteVecSize; s++) {
+ SuiteChanged changed(suiteVec_[s]);
+ suiteVec_[s]->sort_attributes(attr,recursive);
+ }
+ }
+}
void Defs::check_suite_can_begin(suite_ptr suite) const
{
@@ -1278,25 +1307,29 @@ void Defs::order(Node* immediateChild, NOrder::Order ord)
}
}
-void Defs::top_down_why(std::vector<std::string>& theReasonWhy) const
+void Defs::top_down_why(std::vector<std::string>& theReasonWhy,bool html_tags) const
{
- why(theReasonWhy);
- size_t theSuiteVecSize = suiteVec_.size();
- for(size_t s = 0; s < theSuiteVecSize; s++) { suiteVec_[s]->top_down_why(theReasonWhy);}
+ bool why_found = why(theReasonWhy,html_tags);
+ if (!why_found) {
+ size_t theSuiteVecSize = suiteVec_.size();
+ for(size_t s = 0; s < theSuiteVecSize; s++) { (void)suiteVec_[s]->top_down_why(theReasonWhy,html_tags);}
+ }
}
-void Defs::why(std::vector<std::string>& theReasonWhy) const
+bool Defs::why(std::vector<std::string>& theReasonWhy,bool html) const
{
if (isSuspended()) {
std::string the_reason = "The server is *not* RUNNING.";
theReasonWhy.push_back(the_reason);
+ return true;
}
else if (state() != NState::QUEUED && state() != NState::ABORTED) {
std::stringstream ss;
- ss << "The definition state(" << NState::toString(state()) << ") is not queued or aborted.";
+ if (html) ss << "The definition state(" << NState::to_html(state()) << ") is not queued or aborted.";
+ else ss << "The definition state(" << NState::toString(state()) << ") is not queued or aborted.";
theReasonWhy.push_back(ss.str());
}
- server_.why(theReasonWhy);
+ return server_.why(theReasonWhy);
}
std::string Defs::toString() const
@@ -1392,41 +1425,49 @@ unsigned int Defs::defs_only_max_state_change_no() const
return max_change_no;
}
-void Defs::set_memento(const StateMemento* memento,std::vector<ecf::Aspect::Type>& aspects) {
-
+void Defs::set_memento(const StateMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only) {
#ifdef DEBUG_MEMENTO
std::cout << "Defs::set_memento(const StateMemento* memento)\n";
#endif
- aspects.push_back(ecf::Aspect::STATE);
- set_state( memento->state_ );
+
+ if (aspect_only) aspects.push_back(ecf::Aspect::STATE);
+ else set_state( memento->state_ );
}
-void Defs::set_memento( const ServerStateMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Defs::set_memento( const ServerStateMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only) {
#ifdef DEBUG_MEMENTO
std::cout << "Defs::set_memento(const ServerStateMemento* memento)\n";
#endif
- aspects.push_back(ecf::Aspect::SERVER_STATE);
- server_.set_state( memento->state_ );
+
+ if (aspect_only) aspects.push_back(ecf::Aspect::SERVER_STATE);
+ else server_.set_state( memento->state_ );
}
-void Defs::set_memento( const ServerVariableMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Defs::set_memento( const ServerVariableMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Defs::set_memento(const ServerVariableMemento* memento)\n";
#endif
- if (server_.user_variables().size() != memento->serverEnv_.size()) {
- aspects.push_back(ecf::Aspect::ADD_REMOVE_ATTR);
+ if (aspect_only) {
+ if (server_.user_variables().size() != memento->serverEnv_.size()) {
+ aspects.push_back(ecf::Aspect::ADD_REMOVE_ATTR);
+ }
+ aspects.push_back(ecf::Aspect::SERVER_VARIABLE);
+ return;
}
- aspects.push_back(ecf::Aspect::SERVER_VARIABLE);
-
server_.set_user_variables( memento->serverEnv_);
}
-void Defs::set_memento( const OrderMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Defs::set_memento( const OrderMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only) {
#ifdef DEBUG_MEMENTO
std::cout << "Defs::set_memento(const OrderMemento* memento)\n";
#endif
+ if (aspect_only) {
+ aspects.push_back(ecf::Aspect::ORDER);
+ return;
+ }
+
// Order the suites
// Order nodeVec_ according to memento ordering
@@ -1450,17 +1491,17 @@ void Defs::set_memento( const OrderMemento* memento,std::vector<ecf::Aspect::Typ
std::cout << "Defs::set_memento could not find all the names\n";
return;
}
- aspects.push_back(ecf::Aspect::ORDER);
suiteVec_ = vec;
}
-void Defs::set_memento( const FlagMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Defs::set_memento( const FlagMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only) {
#ifdef DEBUG_MEMENTO
std::cout << "Defs::set_memento(const FlagMemento* memento)\n";
#endif
- aspects.push_back(ecf::Aspect::FLAG);
- flag_.set_flag( memento->flag_.flag() );
+
+ if (aspect_only) aspects.push_back(ecf::Aspect::FLAG);
+ else flag_.set_flag( memento->flag_.flag() );
}
// =====================================================================
@@ -1512,6 +1553,13 @@ void Defs::notify_delete()
assert(observers_.empty());
}
+void Defs::notify_start(const std::vector<ecf::Aspect::Type>& aspects)
+{
+ for(size_t i = 0; i < observers_.size(); i++) {
+ observers_[i]->update_start(this,aspects);
+ }
+}
+
void Defs::notify(const std::vector<ecf::Aspect::Type>& aspects)
{
for(size_t i = 0; i < observers_.size(); i++) {
diff --git a/ANode/src/Defs.hpp b/ANode/src/Defs.hpp
index 643a6a5..218bdc4 100644
--- a/ANode/src/Defs.hpp
+++ b/ANode/src/Defs.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #165 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -45,6 +45,7 @@
#include "Suite.hpp"
#include "CheckPt.hpp"
#include "Archive.hpp"
+#include "Attr.hpp"
class Limit;
class AbstractObserver;
@@ -59,6 +60,7 @@ public:
~Defs();
+ void copy_defs_state_only(defs_ptr defs); // needed when creating defs for client handles
bool operator==(const Defs& rhs) const;
std::ostream& print(std::ostream&) const ;
@@ -169,6 +171,10 @@ public:
/// returns true if defs has cron,time,day,date or today time dependencies
bool hasTimeDependencies() const;
+ /// recursively sort the attributes
+ // expect one attr to be [ event | meter | label | limits | variable ]
+ void sort_attributes(ecf::Attr::Type attr, bool recursive = true);
+
/// This function is called when ALL definition has been parsed successfully
/// Client Side:: The client side has externs, hence any references to node paths
/// in the triggers expression, that are un-resolved and not in
@@ -239,8 +245,8 @@ public:
void order(Node* immediateChild, NOrder::Order);
/// determines why the node is not running.
- void top_down_why(std::vector<std::string>& theReasonWhy) const;
- void why(std::vector<std::string>& theReasonWhy) const;
+ void top_down_why(std::vector<std::string>& theReasonWhy,bool html_tags = false) const;
+ bool why(std::vector<std::string>& theReasonWhy,bool html_tags = false) const; // return true if why found
/// Function to save the defs as a checkpoint file. File saved to the file name
/// Can throw exception
@@ -271,11 +277,11 @@ public:
/// Memento functions:
void collateChanges(unsigned int client_handle,DefsDelta&) const;
- void set_memento(const StateMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const ServerStateMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const ServerVariableMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const OrderMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const FlagMemento*,std::vector<ecf::Aspect::Type>& aspects );
+ void set_memento(const StateMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const ServerStateMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const ServerVariableMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const OrderMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const FlagMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
/// Find the max state change number for defs only. This includes:
/// o the Defs state.
@@ -357,6 +363,7 @@ private:
friend class ChangeStartNotification;
void notify_delete();
public:
+ void notify_start(const std::vector<ecf::Aspect::Type>& aspects);
void notify(const std::vector<ecf::Aspect::Type>& aspects);
void attach(AbstractObserver*);
void detach(AbstractObserver*);
diff --git a/ANode/src/DefsDelta.cpp b/ANode/src/DefsDelta.cpp
index 039958a..fc6980d 100644
--- a/ANode/src/DefsDelta.cpp
+++ b/ANode/src/DefsDelta.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #23 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/DefsDelta.hpp b/ANode/src/DefsDelta.hpp
index 9b057f1..f15466f 100644
--- a/ANode/src/DefsDelta.hpp
+++ b/ANode/src/DefsDelta.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #23 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/EcfFile.cpp b/ANode/src/EcfFile.cpp
index 256a127..3fba2fe 100644
--- a/ANode/src/EcfFile.cpp
+++ b/ANode/src/EcfFile.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #66 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -15,6 +15,7 @@
#include <sstream>
#include <sys/stat.h>
#include <iostream>
+#include <cerrno>
#include "boost/foreach.hpp"
#include "boost/filesystem/operations.hpp"
@@ -162,7 +163,7 @@ void EcfFile::script(std::string& theScript) const
if ( script_type_ == EcfFile::ECF_FILE) {
if (!File::open(script_path_or_cmd_,theScript)) {
std::stringstream ss;
- ss << "EcfFile::script: Could not open script for task/alias " << node_->absNodePath() << " at path " << script_path_or_cmd_;
+ ss << "EcfFile::script: Could not open script for task/alias " << node_->absNodePath() << " at path " << script_path_or_cmd_ << " (" << strerror(errno) << ")";
throw std::runtime_error(ss.str());
}
return;
@@ -379,7 +380,7 @@ bool EcfFile::open_script_file(
return open_include_file(file_or_cmd,lines,errormsg);
}
if ( ! File::splitFileIntoLines(file_or_cmd, lines) ) {
- std::stringstream ss; ss << "Could not open " << fileType(type) << " file:" << file_or_cmd;
+ std::stringstream ss; ss << "Could not open " << fileType(type) << " file:" << file_or_cmd << " (" << strerror(errno) << ")";
errormsg += ss.str();
return false;
}
@@ -411,7 +412,7 @@ bool EcfFile::open_script_file(
case EcfFile::MANUAL:
case EcfFile::COMMENT:
if ( ! File::splitFileIntoLines(file_or_cmd, lines) ) {
- std::stringstream ss; ss << "Could not open " << fileType(type) << " file:" << file_or_cmd;
+ std::stringstream ss; ss << "Could not open " << fileType(type) << " file:" << file_or_cmd << " (" << strerror(errno) << ")";
errormsg += ss.str();
return false;
}
@@ -424,22 +425,31 @@ bool EcfFile::open_script_file(
}
#define USE_INCLUDE_CACHE 1
+// ulimit -Hn # hard limit, of number of open files allowed
+// ulimit -Sn # soft limit
+// ulimit -n <new-limit> # takes affect on current shell only
+//
+// Check limit of running process:
+// ps aux | grep process-name
+// cat /proc/XXX/limits
// max open files allowed is:
// VM: cat /proc/sys/fs/file-max: 188086
// Desk top: cat /proc/sys/fs/file-max: 3270058
// Desktop:
-// Without cache: real:10.15 user: 5.58 sys: 1.62
-// With cache: real: 4.46 user: 3.72 sys: 0.74 Only open/close include file once.
-// TODO: Could sort
+// Without cache: real:10.15 user: 5.58 sys: 1.62 # opensuse131
+// With cache: real: 4.46 user: 3.72 sys: 0.74 Only open/close include file once. # opensuse131
+// With cache: real: 3.82 user: 3.22 sys: 0.59 Only open/close include file once. # leap42
+//
bool EcfFile::open_include_file(const std::string& file,std::vector<std::string>& lines,std::string& errormsg) const
{
#ifdef USE_INCLUDE_CACHE
+ // SEARCH THE CACHE
size_t include_file_cache_size = include_file_cache_.size();
for(size_t i = 0; i < include_file_cache_size; i++) {
if (include_file_cache_[i]->path() == file) {
- // cout << "found " << file << " in cache, cache size = " << include_file_cache_.size() << "\n";
+ //cout << "found " << file << " in cache, cache size = " << include_file_cache_.size() << "\n";
if (!include_file_cache_[i]->lines(lines)) {
- std::stringstream ss; ss << "Could not open include file: " << file;
+ std::stringstream ss; ss << "Could not open include file: " << file << " (" << strerror(errno) << ") : include file cache size:" << include_file_cache_.size();
errormsg += ss.str();
return false;
}
@@ -447,18 +457,37 @@ bool EcfFile::open_include_file(const std::string& file,std::vector<std::string>
}
}
+ //cout << "NOT found " << file << " in cache, cache size = " << include_file_cache_.size() << "\n";
+
+ // ADD to cache
boost::shared_ptr<IncludeFileCache> ptr = boost::make_shared<IncludeFileCache>(file);
include_file_cache_.push_back( ptr );
- //cout << "NOT found " << file << " in cache, cache size = " << include_file_cache_.size() << "\n";
if (!ptr->lines(lines)) {
- std::stringstream ss; ss << "Could not open include file: " << file;
- errormsg += ss.str();
- return false;
+ if ( errno == EMFILE/*Too many open files*/) {
+
+ log(Log::WAR,"EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn");
+ include_file_cache_.clear();
+
+ boost::shared_ptr<IncludeFileCache> a_ptr = boost::make_shared<IncludeFileCache>(file);
+ include_file_cache_.push_back( a_ptr );
+ if (!a_ptr->lines(lines)) {
+ std::stringstream ss;
+ ss << "Could not open include file: " << file << " (" << strerror(errno) << ") include file cache size:" << include_file_cache_.size() ;
+ errormsg += ss.str();
+ return false;
+ }
+ }
+ else {
+ std::stringstream ss;
+ ss << "Could not open include file: " << file << " (" << strerror(errno) << ") include file cache size:" << include_file_cache_.size() ;
+ errormsg += ss.str();
+ return false;
+ }
}
#else
if ( ! File::splitFileIntoLines(file, lines) ) {
- std::stringstream ss; ss << "Could not open include file:" << file;
+ std::stringstream ss; ss << "Could not open include file:" << file << " (" << strerror(errno) << ")";
errormsg += ss.str();
return false;
}
@@ -471,7 +500,7 @@ bool EcfFile::do_popen(const std::string& the_cmd, EcfFile::Type type, std::vect
FILE *fp = popen(the_cmd.c_str(),"r");
if (!fp) {
std::stringstream ss;
- ss << "Could not open " << fileType(type) << " via cmd " << the_cmd << " for task " << node_->absNodePath() << " ";
+ ss << "Could not open " << fileType(type) << " via cmd " << the_cmd << " for task " << node_->absNodePath() << " (" << strerror(errno) << ") ";
errormsg += ss.str();
return false;
}
@@ -789,7 +818,7 @@ const std::string& EcfFile::doCreateJobFile(JobsParam& jobsParam) const
if (!File::createMissingDirectories(ecf_job)) {
std::stringstream ss;
- ss << "EcfFile::doCreateJobFile: Could not create missing directories for ECF_JOB " << ecf_job << " File system full?";
+ ss << "EcfFile::doCreateJobFile: Could not create missing directories for ECF_JOB " << ecf_job << " (" << strerror(errno) << ")";
throw std::runtime_error(ss.str());
}
@@ -797,14 +826,30 @@ const std::string& EcfFile::doCreateJobFile(JobsParam& jobsParam) const
std::string error_msg;
if (!File::create(ecf_job, jobLines_,error_msg)) {
std::stringstream ss;
- ss << "EcfFile::doCreateJobFile: Could not create job file " << ecf_job << " " << error_msg << " File system full?";
- throw std::runtime_error(ss.str());
+ if ( errno == EMFILE/*Too many open files*/) {
+ // CLEAR cache and try again. Can test with ulimit -n 60, (Base/bin/gcc-5.3.0/release/perf_job_gen ./metabuilder.def)
+ LogToCout log_to_cout;
+ ss << "EcfFile::doCreateJobFile: Too many files open(errno=EMFILE), include file cache size(" << include_file_cache_.size() << ") Clearing cache. Check limits with ulimit -Sn";
+ log(Log::WAR,ss.str());
+
+ include_file_cache_.clear();
+
+ error_msg.clear();
+ if (!File::create(ecf_job, jobLines_,error_msg)) {
+ ss << "EcfFile::doCreateJobFile: Could not create job file : " << error_msg << " (" << strerror(errno) << ")";
+ throw std::runtime_error(ss.str());
+ }
+ }
+ else {
+ ss << "EcfFile::doCreateJobFile: Could not create job file : " << error_msg << " (" << strerror(errno) << ")";
+ throw std::runtime_error(ss.str());
+ }
}
// make the job file executable
if ( chmod( ecf_job.c_str(), 0755 ) != 0 ) {
std::stringstream ss;
- ss << "EcfFile::doCreateJobFile: Could not make job file " << ecf_job << " executable by using chmod";
+ ss << "EcfFile::doCreateJobFile: Could not make job file " << ecf_job << " executable by using chmod (" << strerror(errno) << ")";
throw std::runtime_error(ss.str());
}
@@ -1308,7 +1353,6 @@ void PreProcessor::preProcess_includes(const std::string& script_line)
if (!fnd_includenopp) {
fnd_includeonce = (script_line.find(T_INCLUDEONCE) == 1);
if (!fnd_includeonce) fnd_include = (script_line.find(T_INCLUDE) == 1);
- fnd_include = (script_line.find(T_INCLUDE) == 1);
}
if (!fnd_include && !fnd_includenopp && !fnd_includeonce) return;
@@ -1324,11 +1368,11 @@ void PreProcessor::preProcess_includes(const std::string& script_line)
std::string includedFile = getIncludedFilePath(tokens_[1], script_line, error_msg_);
if (!error_msg_.empty()) return;
- // handle %include || %includeonce of include that was specified as %includeonce
- if (std::find(include_once_set_.begin(),include_once_set_.end(),includedFile) != include_once_set_.end() ) {
- return; // Already processed once ignore
- }
+ // handle %includeonce
if (fnd_includeonce) {
+ if (std::find(include_once_set_.begin(),include_once_set_.end(),includedFile) != include_once_set_.end() ) {
+ return; // Already processed once ignore
+ }
include_once_set_.push_back(includedFile);
}
diff --git a/ANode/src/EcfFile.hpp b/ANode/src/EcfFile.hpp
index bc7186e..cc8c7c7 100644
--- a/ANode/src/EcfFile.hpp
+++ b/ANode/src/EcfFile.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #23 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/ExprAst.cpp b/ANode/src/ExprAst.cpp
index 833e8e6..b6e84f7 100644
--- a/ANode/src/ExprAst.cpp
+++ b/ANode/src/ExprAst.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #57 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -20,6 +20,7 @@
#include "Indentor.hpp"
#include "ExprAstVisitor.hpp"
#include "Node.hpp"
+#include "Defs.hpp"
#include "Log.hpp"
#include "Str.hpp"
#include "Cal.hpp"
@@ -31,6 +32,26 @@ using namespace std;
Ast::~Ast() {}
+//#define DEBUG_WHY 1
+
+bool Ast::why(std::string& theReasonWhy,bool html) const
+{
+ if (evaluate()) {
+#ifdef DEBUG_WHY
+ std::cout << " Ast::why evaluates returning\n";
+#endif
+ return false;
+ }
+
+ theReasonWhy = "expression ";
+ theReasonWhy += why_expression(html); // provide additional state
+ theReasonWhy += " does not evaluate";
+#ifdef DEBUG_WHY
+ std::cout << " Ast::why reason = " << theReasonWhy << "\n";
+#endif
+ return true;
+}
+
////////////////////////////////////////////////////////////////////////////////////
AstTop::~AstTop() { delete root_;}
@@ -69,7 +90,7 @@ bool AstTop::check(std::string& error_msg) const
std::ostream& AstTop::print(std::ostream& os) const
{
Indentor in;
- Indentor::indent(os) << "# AST\n";
+ Indentor::indent(os) << "# AstTop\n";
if (root_) {
Indentor in;
return root_->print(os);
@@ -84,28 +105,46 @@ void AstTop::print_flat(std::ostream& os,bool add_bracket) const
}
}
-//#define DEBUG_WHY 1
-bool AstTop::why(std::string& theReasonWhy) const
+bool AstTop::is_valid_ast(std::string& error_msg) const
+{
+ if (root_) {
+ return root_->is_valid_ast(error_msg);
+ }
+ error_msg = "AstTop: Abstract syntax tree creation failed";
+ return false;
+}
+
+bool AstTop::why(std::string& theReasonWhy,bool html) const
{
if (evaluate()) {
#ifdef DEBUG_WHY
- std::cout << " AstTop::why evaluate returning\n";
+ std::cout << " AstTop::why evaluates returning\n";
#endif
return false;
}
- return root_->why(theReasonWhy);
+ return root_->why(theReasonWhy,html);
}
-std::string AstTop::expression(bool why) const
+std::string AstTop::expression() const
{
- std::string ret = exprType_;
+ std::string ret = exprType_;
if (root_) {
ret += " ";
- ret += root_->expression(why);
+ ret += root_->expression();
}
return ret;
}
+std::string AstTop::why_expression(bool html) const
+{
+ std::string ret = exprType_;
+ if (root_) {
+ ret += " ";
+ ret += root_->why_expression(html);
+ }
+ return ret;
+}
+
void AstTop::setParentNode(Node* p)
{
if (root_) root_->setParentNode(p);
@@ -151,11 +190,14 @@ void AstRoot::addChild( Ast* n )
}
std::ostream& AstRoot::print( std::ostream& os ) const {
- if (left_->isRoot()) {
- Indentor in;
- left_->print( os );
- }
- else left_->print( os );
+ // left_ should not be NULL, but keep clang static analyser happy
+ if (left_) {
+ if (left_->isRoot()) {
+ Indentor in;
+ left_->print( os );
+ }
+ else left_->print( os );
+ }
if (right_) { // right_ is empty for Not
if (right_->isRoot()) {
@@ -167,22 +209,47 @@ std::ostream& AstRoot::print( std::ostream& os ) const {
return os;
}
-bool AstRoot::why(std::string& theReasonWhy) const
+std::string AstRoot::do_why_expression(const std::string& root,bool html) const
{
- if (evaluate()) {
-#ifdef DEBUG_WHY
- std::cout << " AstRoot::why evaluates returning\n";
-#endif
- return false;
- }
+ std::string ret;
+ if (left_) ret += left_->why_expression(html);
+ ret += root;
+ if (right_) ret += right_->why_expression(html);
+ return ret;
+}
- theReasonWhy = "expression ";
- theReasonWhy += expression(true); // provide additional state
- theReasonWhy += " does not evaluate";
-#ifdef DEBUG_WHY
- std::cout << " AstRoot::why reason = " << theReasonWhy << "\n";
-#endif
- return true;
+std::string AstRoot::do_bracket_why_expression(const std::string& root,bool html) const
+{
+ std::string ret = "(";
+ ret += do_why_expression(root,html);
+ ret += ")";
+ return ret;
+}
+
+std::string AstRoot::do_false_bracket_why_expression(const std::string& root,bool html) const
+{
+ std::string ret;
+ if (html) ret += "<false>"; // still need guard with html for ecflowview
+ ret += do_bracket_why_expression(root,html);
+ if (html) ret += "</false>";
+ return ret;
+}
+
+std::string AstRoot::do_expression(const std::string& root ) const
+{
+ std::string ret;
+ if (left_) ret += left_->expression();
+ ret += root;
+ if (right_) ret += right_->expression();
+ return ret;
+}
+
+std::string AstRoot::do_bracket_expression(const std::string& root ) const
+{
+ std::string ret = "(";
+ ret += do_expression(root);
+ ret += ")";
+ return ret;
}
void AstRoot::setParentNode(Node* p)
@@ -213,6 +280,19 @@ std::ostream& AstNot::print( std::ostream& os ) const {
return AstRoot::print( os );
}
+bool AstNot::is_valid_ast(std::string& error_msg) const
+{
+ if (right_) {
+ error_msg = "AstNot: should only have a single root";
+ return false;
+ }
+ if (!left_) {
+ error_msg = "AstNot: Does not have root";
+ return false;
+ }
+ return left_->is_valid_ast(error_msg);
+}
+
void AstNot::print_flat( std::ostream& os,bool add_bracket) const {
os << name_;
if (left_) {
@@ -222,12 +302,24 @@ void AstNot::print_flat( std::ostream& os,bool add_bracket) const {
}
}
-std::string AstNot::expression(bool why) const
+std::string AstNot::expression() const
{
std::string ret = "NOT ";
- ret += left_->expression(why);
+ ret += left_->expression();
return ret;
}
+
+std::string AstNot::why_expression(bool html) const
+{
+ if (evaluate()) return "true";
+
+ std::string ret;
+ if (html) ret += "<false>";
+ ret += "not ";
+ ret += left_->why_expression(html);
+ if (html) ret += "</false>";
+ return ret;
+}
////////////////////////////////////////////////////////////////////////////////////
void AstPlus::accept(ExprAstVisitor& v)
@@ -252,6 +344,16 @@ std::ostream& AstPlus::print( std::ostream& os ) const {
return AstRoot::print( os );
}
+bool AstPlus::is_valid_ast(std::string& error_msg) const
+{
+ if (!left_) { error_msg = "AstPlus: has no left part"; return false;}
+ if (!right_) { error_msg = "AstPlus: has no right part"; return false;}
+ if ( left_->is_valid_ast(error_msg) && right_->is_valid_ast(error_msg) ) {
+ return true;
+ }
+ return false;
+}
+
void AstPlus::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << "(";
if (left_) left_->print_flat(os,add_bracket);
@@ -260,13 +362,14 @@ void AstPlus::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << ")";
}
-std::string AstPlus::expression(bool why) const
+std::string AstPlus::expression() const
{
- std::string ret;
- if (left_) ret += left_->expression(why);
- ret += " + ";
- if (right_) ret += right_->expression(why);
- return ret;
+ return do_expression(" + ");
+}
+
+std::string AstPlus::why_expression(bool html) const
+{
+ return do_why_expression(" + ",html);
}
////////////////////////////////////////////////////////////////////////////////////
@@ -293,6 +396,16 @@ std::ostream& AstMinus::print( std::ostream& os ) const {
return AstRoot::print( os );
}
+bool AstMinus::is_valid_ast(std::string& error_msg) const
+{
+ if (!left_) { error_msg = "AstMinus: has no left part"; return false;}
+ if (!right_) { error_msg = "AstMinus: has no right part"; return false;}
+ if ( left_->is_valid_ast(error_msg) && right_->is_valid_ast(error_msg) ) {
+ return true;
+ }
+ return false;
+}
+
void AstMinus::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << "(";
if (left_) left_->print_flat(os,add_bracket);
@@ -301,13 +414,14 @@ void AstMinus::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << ")";
}
-std::string AstMinus::expression(bool why) const
+std::string AstMinus::expression() const
+{
+ return do_expression(" - ");
+}
+
+std::string AstMinus::why_expression(bool html) const
{
- std::string ret;
- if (left_) ret += left_->expression(why);
- ret += " - ";
- if (right_) ret += right_->expression(why);
- return ret;
+ return do_why_expression(" - ",html);
}
////////////////////////////////////////////////////////////////////////////////////
@@ -351,6 +465,16 @@ std::ostream& AstDivide::print( std::ostream& os ) const {
return AstRoot::print( os );
}
+bool AstDivide::is_valid_ast(std::string& error_msg) const
+{
+ if (!left_) { error_msg = "AstDivide: has no left part"; return false;}
+ if (!right_) { error_msg = "AstDivide: has no right part"; return false;}
+ if ( left_->is_valid_ast(error_msg) && right_->is_valid_ast(error_msg) ) {
+ return true;
+ }
+ return false;
+}
+
void AstDivide::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << "(";
if (left_) left_->print_flat(os,add_bracket);
@@ -359,13 +483,14 @@ void AstDivide::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << ")";
}
-std::string AstDivide::expression(bool why) const
+std::string AstDivide::expression() const
{
- std::string ret;
- if (left_) ret += left_->expression(why);
- ret += " / ";
- if (right_) ret += right_->expression(why);
- return ret;
+ return do_expression(" / ");
+}
+
+std::string AstDivide::why_expression(bool html) const
+{
+ return do_why_expression(" / ",html);
}
////////////////////////////////////////////////////////////////////////////////////
@@ -392,6 +517,16 @@ std::ostream& AstMultiply::print( std::ostream& os ) const {
return AstRoot::print( os );
}
+bool AstMultiply::is_valid_ast(std::string& error_msg) const
+{
+ if (!left_) { error_msg = "AstMultiply: has no left part"; return false;}
+ if (!right_) { error_msg = "AstMultiply: has no right part"; return false;}
+ if ( left_->is_valid_ast(error_msg) && right_->is_valid_ast(error_msg) ) {
+ return true;
+ }
+ return false;
+}
+
void AstMultiply::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << "(";
if (left_) left_->print_flat(os,add_bracket);
@@ -400,13 +535,14 @@ void AstMultiply::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << ")";
}
-std::string AstMultiply::expression(bool why) const
+std::string AstMultiply::expression() const
{
- std::string ret;
- if (left_) ret += left_->expression(why);
- ret += " * ";
- if (right_) ret += right_->expression(why);
- return ret;
+ return do_expression(" * ");
+}
+
+std::string AstMultiply::why_expression(bool html) const
+{
+ return do_why_expression(" * ",html);
}
////////////////////////////////////////////////////////////////////////////////////
@@ -451,6 +587,16 @@ std::ostream& AstModulo::print( std::ostream& os ) const {
return AstRoot::print( os );
}
+bool AstModulo::is_valid_ast(std::string& error_msg) const
+{
+ if (!left_) { error_msg = "AstModulo: has no left part"; return false;}
+ if (!right_) { error_msg = "AstModulo: has no right part"; return false;}
+ if ( left_->is_valid_ast(error_msg) && right_->is_valid_ast(error_msg) ) {
+ return true;
+ }
+ return false;
+}
+
void AstModulo::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << "(";
if (left_) left_->print_flat(os,add_bracket);
@@ -459,13 +605,14 @@ void AstModulo::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << ")";
}
-std::string AstModulo::expression(bool why) const
+std::string AstModulo::expression() const
{
- std::string ret;
- if (left_) ret += left_->expression(why);
- ret += " % ";
- if (right_) ret += right_->expression(why);
- return ret;
+ return do_expression(" % ");
+}
+
+std::string AstModulo::why_expression(bool html) const
+{
+ return do_why_expression(" % ",html);
}
////////////////////////////////////////////////////////////////////////////////////
@@ -492,6 +639,16 @@ std::ostream& AstAnd::print( std::ostream& os ) const {
return AstRoot::print( os );
}
+bool AstAnd::is_valid_ast(std::string& error_msg) const
+{
+ if (!left_) { error_msg = "AstAnd: has no left part"; return false;}
+ if (!right_) { error_msg = "AstAnd: has no right part"; return false;}
+ if ( left_->is_valid_ast(error_msg) && right_->is_valid_ast(error_msg) ) {
+ return true;
+ }
+ return false;
+}
+
void AstAnd::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << "(";
if (left_) left_->print_flat(os,add_bracket);
@@ -500,14 +657,15 @@ void AstAnd::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << ")";
}
-std::string AstAnd::expression(bool why) const
+std::string AstAnd::expression() const
{
- std::string ret("(");
- if (left_) ret += left_->expression(why);
- ret += " AND ";
- if (right_) ret += right_->expression(why);
- ret += ")";
- return ret;
+ return do_bracket_expression(" AND ");
+}
+
+std::string AstAnd::why_expression(bool html) const
+{
+ if (evaluate()) return "true";
+ return do_false_bracket_why_expression(" and ",html); // false - allows GUI to colour the false expression part
}
////////////////////////////////////////////////////////////////////////////////////
@@ -534,6 +692,16 @@ std::ostream& AstOr::print( std::ostream& os ) const {
return AstRoot::print( os );
}
+bool AstOr::is_valid_ast(std::string& error_msg) const
+{
+ if (!left_) { error_msg = "AstOr: has no left part"; return false;}
+ if (!right_) { error_msg = "AstOr: has no right part"; return false;}
+ if ( left_->is_valid_ast(error_msg) && right_->is_valid_ast(error_msg) ) {
+ return true;
+ }
+ return false;
+}
+
void AstOr::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << "(";
if (left_) left_->print_flat(os,add_bracket);
@@ -542,14 +710,15 @@ void AstOr::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << ")";
}
-std::string AstOr::expression(bool why) const
+std::string AstOr::expression() const
+{
+ return do_bracket_expression(" OR ");
+}
+
+std::string AstOr::why_expression(bool html) const
{
- std::string ret("(");
- if (left_) ret += left_->expression(why);
- ret += " OR ";
- if (right_) ret += right_->expression(why);
- ret += ")";
- return ret;
+ if (evaluate()) return "true";
+ return do_false_bracket_why_expression(" or ",html); // false - allows GUI to colour the false expression part
}
////////////////////////////////////////////////////////////////////////////////////
@@ -576,6 +745,16 @@ std::ostream& AstEqual::print( std::ostream& os ) const {
return AstRoot::print( os );
}
+bool AstEqual::is_valid_ast(std::string& error_msg) const
+{
+ if (!left_) { error_msg = "AstEqual: has no left part"; return false;}
+ if (!right_) { error_msg = "AstEqual: has no right part"; return false;}
+ if ( left_->is_valid_ast(error_msg) && right_->is_valid_ast(error_msg) ) {
+ return true;
+ }
+ return false;
+}
+
void AstEqual::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << "(";
if (left_) left_->print_flat(os,add_bracket);
@@ -584,14 +763,15 @@ void AstEqual::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << ")";
}
-std::string AstEqual::expression(bool why) const
+std::string AstEqual::expression() const
{
- std::string ret("(");
- if (left_) ret += left_->expression(why);
- ret += " == ";
- if (right_) ret += right_->expression(why);
- ret += ")";
- return ret;
+ return do_bracket_expression(" == ");
+}
+
+std::string AstEqual::why_expression(bool html) const
+{
+ if (evaluate()) return "true";
+ return do_false_bracket_why_expression(" == ",html); // false - allows GUI to colour the false expression part
}
////////////////////////////////////////////////////////////////////////////////////
@@ -617,6 +797,16 @@ std::ostream& AstNotEqual::print( std::ostream& os ) const {
return AstRoot::print( os );
}
+bool AstNotEqual::is_valid_ast(std::string& error_msg) const
+{
+ if (!left_) { error_msg = "AstNotEqual: has no left part"; return false;}
+ if (!right_) { error_msg = "AstNotEqual: has no right part"; return false;}
+ if ( left_->is_valid_ast(error_msg) && right_->is_valid_ast(error_msg) ) {
+ return true;
+ }
+ return false;
+}
+
void AstNotEqual::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << "(";
if (left_) left_->print_flat(os,add_bracket);
@@ -625,14 +815,15 @@ void AstNotEqual::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << ")";
}
-std::string AstNotEqual::expression(bool why) const
+std::string AstNotEqual::expression() const
+{
+ return do_bracket_expression(" != ");
+}
+
+std::string AstNotEqual::why_expression(bool html) const
{
- std::string ret("(");
- if (left_) ret += left_->expression(why);
- ret += " != ";
- if (right_) ret += right_->expression(why);
- ret += ")";
- return ret;
+ if (evaluate()) return "true";
+ return do_false_bracket_why_expression(" != ",html); // false - allows GUI to colour the false expression part
}
////////////////////////////////////////////////////////////////////////////////////
@@ -657,6 +848,17 @@ std::ostream& AstLessEqual::print( std::ostream& os ) const {
os << "\n";
return AstRoot::print( os );
}
+
+bool AstLessEqual::is_valid_ast(std::string& error_msg) const
+{
+ if (!left_) { error_msg = "AstLessEqual: has no left part"; return false;}
+ if (!right_) { error_msg = "AstLessEqual: has no right part"; return false;}
+ if ( left_->is_valid_ast(error_msg) && right_->is_valid_ast(error_msg) ) {
+ return true;
+ }
+ return false;
+}
+
void AstLessEqual::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << "(";
if (left_) left_->print_flat(os,add_bracket);
@@ -664,14 +866,16 @@ void AstLessEqual::print_flat(std::ostream& os,bool add_bracket) const {
if (right_) right_->print_flat(os,add_bracket);
if (add_bracket) os << ")";
}
-std::string AstLessEqual::expression(bool why) const
+
+std::string AstLessEqual::expression() const
{
- std::string ret("(");
- if (left_) ret += left_->expression(why);
- ret += " <= ";
- if (right_) ret += right_->expression(why);
- ret += ")";
- return ret;
+ return do_bracket_expression(" <= ");
+}
+
+std::string AstLessEqual::why_expression(bool html) const
+{
+ if (evaluate()) return "true";
+ return do_false_bracket_why_expression(" <= ",html); // false - allows GUI to colour the false expression part
}
////////////////////////////////////////////////////////////////////////////////////
@@ -696,6 +900,17 @@ std::ostream& AstGreaterEqual::print( std::ostream& os ) const {
os << "\n";
return AstRoot::print( os );
}
+
+bool AstGreaterEqual::is_valid_ast(std::string& error_msg) const
+{
+ if (!left_) { error_msg = "AstGreaterEqual: has no left part"; return false;}
+ if (!right_) { error_msg = "AstGreaterEqual: has no right part"; return false;}
+ if ( left_->is_valid_ast(error_msg) && right_->is_valid_ast(error_msg) ) {
+ return true;
+ }
+ return false;
+}
+
void AstGreaterEqual::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << "(";
if (left_) left_->print_flat(os,add_bracket);
@@ -704,14 +919,15 @@ void AstGreaterEqual::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << ")";
}
-std::string AstGreaterEqual::expression(bool why) const
+std::string AstGreaterEqual::expression() const
+{
+ return do_bracket_expression(" >= ");
+}
+
+std::string AstGreaterEqual::why_expression(bool html) const
{
- std::string ret("(");
- if (left_) ret += left_->expression(why);
- ret += " >= ";
- if (right_) ret += right_->expression(why);
- ret += ")";
- return ret;
+ if (evaluate()) return "true";
+ return do_false_bracket_why_expression(" >= ",html); // false - allows GUI to colour the false expression part
}
////////////////////////////////////////////////////////////////////////////////////
@@ -736,6 +952,17 @@ std::ostream& AstGreaterThan::print( std::ostream& os ) const {
os << "\n";
return AstRoot::print( os );
}
+
+bool AstGreaterThan::is_valid_ast(std::string& error_msg) const
+{
+ if (!left_) { error_msg = "AstGreaterThan: has no left part"; return false;}
+ if (!right_) { error_msg = "AstGreaterThan: has no right part"; return false;}
+ if ( left_->is_valid_ast(error_msg) && right_->is_valid_ast(error_msg) ) {
+ return true;
+ }
+ return false;
+}
+
void AstGreaterThan::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << "(";
if (left_) left_->print_flat(os,add_bracket);
@@ -744,14 +971,15 @@ void AstGreaterThan::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << ")";
}
-std::string AstGreaterThan::expression(bool why) const
+std::string AstGreaterThan::expression() const
+{
+ return do_bracket_expression(" > ");
+}
+
+std::string AstGreaterThan::why_expression(bool html) const
{
- std::string ret("(");
- if (left_) ret += left_->expression(why);
- ret += " > ";
- if (right_) ret += right_->expression(why);
- ret += ")";
- return ret;
+ if (evaluate()) return "true";
+ return do_false_bracket_why_expression(" > ",html); // false - allows GUI to colour the false expression part
}
////////////////////////////////////////////////////////////////////////////////////
@@ -777,6 +1005,17 @@ std::ostream& AstLessThan::print( std::ostream& os ) const {
os << "\n";
return AstRoot::print( os );
}
+
+bool AstLessThan::is_valid_ast(std::string& error_msg) const
+{
+ if (!left_) { error_msg = "AstLessThan: has no left part"; return false;}
+ if (!right_) { error_msg = "AstLessThan: has no right part"; return false;}
+ if ( left_->is_valid_ast(error_msg) && right_->is_valid_ast(error_msg) ) {
+ return true;
+ }
+ return false;
+}
+
void AstLessThan::print_flat(std::ostream& os,bool add_bracket) const {
if (add_bracket) os << "(";
if (left_) left_->print_flat(os,add_bracket);
@@ -784,14 +1023,17 @@ void AstLessThan::print_flat(std::ostream& os,bool add_bracket) const {
if (right_) right_->print_flat(os,add_bracket);
if (add_bracket) os << ")";
}
-std::string AstLessThan::expression(bool why) const
+
+std::string AstLessThan::expression() const
+{
+ return do_bracket_expression(" < ");
+}
+
+std::string AstLessThan::why_expression(bool html) const
{
- std::string ret("(");
- if (left_) ret += left_->expression(why);
- ret += " < ";
- if (right_) ret += right_->expression(why);
- ret += ")";
- return ret;
+ if (evaluate()) return "true";
+ // Using ' < ' seems to mess up html
+ return do_false_bracket_why_expression(" lt ",html); // false - allows GUI to colour the false expression part
}
////////////////////////////////////////////////////////////////////////////////////
@@ -859,17 +1101,33 @@ void AstFunction::print_flat(std::ostream& os,bool add_brackets) const {
}
}
-std::string AstFunction::expression(bool why) const
+std::string AstFunction::expression() const
+{
+ std::stringstream ss;
+ switch (ft_) {
+ case AstFunction::DATE_TO_JULIAN: ss << "date_to_julian( arg:" << arg_->expression() << ") = " << value(); break;
+ case AstFunction::JULIAN_TO_DATE: ss << "julian_to_date( arg:" << arg_->expression() << ") = " << value(); break;
+ default: assert(false);
+ }
+ return ss.str();
+}
+
+std::string AstFunction::why_expression(bool html) const
{
std::stringstream ss;
switch (ft_) {
- case AstFunction::DATE_TO_JULIAN: ss << "date_to_julian( arg:" << arg_->expression(why) << ") = " << value(); break;
- case AstFunction::JULIAN_TO_DATE: ss << "julian_to_date( arg:" << arg_->expression(why) << ") = " << value(); break;
+ case AstFunction::DATE_TO_JULIAN: ss << "date_to_julian( arg:" << arg_->why_expression(html) << ") = " << value(); break;
+ case AstFunction::JULIAN_TO_DATE: ss << "julian_to_date( arg:" << arg_->why_expression(html) << ") = " << value(); break;
default: assert(false);
}
return ss.str();
}
+void AstFunction::setParentNode(Node* n)
+{
+ if (arg_) arg_->setParentNode(n);
+}
+
///////////////////////////////////////////////////////////////////////////////////
void AstInteger::accept(ExprAstVisitor& v)
{
@@ -891,13 +1149,18 @@ void AstInteger::print_flat(std::ostream& os,bool /*add_bracket*/) const {
os << value_;
}
-std::string AstInteger::expression(bool /*why*/) const
+std::string AstInteger::expression() const
{
std::stringstream ss;
ss << value();
return ss.str();
}
+std::string AstInteger::why_expression(bool /*html*/) const
+{
+ return expression();
+}
+
//////////////////////////////////////////////////////////////////////////////////
void AstNodeState::accept(ExprAstVisitor& v)
@@ -920,11 +1183,17 @@ void AstNodeState::print_flat(std::ostream& os,bool /*add_bracket*/) const {
os << DState::toString( state_ ) ;
}
-std::string AstNodeState::expression(bool why) const
+std::string AstNodeState::expression() const
{
return DState::toString(state_);
}
+std::string AstNodeState::why_expression(bool html) const
+{
+ if (html) return DState::to_html(state_);
+ return DState::toString(state_);
+}
+
////////////////////////////////////////////////////////////////////////////////////
void AstEventState::accept(ExprAstVisitor& v)
@@ -947,12 +1216,17 @@ void AstEventState::print_flat(std::ostream& os,bool /*add_bracket*/) const {
else os << Event::CLEAR();
}
-std::string AstEventState::expression(bool /*why*/) const
+std::string AstEventState::expression() const
{
if (state_) return Event::SET();
return Event::CLEAR();
}
+std::string AstEventState::why_expression(bool /*html*/) const
+{
+ return expression();
+}
+
////////////////////////////////////////////////////////////////////////////////////
void AstNode::accept(ExprAstVisitor& v)
@@ -992,7 +1266,7 @@ Node* AstNode::referencedNode() const
Node* AstNode::referencedNode(std::string& errorMsg) const
{
- Node* ref = get_ref_node();
+ Node* ref = get_ref_node();
if ( ref ) {
return ref;
}
@@ -1023,28 +1297,174 @@ void AstNode::print_flat(std::ostream& os,bool /*add_bracket*/) const {
os << nodePath_;
}
-std::string AstNode::expression(bool why) const
-{
- if (why) {
- Node* refNode = referencedNode(); // Only call once
- std::string ret = nodePath_;
- if ( refNode ) {
- ret += "(";
- ret += DState::toString( refNode->dstate() );
- ret += ")";
- return ret;
- }
- else {
- ret += "(?";
- ret += DState::toString( DState::UNKNOWN );
- ret += ")";
- }
- return ret;
- }
+std::string AstNode::expression() const
+{
return nodePath_;
}
+std::string AstNode::why_expression(bool html) const
+{
+ Node* refNode = referencedNode(); // Only call once
+ std::string ret;
+ if (html) {
+ if (refNode) ret = Node::path_href_attribute(refNode->absNodePath(),nodePath_);
+ else ret = Node::path_href_attribute(nodePath_);
+ }
+ else ret = nodePath_;
+
+ if ( refNode ) {
+ ret += "(";
+ if (html) ret += DState::to_html( refNode->dstate());
+ else ret += DState::toString( refNode->dstate());
+ ret += ")";
+ return ret;
+ }
+ else {
+ ret += "?(";
+ if (html) ret += DState::to_html( DState::UNKNOWN);
+ else ret += DState::toString( DState::UNKNOWN);
+ ret += ")";
+ }
+ return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+std::string AstFlag::name() const
+{
+ return ecf::Flag::enum_to_string( flag_ );
+}
+void AstFlag::accept(ExprAstVisitor& v)
+{
+ v.visitFlag(this); // Not calling base
+}
+
+AstFlag* AstFlag::clone() const
+{
+ return new AstFlag(nodePath_,flag_);
+}
+
+int AstFlag::value() const
+{
+ Node* node = referencedNode();
+ if (node && node->flag().is_set(flag_)) return 1;
+ if (parentNode_ && nodePath_ == "/") {
+ Defs* the_defs = parentNode_->defs();
+ if (the_defs && the_defs->flag().is_set(flag_)) return 1;
+ }
+ return 0;
+}
+
+Node* AstFlag::referencedNode() const
+{
+ Node* ref = get_ref_node();
+ if ( ref ) {
+ return ref;
+ }
+ if ( parentNode_ ) {
+ if (nodePath_ == "/") return NULL; // reference to defs
+ std::string errorMsg;
+ ref_node_ = parentNode_->findReferencedNode( nodePath_, errorMsg );
+ return get_ref_node(); // can be NULL
+ }
+ return NULL;
+}
+
+Node* AstFlag::referencedNode(std::string& errorMsg) const
+{
+ Node* ref = get_ref_node();
+ if ( ref ) {
+ return ref;
+ }
+ if ( parentNode_ ) {
+ if (nodePath_ == "/") return NULL; // reference to defs
+ ref_node_ = parentNode_->findReferencedNode( nodePath_, ecf::Flag::enum_to_string( flag_ ), errorMsg );
+ return get_ref_node(); // can be NULL
+ }
+ return NULL;
+}
+
+std::ostream& AstFlag::print( std::ostream& os ) const {
+
+ Node* refNode = referencedNode(); // Only call once
+ Indentor in;
+
+ if ( refNode ) {
+ Indentor::indent( os ) << "# LEAF_FLAG_NODE node_(Found) nodePath_('" << nodePath_ << "') ";
+ os << ecf::Flag::enum_to_string( flag_ ) << "(" << static_cast<int>( refNode->flag().is_set(flag_)) << ")\n";
+ }
+ else {
+ Indentor::indent( os ) << "# LEAF_FLAG_NODE node_(NULL) nodePath_('" << nodePath_ << "') ";
+ os << ecf::Flag::enum_to_string( flag_ ) << "(0)\n";
+ }
+ return os;
+}
+
+void AstFlag::print_flat(std::ostream& os,bool /*add_bracket*/) const {
+ os << expression();
+}
+
+std::string AstFlag::expression() const
+{
+ string ret = nodePath_;
+ ret += "<flag>";
+ ret += ecf::Flag::enum_to_string( flag_ );
+ return ret;
+}
+
+std::string AstFlag::why_expression(bool html) const
+{
+ if (evaluate()) {
+#ifdef DEBUG_WHY
+ cout << " AstFlag::why_expression evaluates returning\n";
+#endif
+ return "true";
+ }
+
+#ifdef DEBUG_WHY
+ cout << " AstFlag::why_expression html " << html << "\n";
+#endif
+
+ Node* ref_node = referencedNode(); // Only call once
+ std::string ret;
+ if (html) {
+ // ecflow_ui expects: [attribute_type]attribute_path:attribute_name(value)
+ // i.e [limit]/suite/family/task:my_limit(value)
+ // i.e [flag]/suite/family/task:late(value)
+ std::stringstream display_ss; display_ss << "[flag:" << ecf::Flag::enum_to_string(flag_) << "]" << nodePath_ ;
+ std::string display_str = display_ss.str();
+
+ std::string ref_str;
+ if (ref_node) {
+ std::stringstream ref_ss; ref_ss << "[flag:" << ecf::Flag::enum_to_string(flag_) << "]" << ref_node->absNodePath();
+ ref_str = ref_ss.str();
+ }
+ else ref_str = display_str;
+
+ ret = Node::path_href_attribute(ref_str,display_str);
+ if ( !ref_node ) ret += "(?)";
+ else {
+ ret += "(";
+ ret += boost::lexical_cast<std::string>(ref_node->flag().is_set(flag_) );
+ ret += ")";
+ }
+ }
+ else {
+ ret = nodePath_;
+ if ( !ref_node ) ret += "(?)";
+ ret += "<flag>";
+ ret += ecf::Flag::enum_to_string( flag_ );
+ if (!ref_node) ret += "(?)";
+ else {
+ ret += "(";
+ std::stringstream ss; ss << ref_node->flag().is_set(flag_) ;
+ ret += ss.str();
+ ret += ")";
+ }
+ }
+ return ret;
+}
////////////////////////////////////////////////////////////////////////////////////
@@ -1087,29 +1507,51 @@ void AstVariable::print_flat(std::ostream& os,bool /*add_bracket*/) const
os << nodePath_ << Str::COLON() << name_;
}
-std::string AstVariable::expression(bool why) const
+std::string AstVariable::expression() const
{
- if (why) {
- VariableHelper varHelper(this);
- std::string ret = nodePath_;
- if ( !varHelper.theReferenceNode() ) ret += "(?)";
- ret += Str::COLON();
- ret += name_;
- ret += "(";
-
- std::string varType;
- int theValue;
- varHelper.varTypeAndValue(varType,theValue);
-
- std::stringstream ss; ss << "<type=" << varType << "> <value=" << theValue << ">";
- ret += ss.str();
-
- ret += ")";
- return ret;
- }
return nodePath_ + Str::COLON() + name_;
}
+std::string AstVariable::why_expression(bool html) const
+{
+ VariableHelper varHelper(this);
+ std::string ret;
+ std::string varType;
+ int theValue=0;
+ varHelper.varTypeAndValue(varType,theValue);
+ Node* ref_node = varHelper.theReferenceNode();
+
+ if (html) {
+ // ecflow_ui expects: [attribute_type]attribute_path:attribute_name
+ // i.e [limit]/suite/family/task:my_limit
+ std::stringstream display_ss; display_ss << "[" << varType << "]" << nodePath_ << ":" << name_;
+ std::string display_str = display_ss.str();
+ std::string ref_str;
+ if (ref_node) {
+ std::stringstream ref_ss; ref_ss << "[" << varType << "]" << ref_node->absNodePath() << ":" << name_;
+ ref_str = ref_ss.str();
+ }
+ else ref_str = display_str;
+
+ ret = Node::path_href_attribute(ref_str,display_str);
+ if ( !ref_node ) ret += "(?)";
+ ret += "(";
+ ret += boost::lexical_cast<std::string>(theValue);
+ ret += ")";
+ }
+ else {
+ ret = nodePath_;
+ if ( !ref_node ) ret += "(?)";
+ ret += Str::COLON();
+ ret += name_;
+ ret += "(";
+ std::stringstream ss; ss << "type:" << varType << " value:" << theValue;
+ ret += ss.str();
+ ret += ")";
+ }
+ return ret;
+}
+
Node* AstVariable::referencedNode() const
{
Node* ref = get_ref_node();
@@ -1268,3 +1710,4 @@ std::ostream& operator<<( std::ostream& os, const AstNodeState& d) {return d.pr
std::ostream& operator<<( std::ostream& os, const AstEventState& d) {return d.print( os );}
std::ostream& operator<<( std::ostream& os, const AstNode& d ) {return d.print( os );}
std::ostream& operator<<( std::ostream& os, const AstVariable& d ) {return d.print( os );}
+std::ostream& operator<<( std::ostream& os, const AstFlag& d ) {return d.print( os );}
diff --git a/ANode/src/ExprAst.hpp b/ANode/src/ExprAst.hpp
index 0d7cd87..60b5ad4 100644
--- a/ANode/src/ExprAst.hpp
+++ b/ANode/src/ExprAst.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #42 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -23,6 +23,7 @@
#include <boost/noncopyable.hpp>
#include "DState.hpp"
+#include "Flag.hpp"
#include "NodeFwd.hpp"
namespace ecf { class ExprAstVisitor;} // forward declare class
@@ -34,7 +35,7 @@ public:
virtual void accept(ecf::ExprAstVisitor&) = 0;
virtual Ast* clone() const = 0;
- virtual bool is_variable() const { return false; }
+ virtual bool is_attribute() const { return false; }
virtual bool is_not() const { return false; }
virtual bool isleaf() const { return false; }
virtual bool isRoot() const { return false; }
@@ -47,15 +48,17 @@ public:
virtual bool evaluate() const { assert(false); return false;}
virtual bool empty() const { return true; }
virtual int value() const { assert(false); return 0;} // only valid for leaf or operators
- virtual bool check(std::string& error_msg) const { return true; } // check divide or modulo by zero
+ virtual bool check(std::string& ) const { return true; } // check divide or modulo by zero
+ virtual bool is_valid_ast(std::string& error_msg) const = 0;
virtual std::ostream& print(std::ostream&) const = 0;
virtual void print_flat(std::ostream&,bool add_brackets = false) const = 0; // used for test
- virtual bool why(std::string& /*theReasonWhy*/) const { return false;}
virtual std::string type() const = 0;
virtual void exprType(const std::string&) {}
- std::string name() { return expression(false); } /* ABO */
- virtual std::string expression(bool why = false) const = 0; // recreate expression from AST, if why show additional state
+ virtual std::string name() const { return expression(); } /* ABO */
+ virtual std::string expression() const = 0; // recreate expression from AST
+ virtual bool why(std::string& /*theReasonWhy*/,bool html = false) const;
+ virtual std::string why_expression(bool html = false) const = 0; // recreate expression from AST for why command
// Use for data arithmetic for REPEAT Date, Use default implementation for others
// Currently *ONLY* works if repeat variable in on LHS
@@ -82,11 +85,14 @@ public:
virtual bool empty() const { return (root_) ? false : true ; }
virtual std::ostream& print(std::ostream&) const ;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
- virtual bool why(std::string& theReasonWhy) const;
+ virtual bool is_valid_ast(std::string& error_msg) const;
+
+ virtual bool why(std::string& theReasonWhy,bool html = false) const;
virtual std::string type() const { return stype();}
virtual void exprType(const std::string& s) { exprType_ = s;}
static std::string stype() { return "top";}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
virtual void setParentNode(Node*);
private:
@@ -109,12 +115,19 @@ public:
virtual Ast* left() const { return left_;}
virtual Ast* right() const { return right_;}
virtual std::ostream& print(std::ostream& os) const;
- virtual bool why(std::string& theReasonWhy) const;
virtual bool empty() const { return (left_ && right_) ? false : true ; }
virtual void setParentNode(Node*);
virtual void set_root_name(const std::string&) {}
protected:
+ std::string do_why_expression(const std::string& root,bool html) const;
+ std::string do_bracket_why_expression(const std::string& root,bool html) const;
+ std::string do_false_bracket_why_expression(const std::string& root,bool html) const;
+
+ std::string do_expression(const std::string& root ) const;
+ std::string do_bracket_expression(const std::string& root ) const;
+
+protected:
Ast* left_;
Ast* right_;
};
@@ -130,8 +143,10 @@ public:
virtual int value() const { assert(!right_); return ! left_->value();}
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+ virtual bool is_valid_ast(std::string& error_msg) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "not";}
virtual void set_root_name(const std::string& n) { name_ = n;}
private:
@@ -149,8 +164,10 @@ public:
virtual int value() const { return left_->plus(right_);}
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+ virtual bool is_valid_ast(std::string& error_msg) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "plus";}
};
@@ -164,8 +181,10 @@ public:
virtual int value() const { return left_->minus(right_); }
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+ virtual bool is_valid_ast(std::string& error_msg) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "minus";}
};
@@ -179,8 +198,10 @@ public:
virtual int value() const; // Log error if right hand side has value of zero
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+ virtual bool is_valid_ast(std::string& error_msg) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "divide";}
};
@@ -193,8 +214,10 @@ public:
virtual int value() const { return (left_->value() * right_->value());}
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+ virtual bool is_valid_ast(std::string& error_msg) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "multiply";}
};
@@ -208,8 +231,10 @@ public:
virtual int value() const; // Log error if right hand side has value of zero
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+ virtual bool is_valid_ast(std::string& error_msg) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "modulo";}
};
@@ -222,8 +247,10 @@ public:
virtual bool evaluate() const { return (left_->evaluate() && right_->evaluate());}
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+ virtual bool is_valid_ast(std::string& error_msg) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "and";}
};
@@ -235,8 +262,10 @@ public:
virtual bool evaluate() const { return (left_->evaluate() || right_->evaluate());}
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+ virtual bool is_valid_ast(std::string& error_msg) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "or";}
};
@@ -248,8 +277,10 @@ public:
virtual bool evaluate() const { return (left_->value() == right_->value()); }
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+ virtual bool is_valid_ast(std::string& error_msg) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "equal";}
};
@@ -261,8 +292,10 @@ public:
virtual bool evaluate() const { return (left_->value() != right_->value()); }
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+ virtual bool is_valid_ast(std::string& error_msg) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "not-equal";}
};
@@ -274,8 +307,10 @@ public:
virtual bool evaluate() const { return (left_->value() <= right_->value()); }
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+ virtual bool is_valid_ast(std::string& error_msg) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "less-equal";}
};
@@ -287,8 +322,10 @@ public:
virtual AstGreaterEqual* clone() const;
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+ virtual bool is_valid_ast(std::string& error_msg) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "greater-equal";}
};
@@ -302,8 +339,10 @@ public:
virtual AstGreaterThan* clone() const;
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+ virtual bool is_valid_ast(std::string& error_msg) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "greater-than";}
};
@@ -317,8 +356,10 @@ public:
virtual AstLessThan* clone() const;
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+ virtual bool is_valid_ast(std::string& error_msg) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "less-than";}
};
@@ -331,6 +372,7 @@ public:
AstLeaf() {}
virtual void accept(ecf::ExprAstVisitor&);
virtual bool isleaf() const { return true; }
+ virtual bool is_valid_ast(std::string&) const { return true;}
};
class AstFunction : public AstLeaf {
@@ -348,8 +390,10 @@ public:
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "AstFunction";}
+ virtual void setParentNode(Node* n);
Ast* arg() const { return arg_;}
FuncType ft() const { return ft_;}
@@ -372,7 +416,8 @@ public:
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "integer";}
private:
int value_;
@@ -389,7 +434,8 @@ public:
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "node-state";}
private:
DState::State state_;
@@ -405,7 +451,8 @@ public:
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
static std::string stype() { return "event-state";}
private:
bool state_;
@@ -431,7 +478,8 @@ public:
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
virtual void setParentNode(Node* n) { parentNode_ = n; }
static std::string stype() { return "node";}
@@ -448,6 +496,44 @@ private:
mutable weak_node_ptr ref_node_;
};
+class AstFlag : public AstLeaf {
+public:
+ AstFlag(const std::string& n,ecf::Flag::Type ft) : flag_(ft),parentNode_(NULL), nodePath_(n){}
+
+ virtual std::string name() const;
+
+ virtual bool is_attribute() const { return true; }
+ // although AstFlag is leaf, However allow to evaluate to cope with
+ // ( ../family1/<flag>:late != 0 and ../family1/a:myEvent)
+ // Treat this like an integer
+ virtual bool is_evaluateable() const { return true; }
+ virtual bool evaluate() const { return value() != 0 ? true: false; }
+
+ virtual void accept(ecf::ExprAstVisitor&);
+ virtual AstFlag* clone() const;
+ virtual int value() const;
+ virtual std::ostream& print(std::ostream& os) const;
+ virtual void print_flat(std::ostream&,bool add_brackets = false) const;
+ virtual std::string type() const { return stype();}
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
+ virtual void setParentNode(Node* n) { parentNode_ = n; }
+ static std::string stype() { return "flag";}
+
+ const std::string& nodePath() const { return nodePath_;}
+ Node* referencedNode() const;
+ Node* referencedNode(std::string& errorMsg) const;
+ Node* parentNode() const { return parentNode_; }
+
+private:
+ Node* get_ref_node() const { return ref_node_.lock().get(); }
+ ecf::Flag::Type flag_;
+ Node* parentNode_; // should always be non null, before evaluate.
+ std::string nodePath_;
+ mutable weak_node_ptr ref_node_;
+};
+
+
/// A variable: This can reference in the CURRENT order:
/// event,
/// meter,
@@ -461,7 +547,8 @@ public:
AstVariable(const std::string& nodePath, const std::string& variablename)
: parentNode_(NULL), nodePath_(nodePath), name_(variablename) {}
- virtual bool is_variable() const { return true; }
+ virtual std::string name() const { return name_;}
+ virtual bool is_attribute() const { return true; }
// although AstVariable is leaf, However allow to evaluate to cope with
// ( ../family1/a:myMeter >= 20 and ../family1/a:myEvent)
@@ -475,7 +562,8 @@ public:
virtual std::ostream& print(std::ostream& os) const;
virtual void print_flat(std::ostream&,bool add_brackets = false) const;
virtual std::string type() const { return stype();}
- virtual std::string expression(bool why = false) const;
+ virtual std::string expression() const;
+ virtual std::string why_expression(bool html = false) const;
virtual void setParentNode(Node* n) { parentNode_ = n; }
virtual int minus(Ast* right) const;
@@ -487,7 +575,6 @@ public:
static std::string stype() { return "variable";}
const std::string& nodePath() const { return nodePath_;}
- const std::string& name() const { return name_;}
private:
Node* get_ref_node() const { return ref_node_.lock().get(); }
@@ -543,5 +630,6 @@ std::ostream& operator<<(std::ostream& os, const AstNodeState&);
std::ostream& operator<<(std::ostream& os, const AstEventState&);
std::ostream& operator<<(std::ostream& os, const AstNode&);
std::ostream& operator<<(std::ostream& os, const AstVariable&);
+std::ostream& operator<<(std::ostream& os, const AstFlag&);
#endif
diff --git a/ANode/src/ExprAstVisitor.cpp b/ANode/src/ExprAstVisitor.cpp
index aa5a13b..ffc9948 100644
--- a/ANode/src/ExprAstVisitor.cpp
+++ b/ANode/src/ExprAstVisitor.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -54,6 +54,20 @@ void AstResolveVisitor::visitVariable(AstVariable* astVar)
}
}
+void AstResolveVisitor::visitFlag(AstFlag* ast)
+{
+ if ( errorMsg_.empty()) {
+
+ ast->setParentNode(const_cast<Node*>(triggerNode_));
+ Node* node = ast->referencedNode( errorMsg_ );
+ if ( !node ) {
+ // A node can be NULL when its a extern path. In this case errorMsg should be empty
+ return ;
+ }
+ LOG_ASSERT(errorMsg_.empty(),""); // found Node, make sure errorMsg is empty
+ }
+}
+
//===========================================================================================================
AstCollateNodesVisitor::AstCollateNodesVisitor( std::set<Node*>& s) : theSet_(s) {}
@@ -71,4 +85,10 @@ void AstCollateNodesVisitor::visitVariable(AstVariable* astVar)
if ( referencedNode ) theSet_.insert(referencedNode);
}
+void AstCollateNodesVisitor::visitFlag(AstFlag* ast)
+{
+ Node* referencedNode = ast->referencedNode(); // could be expensive, hence don't call twice
+ if ( referencedNode ) theSet_.insert(referencedNode);
+}
+
}
diff --git a/ANode/src/ExprAstVisitor.hpp b/ANode/src/ExprAstVisitor.hpp
index f7cfe20..357cb0f 100644
--- a/ANode/src/ExprAstVisitor.hpp
+++ b/ANode/src/ExprAstVisitor.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -44,6 +44,7 @@ class AstNodeState;
class AstEventState;
class AstNode;
class AstVariable;
+class AstFlag;
namespace ecf {
@@ -73,7 +74,8 @@ public:
virtual void visitNodeState(AstNodeState*) = 0;
virtual void visitEventState(AstEventState*) = 0;
virtual void visitNode(AstNode*) = 0;
- virtual void visitVariable(AstVariable*) = 0;
+ virtual void visitVariable(AstVariable*) = 0;
+ virtual void visitFlag(AstFlag*) = 0;
};
class AstResolveVisitor : public ExprAstVisitor {
@@ -105,7 +107,8 @@ public:
virtual void visitNodeState(AstNodeState*){}
virtual void visitEventState(AstEventState*){}
virtual void visitNode(AstNode*);
- virtual void visitVariable(AstVariable*);
+ virtual void visitVariable(AstVariable*);
+ virtual void visitFlag(AstFlag*);
private:
const Node* triggerNode_;
@@ -139,7 +142,8 @@ public:
virtual void visitNodeState(AstNodeState*){}
virtual void visitEventState(AstEventState*){}
virtual void visitNode(AstNode*);
- virtual void visitVariable(AstVariable*);
+ virtual void visitVariable(AstVariable*);
+ virtual void visitFlag(AstFlag*);
private:
std::set<Node*>& theSet_;
diff --git a/ANode/src/ExprDuplicate.cpp b/ANode/src/ExprDuplicate.cpp
index ee45892..a64f0ca 100644
--- a/ANode/src/ExprDuplicate.cpp
+++ b/ANode/src/ExprDuplicate.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #23 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/ExprDuplicate.hpp b/ANode/src/ExprDuplicate.hpp
index a89e8f7..04269c9 100644
--- a/ANode/src/ExprDuplicate.hpp
+++ b/ANode/src/ExprDuplicate.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/ExprParser.cpp b/ANode/src/ExprParser.cpp
index dd045b9..2349050 100644
--- a/ANode/src/ExprParser.cpp
+++ b/ANode/src/ExprParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #30 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -130,12 +130,18 @@ struct ExpressionGrammer : public grammar<ExpressionGrammer>
static const int cal_date_to_julian_ID = 54;
static const int cal_julian_to_date_ID = 55;
- static const int cal_argument_ID = 56;
+ static const int cal_argument_ID = 56;
+
+ static const int flag_path_ID = 57;
+ static const int flag_late_ID = 58;
+ static const int flag_zombie_ID = 59;
+ static const int flag_ID = 60;
+ static const int root_path_ID = 61;
template <typename ScannerT>
struct definition {
- rule<ScannerT,parser_tag<cal_date_to_julian_ID> > cal_date_to_julian;
- rule<ScannerT,parser_tag<cal_julian_to_date_ID> > cal_julian_to_date;
+ rule<ScannerT,parser_tag<cal_date_to_julian_ID> > cal_date_to_julian;
+ rule<ScannerT,parser_tag<cal_julian_to_date_ID> > cal_julian_to_date;
rule<ScannerT,parser_tag<cal_argument_ID> > cal_argument;
rule<ScannerT,parser_tag<integer_ID> > integer;
@@ -177,6 +183,7 @@ struct ExpressionGrammer : public grammar<ExpressionGrammer>
rule<ScannerT,parser_tag<dot_path_ID> > dotpath;
rule<ScannerT,parser_tag<dot_dot_path_ID> > dotdotpath;
rule<ScannerT,parser_tag<absolute_path_ID> > absolutepath;
+ rule<ScannerT,parser_tag<root_path_ID> > root_path;
rule<ScannerT,parser_tag<node_path_state_ID> > nodepathstate;
@@ -191,6 +198,11 @@ struct ExpressionGrammer : public grammar<ExpressionGrammer>
rule<ScannerT,parser_tag<basic_variable_path_ID> > basic_variable_path;
rule<ScannerT,parser_tag<compare_expression_ID> > compare_expression;
+ rule<ScannerT,parser_tag<flag_path_ID> > flag_path;
+ rule<ScannerT,parser_tag<flag_late_ID> > flag_late;
+ rule<ScannerT,parser_tag<flag_zombie_ID> > flag_zombie;
+ rule<ScannerT,parser_tag<flag_ID> > flag;
+
rule<ScannerT> not_r,less_than_comparable,expression,andExpr,operators;
rule<ScannerT> nodestate, equality_comparible, and_or, nodepath ;
@@ -204,11 +216,12 @@ struct ExpressionGrammer : public grammar<ExpressionGrammer>
{
nodename
= leaf_node_d[
- lexeme_d [ (alnum_p || ch_p('_')) >> *(alnum_p || ch_p('_')) ]
+ lexeme_d [ (alnum_p || ch_p('_')) >> *(alnum_p || ch_p('_') || ch_p('.')) ]
]
;
// Can be /suite/family/task || family/task || family
+
absolutepath
= leaf_node_d[
!(str_p("/")) >> nodename
@@ -228,6 +241,7 @@ struct ExpressionGrammer : public grammar<ExpressionGrammer>
)
]
;
+
dotpath = leaf_node_d[ str_p(".") >> +( str_p("/") >> nodename) ];
nodepath = absolutepath | dotdotpath | dotpath ;
@@ -293,10 +307,17 @@ struct ExpressionGrammer : public grammar<ExpressionGrammer>
| node_state_unknown
;
+ flag_late = root_node_d[ str_p("late") ];
+ flag_zombie = root_node_d[ str_p("zombie") ];
+ flag = flag_late | flag_zombie;
+
variable = leaf_node_d [ nodename ];
basic_variable_path = nodepath >> discard_node_d[ ch_p(':') ] >> variable ;
- cal_argument = basic_variable_path | integer ;
+ root_path = leaf_node_d[ (str_p("/")) ] ;
+ flag_path = ( nodepath | root_path) >> discard_node_d[ str_p("<flag>") ] >> flag ;
+
+ cal_argument = basic_variable_path | integer ;
cal_date_to_julian
= str_p("cal::date_to_julian")
>> discard_node_d[ ch_p('(')]
@@ -314,6 +335,7 @@ struct ExpressionGrammer : public grammar<ExpressionGrammer>
= integer
| basic_variable_path
| discard_node_d[ ch_p('(') ] >> calc_expression >> discard_node_d[ ch_p(')') ]
+ | flag_path
| root_node_d[operators] >> calc_factor
| cal_date_to_julian
| cal_julian_to_date
@@ -377,6 +399,7 @@ struct ExpressionGrammer : public grammar<ExpressionGrammer>
BOOST_SPIRIT_DEBUG_NODE(event_state);
BOOST_SPIRIT_DEBUG_NODE(variable);
BOOST_SPIRIT_DEBUG_NODE(basic_variable_path);
+ BOOST_SPIRIT_DEBUG_NODE(flag_path);
BOOST_SPIRIT_DEBUG_NODE(calc_factor);
BOOST_SPIRIT_DEBUG_NODE(calc_expression);
BOOST_SPIRIT_DEBUG_NODE(calc_term);
@@ -393,9 +416,10 @@ void print(tree_parse_info<> info,
const std::string& expr,
const std::map< parser_id, std::string >& rule_names);
-AstTop* createAst( tree_parse_info< > info,
+AstTop* createTopAst( tree_parse_info< > info,
const std::string& expr,
- const std::map< parser_id, std::string >& rule_names );
+ const std::map< parser_id, std::string >& rule_names,
+ std::string& error_msg);
/////////////////////////////////////////////////////////////////////////////////////////////
@@ -441,6 +465,7 @@ static void populate_rule_names()
rule_names[ExpressionGrammer::base_trigger_ID ] = "BASE_TRIGGER";
rule_names[ExpressionGrammer::sub_expression_ID ] = "SUB_EXPRESSION";
rule_names[ExpressionGrammer::node_path_state_ID ] = "NODE_PATH_STATE";
+ rule_names[ExpressionGrammer::flag_path_ID ] = "FLAG_PATH";
rule_names[ExpressionGrammer::event_state_ID ] = "STRING";
rule_names[ExpressionGrammer::variable_ID ] = "VARIABLE";
@@ -498,9 +523,8 @@ bool ExprParser::doParse(std::string& errorMsg)
#endif
// Spirit has created a AST for us. However it is not use able as is
// we will traverse the AST and create our OWN
- ast_.reset( createAst(info,expr_,rule_names) );
- if (ast_->empty()) errorMsg = "Abstract syntax tree creation failed";
- else {
+ ast_.reset( createTopAst(info,expr_,rule_names,errorMsg) );
+ if (ast_.get() && errorMsg.empty()) {
ExprDuplicate::add(expr_,ast_.get());
}
return errorMsg.empty();
@@ -775,7 +799,19 @@ Ast* createAst( const tree_iter_t& i, const std::map< parser_id, std::string >&
return new AstFunction(AstFunction::JULIAN_TO_DATE, createAst( i->children.begin()+1 , rule_names) );
}
+ else if ( i->value.id() == ExpressionGrammer::flag_path_ID) {
+
+ LOG_ASSERT((i->children.size() == 2), "");
+ tree_iter_t theNodePathIter = i->children.begin();
+ tree_iter_t theFlagIter = i->children.begin()+1;
+
+ string nodePath( theNodePathIter->value.begin(), theNodePathIter->value.end() );
+ string flag( theFlagIter->value.begin(), theFlagIter->value.end() );
+ boost::algorithm::trim(nodePath); // don't know why we get leading/trailing spaces
+ boost::algorithm::trim(flag); // don't know why we get leading/trailing spaces
+ return new AstFlag( nodePath, ecf::Flag::string_to_flag_type(flag) );
+ }
return NULL;
}
@@ -803,7 +839,7 @@ Ast* doCreateAst( const tree_iter_t& i,
// child 2: root(i.e ==,!=) +1
// child 3: right +2
- //cout << "GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG\n";
+ //cout << "i->children.size() == 3 ======================== \n";
AstRoot* someRoot = createRootNode( i->children.begin() + 1, rule_names );
if (someRoot ) {
Ast* left = doCreateAst( i->children.begin(), rule_names, someRoot);
@@ -817,7 +853,7 @@ Ast* doCreateAst( const tree_iter_t& i,
}
else if ( is_root_node(i) && i->children.size() == 2) {
- //cout << "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n";
+ //cout << "is_root_node(i) && i->children.size() == 2\n";
AstRoot* someRoot = createRootNode( i, rule_names );
Ast* left = doCreateAst( i->children.begin() , rule_names ,someRoot );
@@ -836,7 +872,7 @@ Ast* doCreateAst( const tree_iter_t& i,
// Create as: someRoot
// notRoot right
// notChild
- //cout << "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n";
+ //cout << "(i->children.size() == 4 && is_not(i->children.begin()))\n";
LOG_ASSERT(is_not(i->children.begin()),"");
AstRoot* notRoot = createRootNode( i->children.begin(), rule_names );
@@ -861,7 +897,7 @@ Ast* doCreateAst( const tree_iter_t& i,
// Create as: someRoot
// child notRoot
// notChild
- //cout << "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\n";
+ //cout << "(i->children.size() == 4 && is_root_node(i->children.begin()+1) && is_not(i->children.begin()+2) )\n";
AstRoot* someRoot = createRootNode( i->children.begin()+1, rule_names );
Ast* varPath = doCreateAst( i->children.begin(), rule_names, someRoot/*top*/);
if (varPath) someRoot->addChild(varPath); //left
@@ -878,7 +914,7 @@ Ast* doCreateAst( const tree_iter_t& i,
else if (i->children.size() == 2 && is_not(i->children.begin()) ) {
// child 1: not 0
// child 2: left +1
- //cout << "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\n";
+ //cout << "(i->children.size() == 2 && is_not(i->children.begin()) )\n";
AstRoot* notRoot = createRootNode( i->children.begin(), rule_names );
@@ -899,6 +935,7 @@ Ast* doCreateAst( const tree_iter_t& i,
// !a and b
// a and !b
// We always treat the not as *child*
+ //cout << "(i->children.size() >=5 ) \n";
stack<Ast*> childs;
stack<Ast*> parents;
Ast* not_ast = NULL;
@@ -952,10 +989,11 @@ Ast* doCreateAst( const tree_iter_t& i,
return NULL;
}
-AstTop* createAst(
+AstTop* createTopAst(
tree_parse_info< > info,
const std::string& expr,
- const std::map< parser_id, std::string >& rule_names
+ const std::map< parser_id, std::string >& rule_names,
+ std::string& error_msg
)
{
#if defined(PRINT_AST_TRAVERSAL)
@@ -965,6 +1003,10 @@ AstTop* createAst(
std::auto_ptr<AstTop> ast(new AstTop);
(void)doCreateAst(info.trees.begin(),rule_names,ast.get() );
+ if (!ast->is_valid_ast(error_msg)) {
+ return NULL;
+ }
+
#if defined(PRINT_AST)
if (ast.get()) {
std::stringstream s2;
diff --git a/ANode/src/ExprParser.hpp b/ANode/src/ExprParser.hpp
index 93ae7b3..c90a361 100644
--- a/ANode/src/ExprParser.hpp
+++ b/ANode/src/ExprParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #12 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/Expression.cpp b/ANode/src/Expression.cpp
index 8e4842e..872645a 100644
--- a/ANode/src/Expression.cpp
+++ b/ANode/src/Expression.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #18 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/Expression.hpp b/ANode/src/Expression.hpp
index 3bd02bd..8bc9a6b 100644
--- a/ANode/src/Expression.hpp
+++ b/ANode/src/Expression.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #20 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/Family.cpp b/ANode/src/Family.cpp
index 231c276..7af4252 100644
--- a/ANode/src/Family.cpp
+++ b/ANode/src/Family.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #64 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/Family.hpp b/ANode/src/Family.hpp
index f7f608c..00b20ac 100644
--- a/ANode/src/Family.hpp
+++ b/ANode/src/Family.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #37 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -50,8 +50,8 @@ public:
bool operator==(const Family& rhs) const;
virtual void collateChanges(DefsDelta&) const;
- void set_memento(const OrderMemento* m,std::vector<ecf::Aspect::Type>& aspects) { NodeContainer::set_memento(m,aspects); }
- void set_memento(const ChildrenMemento* m,std::vector<ecf::Aspect::Type>& aspects) { NodeContainer::set_memento(m,aspects); }
+ void set_memento(const OrderMemento* m,std::vector<ecf::Aspect::Type>& aspects,bool f) { NodeContainer::set_memento(m,aspects,f); }
+ void set_memento(const ChildrenMemento* m,std::vector<ecf::Aspect::Type>& aspects,bool f) { NodeContainer::set_memento(m,aspects,f); }
virtual void read_state(const std::string& line,const std::vector<std::string>& lineTokens);
private:
diff --git a/ANode/src/Flag.cpp b/ANode/src/Flag.cpp
index 20533f3..77c2f9f 100644
--- a/ANode/src/Flag.cpp
+++ b/ANode/src/Flag.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #12 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/Flag.hpp b/ANode/src/Flag.hpp
index 79d5808..5663da3 100644
--- a/ANode/src/Flag.hpp
+++ b/ANode/src/Flag.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #15 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/InLimit.cpp b/ANode/src/InLimit.cpp
index 86adb56..9665b5f 100644
--- a/ANode/src/InLimit.cpp
+++ b/ANode/src/InLimit.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #64 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/InLimit.hpp b/ANode/src/InLimit.hpp
index 13051db..cea2d7d 100644
--- a/ANode/src/InLimit.hpp
+++ b/ANode/src/InLimit.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #61 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/InLimitMgr.cpp b/ANode/src/InLimitMgr.cpp
index c0d01b2..58c3fbb 100644
--- a/ANode/src/InLimitMgr.cpp
+++ b/ANode/src/InLimitMgr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #28 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -242,18 +242,22 @@ static void add_consumed_paths(Limit* limit, std::stringstream& ss)
ss << ")";
}
-void InLimitMgr::why(std::vector<std::string>& vec) const
+bool InLimitMgr::why(std::vector<std::string>& vec, bool top_down, bool html) const
{
#ifdef DEBUG_WHY
std::cout << "InLimitMgr::why " << node_->debugNodePath() << "\n";
#endif
-
+ bool why_found = false;
// Note: if this correspond to a leaf node, like a task. Then it may not be
// sufficient to just check in limits at this level. Will need to look up hierarchy.
if (inLimit()) {
#ifdef DEBUG_WHY
std::cout << " Node " << node_->debugNodePath() << " is *in limit*, checking parent\n";
#endif
+
+ // When traversing top down, no need to look up the hierarchy
+ if (top_down) return why_found;
+
Node* theParent = node_->parent();
while( theParent ) {
@@ -269,13 +273,20 @@ void InLimitMgr::why(std::vector<std::string>& vec) const
std::stringstream ss;
if ( theParent->inlimits()[i].pathToNode().empty())
ss << "limit " << limit->name() << " is full";
- else
- ss << "limit " << theParent->inlimits()[i].pathToNode() << Str::COLON() << limit->name() << " is full";
+ else {
+ if (html) {
+ std::stringstream s;
+ s << "[limit]" << theParent->inlimits()[i].pathToNode() << Str::COLON() << limit->name();
+ ss << Node::path_href_attribute(s.str()) << " is full";
+ }
+ else ss << "limit " << theParent->inlimits()[i].pathToNode() << Str::COLON() << limit->name() << " is full";
+ }
// show node paths that have consumed a limit, Only show first 5, Otherwise string may be too long
add_consumed_paths(limit,ss);
vec.push_back(ss.str());
+ why_found = true;
}
}
break;
@@ -290,18 +301,27 @@ void InLimitMgr::why(std::vector<std::string>& vec) const
Limit* limit = inLimitVec_[i].limit();
if (limit && !limit->inLimit(inLimitVec_[i].tokens())) {
std::stringstream ss;
- if ( inLimitVec_[i].pathToNode().empty())
+ if ( inLimitVec_[i].pathToNode().empty()) {
ss << "limit " << limit->name() << " is full";
- else
- ss << "limit " << inLimitVec_[i].pathToNode() << Str::COLON() << limit->name() << " is full";
+ }
+ else {
+ if (html) {
+ std::stringstream s;
+ s << "[limit]" << inLimitVec_[i].pathToNode() << Str::COLON() << limit->name();
+ ss << Node::path_href_attribute(s.str()) << " is full";
+ }
+ else ss << "limit " << inLimitVec_[i].pathToNode() << Str::COLON() << limit->name() << " is full";
+ }
// show node paths that have consumed a limit, Only show first 5, Otherwise string may be too long
add_consumed_paths(limit,ss);
vec.push_back(ss.str());
+ why_found = true;
}
}
}
+ return why_found;
}
void InLimitMgr::check(std::string& errorMsg, std::string& warningMsg,bool reportErrors, bool reportWarnings) const
diff --git a/ANode/src/InLimitMgr.hpp b/ANode/src/InLimitMgr.hpp
index 3a29547..473aaae 100644
--- a/ANode/src/InLimitMgr.hpp
+++ b/ANode/src/InLimitMgr.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #16 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -74,7 +74,7 @@ public:
bool findInLimitByNameAndPath(const InLimit& ) const; // use name,path,token,
// Why:
- void why(std::vector<std::string>& vec) const;
+ bool why(std::vector<std::string>& vec, bool top_down, bool html = false) const; // return true if why found
// Limit functions:
diff --git a/ANode/src/JobCreationCtrl.cpp b/ANode/src/JobCreationCtrl.cpp
index 9360359..40db0f0 100644
--- a/ANode/src/JobCreationCtrl.cpp
+++ b/ANode/src/JobCreationCtrl.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/JobCreationCtrl.hpp b/ANode/src/JobCreationCtrl.hpp
index 99589f6..2bfc83e 100644
--- a/ANode/src/JobCreationCtrl.hpp
+++ b/ANode/src/JobCreationCtrl.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/JobProfiler.cpp b/ANode/src/JobProfiler.cpp
index 6ae96e5..0688127 100644
--- a/ANode/src/JobProfiler.cpp
+++ b/ANode/src/JobProfiler.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #18 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/JobProfiler.hpp b/ANode/src/JobProfiler.hpp
index f5e827d..f21a85c 100644
--- a/ANode/src/JobProfiler.hpp
+++ b/ANode/src/JobProfiler.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/Jobs.cpp b/ANode/src/Jobs.cpp
index 2674f5f..17dddd4 100644
--- a/ANode/src/Jobs.cpp
+++ b/ANode/src/Jobs.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #18 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -112,7 +112,7 @@ bool Jobs::generate() const
LOG_ASSERT( defs != NULL ,"node_->defs() == NULL");
}
- if (defs->server().get_state() == SState::RUNNING) {
+ if (defs && defs->server().get_state() == SState::RUNNING) {
LOG_ASSERT( defs->server().jobSubmissionInterval() != 0 ,"");
JobsParam jobsParam( defs->server().jobSubmissionInterval(), defs->server().jobGeneration() );
#ifdef DEBUG_JOB_SUBMISSION
diff --git a/ANode/src/Jobs.hpp b/ANode/src/Jobs.hpp
index 49343fd..5074a5a 100644
--- a/ANode/src/Jobs.hpp
+++ b/ANode/src/Jobs.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/JobsParam.cpp b/ANode/src/JobsParam.cpp
index a715073..2c4d14e 100644
--- a/ANode/src/JobsParam.cpp
+++ b/ANode/src/JobsParam.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/JobsParam.hpp b/ANode/src/JobsParam.hpp
index a563bd7..32d87c0 100644
--- a/ANode/src/JobsParam.hpp
+++ b/ANode/src/JobsParam.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/Limit.cpp b/ANode/src/Limit.cpp
index 2b6e58c..d2683b2 100644
--- a/ANode/src/Limit.cpp
+++ b/ANode/src/Limit.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #64 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -149,6 +149,7 @@ void Limit::increment( int tokens , const std::string& abs_node_path) {
void Limit::setValue( int v )
{
value_ = v;
+ if (value_ == 0) paths_.clear();
update_change_no();
#ifdef DEBUG_STATE_CHANGE_NO
std::cout << " Limit::setValue() value_ = " << value_ << "\n";
diff --git a/ANode/src/Limit.hpp b/ANode/src/Limit.hpp
index 2382d28..c977859 100644
--- a/ANode/src/Limit.hpp
+++ b/ANode/src/Limit.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #61 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/LimitFwd.hpp b/ANode/src/LimitFwd.hpp
index f3e3b1c..67d310a 100644
--- a/ANode/src/LimitFwd.hpp
+++ b/ANode/src/LimitFwd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/Memento.cpp b/ANode/src/Memento.cpp
index e767f47..d7e42ce 100644
--- a/ANode/src/Memento.cpp
+++ b/ANode/src/Memento.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #32 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -39,38 +39,61 @@ void CompoundMemento::incremental_sync(defs_ptr client_def) const
#ifdef DEBUG_MEMENTO
cout << "CompoundMemento::incremental_sync: ROOT_PATH changed_nodes.size()=" << changed_nodes.size() << "\n";
#endif
+ //
+ // Notify observers what aspect is going to change, before make-ing data model changes
+ //
BOOST_FOREACH(memento_ptr m, vec_) {
- m->do_incremental_defs_sync( client_def.get(), aspects_);
+ m->do_incremental_defs_sync( client_def.get(), aspects_,true/* collect aspects only, don't make any changes*/);
}
+ size_t aspect_size = aspects_.size();
+ client_def->notify_start( aspects_);
+
+ /// make data model change.
/// Notify any interested parties incremental changes
/// Aspects records the kind of changes.
- client_def->notify( aspects_);
+ BOOST_FOREACH(memento_ptr m, vec_) {
+ m->do_incremental_defs_sync( client_def.get(), aspects_,false/*Data model changes only*/);
+ }
+ assert(aspect_size == aspects_.size()); // aspect size should not change, when making data model changes
+ client_def->notify(aspects_);
}
else {
#ifdef DEBUG_MEMENTO
cout << "CompoundMemento::incremental_sync: " << node->debugNodePath() << " changed_nodes.size()=" << changed_nodes.size() << "\n";
#endif
-
- if (clear_attributes_) {
- aspects_.push_back(ecf::Aspect::ADD_REMOVE_ATTR);
- node->clear();
- }
-
+ // Notify observers what aspect, is going to change.
Task* task = node->isTask();
Alias* alias = node->isAlias();
Suite* suite = node->isSuite();
Family* family = node->isFamily();
+ if (clear_attributes_) aspects_.push_back(ecf::Aspect::ADD_REMOVE_ATTR);
+
BOOST_FOREACH(memento_ptr m, vec_) {
-// std::cout << "memento = " << typeid(*m.get()).name() << "\n";
- if (task) m->do_incremental_task_sync( task, aspects_ );
- else if (alias) m->do_incremental_alias_sync( alias, aspects_ );
- else if (suite) m->do_incremental_suite_sync( suite , aspects_);
- else if (family) m->do_incremental_family_sync( family, aspects_ );
- m->do_incremental_node_sync( node.get(), aspects_ );
+ if (task) m->do_incremental_task_sync( task, aspects_,true/* collect aspects only, don't make any changes*/ );
+ else if (alias) m->do_incremental_alias_sync( alias, aspects_,true/* collect aspects only, don't make any changes*/ );
+ else if (suite) m->do_incremental_suite_sync( suite , aspects_,true/* collect aspects only, don't make any changes*/);
+ else if (family) m->do_incremental_family_sync( family, aspects_,true/* collect aspects only, don't make any changes*/ );
+ m->do_incremental_node_sync( node.get(), aspects_,true/* collect aspects only, don't make any changes*/ );
}
+ size_t aspect_size = aspects_.size();
+ node->notify_start( aspects_ );
+
+ //
+ // data model changes only, aspects should not change
+ //
+ if (clear_attributes_) node->clear();
+
+ BOOST_FOREACH(memento_ptr m, vec_) {
+ if (task) m->do_incremental_task_sync( task, aspects_, false/*Data model changes only*/);
+ else if (alias) m->do_incremental_alias_sync( alias, aspects_,false/*Data model changes only*/);
+ else if (suite) m->do_incremental_suite_sync( suite , aspects_,false/*Data model changes only*/);
+ else if (family) m->do_incremental_family_sync( family, aspects_,false/*Data model changes only*/);
+ m->do_incremental_node_sync( node.get(), aspects_,false/*Data model changes only*/);
+ }
+ assert(aspect_size == aspects_.size()); // aspect size should not change, when making data model changes
/// Notify any interested parties that Node has made incremental changes
/// Aspects records the kind of changes.
diff --git a/ANode/src/Memento.hpp b/ANode/src/Memento.hpp
index 8b7c932..f808d96 100644
--- a/ANode/src/Memento.hpp
+++ b/ANode/src/Memento.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #41 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -56,12 +56,12 @@ public:
virtual ~Memento();
private:
/// Applies the mementos to the client side defs. Can raise std::runtime_error
- virtual void do_incremental_node_sync(Node*,std::vector<ecf::Aspect::Type>& aspects) const {}
- virtual void do_incremental_task_sync(Task*,std::vector<ecf::Aspect::Type>& aspects) const {}
- virtual void do_incremental_alias_sync(Alias*,std::vector<ecf::Aspect::Type>& aspects) const {}
- virtual void do_incremental_suite_sync(Suite*,std::vector<ecf::Aspect::Type>& aspects) const {}
- virtual void do_incremental_family_sync(Family*,std::vector<ecf::Aspect::Type>& aspects) const {}
- virtual void do_incremental_defs_sync(Defs*,std::vector<ecf::Aspect::Type>& aspects) const {}
+ virtual void do_incremental_node_sync(Node*,std::vector<ecf::Aspect::Type>& aspects,bool) const {}
+ virtual void do_incremental_task_sync(Task*,std::vector<ecf::Aspect::Type>& aspects,bool) const {}
+ virtual void do_incremental_alias_sync(Alias*,std::vector<ecf::Aspect::Type>& aspects,bool) const {}
+ virtual void do_incremental_suite_sync(Suite*,std::vector<ecf::Aspect::Type>& aspects,bool) const {}
+ virtual void do_incremental_family_sync(Family*,std::vector<ecf::Aspect::Type>& aspects,bool) const {}
+ virtual void do_incremental_defs_sync(Defs*,std::vector<ecf::Aspect::Type>& aspects,bool) const {}
friend class CompoundMemento;
private:
@@ -110,8 +110,8 @@ public:
StateMemento(NState::State state) : state_(state) {}
StateMemento() : state_(NState::UNKNOWN) {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
- virtual void do_incremental_defs_sync(Defs* defs,std::vector<ecf::Aspect::Type>& aspects) const { defs->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
+ virtual void do_incremental_defs_sync(Defs* defs,std::vector<ecf::Aspect::Type>& aspects,bool f) const { defs->set_memento(this,aspects,f);}
NState::State state_;
friend class Node;
@@ -130,10 +130,10 @@ public:
OrderMemento(const std::vector<std::string>& order) : order_(order) {}
OrderMemento() {}
private:
- virtual void do_incremental_defs_sync(Defs* defs,std::vector<ecf::Aspect::Type>& aspects) const { defs->set_memento(this,aspects);}
- virtual void do_incremental_suite_sync(Suite* s,std::vector<ecf::Aspect::Type>& aspects) const { s->set_memento(this,aspects);}
- virtual void do_incremental_family_sync(Family* f,std::vector<ecf::Aspect::Type>& aspects) const { f->set_memento(this,aspects);}
- virtual void do_incremental_task_sync(Task* t,std::vector<ecf::Aspect::Type>& aspects) const { t->set_memento(this,aspects);}
+ virtual void do_incremental_defs_sync(Defs* defs,std::vector<ecf::Aspect::Type>& aspects,bool f) const { defs->set_memento(this,aspects,f);}
+ virtual void do_incremental_suite_sync(Suite* s,std::vector<ecf::Aspect::Type>& aspects,bool f) const { s->set_memento(this,aspects,f);}
+ virtual void do_incremental_family_sync(Family* f,std::vector<ecf::Aspect::Type>& aspects,bool ff) const { f->set_memento(this,aspects,ff);}
+ virtual void do_incremental_task_sync(Task* t,std::vector<ecf::Aspect::Type>& aspects,bool f) const { t->set_memento(this,aspects,f);}
std::vector<std::string> order_;
friend class NodeContainer;
@@ -153,8 +153,8 @@ public:
ChildrenMemento(const std::vector<node_ptr>& children) : children_(children) {}
ChildrenMemento() {}
private:
- virtual void do_incremental_suite_sync(Suite* s,std::vector<ecf::Aspect::Type>& aspects) const { s->set_memento(this,aspects);}
- virtual void do_incremental_family_sync(Family* f,std::vector<ecf::Aspect::Type>& aspects) const { f->set_memento(this,aspects);}
+ virtual void do_incremental_suite_sync(Suite* s,std::vector<ecf::Aspect::Type>& aspects,bool f) const { s->set_memento(this,aspects,f);}
+ virtual void do_incremental_family_sync(Family* f,std::vector<ecf::Aspect::Type>& aspects,bool ff) const { f->set_memento(this,aspects,ff);}
std::vector<node_ptr> children_;
friend class NodeContainer;
@@ -176,7 +176,7 @@ public:
AliasChildrenMemento(const std::vector<alias_ptr>& children) : children_(children) {}
AliasChildrenMemento() {}
private:
- virtual void do_incremental_task_sync(Task* t,std::vector<ecf::Aspect::Type>& aspects) const { t->set_memento(this,aspects);}
+ virtual void do_incremental_task_sync(Task* t,std::vector<ecf::Aspect::Type>& aspects,bool f) const { t->set_memento(this,aspects,f);}
std::vector<alias_ptr> children_;
friend class Task;
@@ -197,7 +197,7 @@ public:
AliasNumberMemento(unsigned int alias_no ) : alias_no_(alias_no) {}
AliasNumberMemento() : alias_no_(0) {}
private:
- virtual void do_incremental_task_sync(Task* t,std::vector<ecf::Aspect::Type>& aspects) const { t->set_memento(this,aspects);}
+ virtual void do_incremental_task_sync(Task* t,std::vector<ecf::Aspect::Type>& aspects,bool f) const { t->set_memento(this,aspects,f);}
unsigned int alias_no_;
friend class Task;
@@ -216,7 +216,7 @@ public:
SuspendedMemento(bool suspended) : suspended_(suspended) {}
SuspendedMemento() : suspended_(false) {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
bool suspended_;
friend class Node;
@@ -235,7 +235,7 @@ public:
ServerStateMemento(SState::State s) : state_(s) {}
ServerStateMemento() : state_(SState::HALTED) {}
private:
- virtual void do_incremental_defs_sync(Defs* defs,std::vector<ecf::Aspect::Type>& aspects) const { defs->set_memento(this,aspects);}
+ virtual void do_incremental_defs_sync(Defs* defs,std::vector<ecf::Aspect::Type>& aspects,bool f) const { defs->set_memento(this,aspects,f);}
SState::State state_;
friend class Defs;
@@ -253,7 +253,7 @@ public:
ServerVariableMemento(const std::vector<Variable>& vec) : serverEnv_(vec) {}
ServerVariableMemento() {}
private:
- virtual void do_incremental_defs_sync(Defs* defs,std::vector<ecf::Aspect::Type>& aspects) const { defs->set_memento(this,aspects);}
+ virtual void do_incremental_defs_sync(Defs* defs,std::vector<ecf::Aspect::Type>& aspects,bool f) const { defs->set_memento(this,aspects,f);}
std::vector<Variable> serverEnv_;
friend class Defs;
@@ -271,7 +271,7 @@ public:
NodeDefStatusDeltaMemento(DState::State state) : state_(state) {}
NodeDefStatusDeltaMemento() : state_(DState::UNKNOWN) {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
DState::State state_;
friend class Node;
@@ -289,7 +289,7 @@ public:
NodeEventMemento( const Event& e) : event_(e) {}
NodeEventMemento(){}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
Event event_;
friend class Node;
@@ -308,7 +308,7 @@ public:
NodeMeterMemento(const Meter& e) : meter_(e) {}
NodeMeterMemento() {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
Meter meter_;
friend class Node;
@@ -327,7 +327,7 @@ public:
NodeLabelMemento( const Label& e) : label_(e) {}
NodeLabelMemento(){}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
Label label_;
friend class Node;
@@ -347,7 +347,7 @@ public:
NodeTriggerMemento(const Expression& e) : exp_(e) {}
NodeTriggerMemento() {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
Expression exp_;
friend class Node;
@@ -365,7 +365,7 @@ public:
NodeCompleteMemento(const Expression& e) : exp_(e) {}
NodeCompleteMemento() {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
Expression exp_;
friend class Node;
@@ -383,7 +383,7 @@ public:
NodeRepeatMemento( const Repeat& e ) : repeat_(e) {}
NodeRepeatMemento() {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
Repeat repeat_;
friend class Node;
@@ -401,7 +401,7 @@ public:
NodeLimitMemento( const Limit& e) : limit_( e ) {}
NodeLimitMemento() {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
Limit limit_;
friend class Node;
@@ -419,7 +419,7 @@ public:
NodeInLimitMemento( const InLimit& e) : inlimit_( e ) {}
NodeInLimitMemento() {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
InLimit inlimit_;
friend class Node;
@@ -438,7 +438,7 @@ public:
NodeVariableMemento( const Variable& e) : var_(e) {}
NodeVariableMemento(){}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
Variable var_;
friend class Node;
@@ -456,7 +456,7 @@ public:
NodeLateMemento( const ecf::LateAttr& e) : late_(e) {}
NodeLateMemento() {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
ecf::LateAttr late_;
friend class Node;
@@ -474,8 +474,8 @@ public:
FlagMemento( const ecf::Flag& e) : flag_(e) {}
FlagMemento() {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
- virtual void do_incremental_defs_sync(Defs* defs,std::vector<ecf::Aspect::Type>& aspects) const { defs->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
+ virtual void do_incremental_defs_sync(Defs* defs,std::vector<ecf::Aspect::Type>& aspects,bool f) const { defs->set_memento(this,aspects,f);}
ecf::Flag flag_;
friend class Node;
@@ -494,7 +494,7 @@ public:
NodeTodayMemento( const ecf::TodayAttr& attr) : attr_(attr) {}
NodeTodayMemento() {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
ecf::TodayAttr attr_;
friend class Node;
@@ -513,7 +513,7 @@ public:
NodeTimeMemento( const ecf::TimeAttr& attr) : attr_(attr) {}
NodeTimeMemento() {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
ecf::TimeAttr attr_;
friend class Node;
@@ -532,7 +532,7 @@ public:
NodeDayMemento( const DayAttr& attr) : attr_(attr) {}
NodeDayMemento(){}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
DayAttr attr_;
friend class Node;
@@ -551,7 +551,7 @@ public:
NodeCronMemento( const ecf::CronAttr& attr) : attr_(attr) {}
NodeCronMemento() {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
ecf::CronAttr attr_;
friend class Node;
@@ -570,7 +570,7 @@ public:
NodeDateMemento( const DateAttr& attr) : attr_(attr) {}
NodeDateMemento() {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
DateAttr attr_;
friend class Node;
@@ -589,7 +589,7 @@ public:
NodeZombieMemento(const ZombieAttr& attr) : attr_(attr) {}
NodeZombieMemento() {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
ZombieAttr attr_;
friend class Node;
@@ -608,7 +608,7 @@ public:
NodeVerifyMemento(const std::vector<VerifyAttr>& attr) : verifys_(attr) {}
NodeVerifyMemento() {}
private:
- virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_node_sync(Node* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
std::vector<VerifyAttr> verifys_;
friend class Node;
@@ -635,8 +635,8 @@ public:
tryNo_( tryNo ) {}
SubmittableMemento() : tryNo_(0) {}
private:
- virtual void do_incremental_task_sync(Task* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
- virtual void do_incremental_alias_sync(Alias* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_task_sync(Task* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
+ virtual void do_incremental_alias_sync(Alias* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
std::string jobsPassword_;
std::string process_or_remote_id_;
@@ -660,7 +660,7 @@ public:
SuiteClockMemento( const ClockAttr& c ) : clockAttr_(c) {}
SuiteClockMemento() {}
private:
- virtual void do_incremental_suite_sync(Suite* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_suite_sync(Suite* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
ClockAttr clockAttr_;
friend class Suite;
@@ -678,7 +678,7 @@ public:
SuiteBeginDeltaMemento(bool begun) : begun_(begun) {}
SuiteBeginDeltaMemento() : begun_(false) {}
private:
- virtual void do_incremental_suite_sync(Suite* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_suite_sync(Suite* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
bool begun_;
friend class Suite;
@@ -696,7 +696,7 @@ public:
SuiteCalendarMemento(const ecf::Calendar& cal) : calendar_(cal) {}
SuiteCalendarMemento() {}
private:
- virtual void do_incremental_suite_sync(Suite* n,std::vector<ecf::Aspect::Type>& aspects) const { n->set_memento(this,aspects);}
+ virtual void do_incremental_suite_sync(Suite* n,std::vector<ecf::Aspect::Type>& aspects,bool f) const { n->set_memento(this,aspects,f);}
ecf::Calendar calendar_; // *Only* persisted since used by the why() on client side
friend class Suite;
diff --git a/Viewer/src/VItemTmp.cpp b/ANode/src/MigrateContext.cpp
similarity index 62%
rename from Viewer/src/VItemTmp.cpp
rename to ANode/src/MigrateContext.cpp
index 0ed41cf..bff1634 100644
--- a/Viewer/src/VItemTmp.cpp
+++ b/ANode/src/MigrateContext.cpp
@@ -1,24 +1,29 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Name :
+// Author : Avi
+// Revision : $Revision: #16 $
+//
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
// granted to it by virtue of its status as an intergovernmental organisation
// nor does it submit to any jurisdiction.
-//
//============================================================================
-#include "VItem.hpp"
-#include "VItemTmp.hpp"
-#include "VAttribute.hpp"
+#include "MigrateContext.hpp"
+
+namespace ecf {
+bool MigrateContext::in_migrate_ = false;
-VItemTmp::~VItemTmp()
+MigrateContext::MigrateContext()
{
- if(item_ && item_->isAttribute())
- delete item_;
+ in_migrate_ = true;
}
-VAttribute* VItemTmp::attribute() const
+MigrateContext::~MigrateContext()
{
- return (item_)?item_->isAttribute():NULL;
+ in_migrate_ = false;
+}
+
}
diff --git a/ANode/src/CmdContext.hpp b/ANode/src/MigrateContext.hpp
similarity index 65%
copy from ANode/src/CmdContext.hpp
copy to ANode/src/MigrateContext.hpp
index 60d5815..f275ab3 100644
--- a/ANode/src/CmdContext.hpp
+++ b/ANode/src/MigrateContext.hpp
@@ -1,35 +1,33 @@
-#ifndef CMD_CONTEXT_HPP_
-#define CMD_CONTEXT_HPP_
+#ifndef MIGRATE_CONTEXT_HPP_
+#define MIGRATE_CONTEXT_HPP_
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// Name :
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
// granted to it by virtue of its status as an intergovernmental organisation
// nor does it submit to any jurisdiction.
-//
-// Description :
-// This class allow client to determine whether they are in a middle
-// of a command.
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
#include <boost/noncopyable.hpp>
namespace ecf {
-class CmdContext : private boost::noncopyable {
+class MigrateContext : private boost::noncopyable {
+ // Used when --migrate called
+ // Allow us to dump children
public:
- CmdContext();
- ~CmdContext();
+ MigrateContext();
+ ~MigrateContext();
- static bool in_command() { return in_command_; }
+ static bool in_migrate() { return in_migrate_; }
private:
- static bool in_command_;
+ static bool in_migrate_;
};
}
diff --git a/ANode/src/MiscAttrs.cpp b/ANode/src/MiscAttrs.cpp
index 5f7a0e5..cc0c64c 100644
--- a/ANode/src/MiscAttrs.cpp
+++ b/ANode/src/MiscAttrs.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #286 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/MiscAttrs.hpp b/ANode/src/MiscAttrs.hpp
index f2abea5..303cff4 100644
--- a/ANode/src/MiscAttrs.hpp
+++ b/ANode/src/MiscAttrs.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #235 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/Node.cpp b/ANode/src/Node.cpp
index be5e5d7..b0efc59 100644
--- a/ANode/src/Node.cpp
+++ b/ANode/src/Node.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #305 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -117,14 +117,28 @@ Node::Node(const Node& rhs)
}
}
+void Node::delete_attributes() {
+ delete completeExpr_;
+ delete triggerExpr_;
+ delete lateAttr_;
+ delete autoCancel_;
+ delete time_dep_attrs_;
+ delete child_attrs_;
+ delete misc_attrs_;
+}
+
Node& Node::operator=(const Node& rhs)
{
+ // Note:: Defs assignment operator use copy/swap, hence this assignemnt note used
// parent must set parent_
if (this != &rhs) {
name_ = rhs.name_;
suspended_ = rhs.suspended_;
state_ = rhs.state_;
defStatus_ = rhs.defStatus_;
+
+ delete_attributes();
+
completeExpr_ = (rhs.completeExpr_) ? new Expression(*rhs.completeExpr_) : NULL ;
triggerExpr_ = (rhs.triggerExpr_) ? new Expression(*rhs.triggerExpr_) : NULL ;
lateAttr_ = (rhs.lateAttr_) ? new ecf::LateAttr(*rhs.lateAttr_) : NULL ;
@@ -147,6 +161,7 @@ Node& Node::operator=(const Node& rhs)
if ( child_attrs_ ) child_attrs_->set_node(this);
if ( misc_attrs_ ) misc_attrs_->set_node(this);
+ limitVec_.clear();
for (size_t l = 0; l< rhs.limitVec_.size(); l++ ) {
limit_ptr the_limit = boost::make_shared<Limit>( *rhs.limitVec_[l]);
the_limit->set_node(this);
@@ -157,13 +172,7 @@ Node& Node::operator=(const Node& rhs)
}
Node::~Node() {
- delete completeExpr_;
- delete triggerExpr_;
- delete lateAttr_;
- delete autoCancel_;
- delete time_dep_attrs_;
- delete child_attrs_;
- delete misc_attrs_;
+ delete_attributes();
}
bool Node::isParentSuspended() const
@@ -201,6 +210,9 @@ void Node::suspend()
void Node::begin()
{
+ // record effect of defstatus for node changes, for verify attributes
+ if (misc_attrs_) misc_attrs_->begin();
+
// Set the state without causing any side effects
initState(0);
@@ -212,7 +224,6 @@ void Node::begin()
if (lateAttr_) lateAttr_->reset();
if (child_attrs_) child_attrs_->begin();
- if (misc_attrs_) misc_attrs_->begin();
for(size_t i = 0; i < limitVec_.size(); i++) { limitVec_[i]->reset(); }
// Let time base attributes use, relative duration if applicable
@@ -776,6 +787,10 @@ void Node::set_state(NState::State s, bool force, const std::string& additional_
void Node::setStateOnly(NState::State newState, bool force, const std::string& additional_info_to_log)
{
+ if (state_.first.state() == newState) {
+ return; // if old and new state the same dont do anything
+ }
+
Suite* theSuite = suite();
const Calendar& calendar = theSuite->calendar();
@@ -1582,7 +1597,7 @@ bool Node::operator==(const Node& rhs) const
if (limitVec_.size() != rhs.limitVec_.size()) {
#ifdef DEBUG
if (Ecf::debug_equality()) {
- std::cout << "Node::operator== (limitVec_.size() != rhs.limitVec_.size()) " << debugNodePath() << "\n";
+ std::cout << "Node::operator== (limitVec_.size(" << limitVec_.size() << ") != rhs.limitVec_.size(" << rhs.limitVec_.size() << ")) " << debugNodePath() << "\n";
}
#endif
return false;
@@ -1708,14 +1723,21 @@ bool Node::operator==(const Node& rhs) const
//#define DEBUG_WHY 1
-void Node::top_down_why(std::vector<std::string>& theReasonWhy) const
+bool Node::top_down_why(std::vector<std::string>& theReasonWhy,bool html_tags) const
{
- why(theReasonWhy);
+#ifdef DEBUG_WHY
+ cout << "Node::top_down_why\n";
+#endif
+ return why(theReasonWhy,true/* top down */,html_tags);
}
-void Node::bottom_up_why(std::vector<std::string>& theReasonWhy) const
+void Node::bottom_up_why(std::vector<std::string>& theReasonWhy,bool html_tags) const
{
- defs()->why(theReasonWhy);
+#ifdef DEBUG_WHY
+ cout << "Node::bottom_up_why\n";
+#endif
+
+ defs()->why(theReasonWhy,html_tags);
std::vector<Node*> vec;
vec.push_back(const_cast<Node*>(this));
@@ -1726,40 +1748,53 @@ void Node::bottom_up_why(std::vector<std::string>& theReasonWhy) const
}
vector<Node*>::reverse_iterator r_end = vec.rend();
for(vector<Node*>::reverse_iterator r = vec.rbegin(); r!=r_end; ++r) {
- (*r)->why(theReasonWhy);
+ (void)(*r)->why(theReasonWhy,false,html_tags);
}
}
-void Node::why(std::vector<std::string>& vec) const
+bool Node::why(std::vector<std::string>& vec,bool top_down,bool html) const
{
#ifdef DEBUG_WHY
- std::cout << "Node::why " << debugNodePath() << " (" << NState::toString(state()) << ")\n";
+ std::cout << "Node::why " << debugNodePath() << " (" << NState::toString(state()) << ") top_down(" << top_down << ") html(" << html << ")\n";
#endif
+ bool why_found = false;
if (isSuspended()) {
- std::string theReasonWhy = "The node '";
- theReasonWhy += debugNodePath();
- theReasonWhy += "' is suspended.";
+ std::string theReasonWhy;
+ if (html) {
+ theReasonWhy = path_href();
+ theReasonWhy += " is ";
+ theReasonWhy += DState::to_html(DState::SUSPENDED);
+ }
+ else {
+ theReasonWhy = debugNodePath();
+ theReasonWhy += " is suspended";
+ }
vec.push_back(theReasonWhy);
+ why_found = true ; // return true if why found
}
else if (state() != NState::QUEUED && state() != NState::ABORTED) {
std::stringstream ss;
- ss << "The node '" << debugNodePath() << "' (" << NState::toString(state()) << ") is not queued or aborted.";
+ if (html) ss << path_href() << " (" << NState::to_html(state()) << ") is not queued or aborted";
+ else ss << debugNodePath() << " (" << NState::toString(state()) << ") is not queued or aborted";
vec.push_back(ss.str());
// When task is active/submitted no point, going any further.
// However for FAMILY/SUITE we still need to proceed
- if (isTask()) return;
+ if (isTask()) return why_found;
+ why_found = true ; // return true if why found
}
- // Check limits using in limit manager
- inLimitMgr_.why(vec);
+ // Check limits using in limit manager
+ if (inLimitMgr_.why(vec,top_down,html)) why_found = true ; // return true if why found
// Prefix <node-type> <path> <state>
std::string prefix = debugType();
prefix += " ";
- prefix += absNodePath();
- prefix += " (";
- prefix += NState::toString(state());
+ if (html) prefix += path_href_attribute(absNodePath());
+ else prefix += absNodePath();
+ prefix += "(";
+ if (html) prefix += NState::to_html(state());
+ else prefix += NState::toString(state());
prefix += ") ";
if (time_dep_attrs_) {
@@ -1767,7 +1802,7 @@ void Node::why(std::vector<std::string>& vec) const
std::cout << " Node::why " << debugNodePath() << " checking time dependencies\n";
#endif
// postfix = <attr-type dependent> <next run time > < optional current state>
- time_dep_attrs_->why(vec,prefix);
+ if (time_dep_attrs_->why(vec,prefix)) why_found = true ; // return true if why found
}
// **************************************************************************************
@@ -1786,9 +1821,17 @@ void Node::why(std::vector<std::string>& vec) const
std::cout << " Node::why " << debugNodePath() << " checking trigger dependencies\n";
#endif
std::string postFix;
- if (theTriggerAst->why(postFix)) { vec.push_back(prefix + postFix); }
+ if (theTriggerAst->why(postFix,html)) {
+ vec.push_back(prefix + postFix);
+ why_found = true ; // return true if why found
+ }
}
}
+
+#ifdef DEBUG_WHY
+ std::cout << " Node::why " << debugNodePath() << " why found(" << why_found << ")\n";
+#endif
+ return why_found; // no why found
}
bool Node::checkInvariants(std::string& errorMsg) const
@@ -1845,6 +1888,34 @@ std::string Node::debugNodePath() const
return ret;
}
+std::string Node::path_href_attribute(const std::string& path)
+{
+ std::string ret = "<a href=\"";
+ ret += path;
+ ret += "\">";
+ ret += path;
+ ret += "</a>";
+ return ret;
+}
+
+std::string Node::path_href_attribute(const std::string& path,const std::string& path2)
+{
+ std::string ret = "<a href=\"";
+ ret += path;
+ ret += "\">";
+ ret += path2;
+ ret += "</a>";
+ return ret;
+}
+
+std::string Node::path_href() const
+{
+ std::string ret = debugType();
+ ret += " ";
+ ret += path_href_attribute(absNodePath());
+ return ret;
+}
+
void Node::verification(std::string& errorMsg) const
{
if (misc_attrs_) misc_attrs_->verification(errorMsg);
@@ -2004,9 +2075,18 @@ void Node::notify_delete()
#endif
}
+void Node::notify_start(const std::vector<ecf::Aspect::Type>& aspects)
+{
+ size_t observers_size = observers_.size();
+ for(size_t i = 0; i < observers_size; i++) {
+ observers_[i]->update_start(this,aspects);
+ }
+}
+
void Node::notify(const std::vector<ecf::Aspect::Type>& aspects)
{
- for(size_t i = 0; i < observers_.size(); i++) {
+ size_t observers_size = observers_.size();
+ for(size_t i = 0; i < observers_size; i++) {
observers_[i]->update(this,aspects);
}
}
@@ -2036,6 +2116,29 @@ bool Node::is_observed(AbstractObserver* obs) const
return false;
}
+void Node::sort_attributes(ecf::Attr::Type attr, bool /* recursive */)
+{
+ state_change_no_ = Ecf::incr_state_change_no();
+ switch ( attr ) {
+ case Attr::EVENT: if (child_attrs_) child_attrs_->sort_attributes(attr); break;
+ case Attr::METER: if (child_attrs_) child_attrs_->sort_attributes(attr); break;
+ case Attr::LABEL: if (child_attrs_) child_attrs_->sort_attributes(attr); break;
+ case Attr::LIMIT:
+ sort(limitVec_.begin(),limitVec_.end(),boost::bind(Str::caseInsLess,
+ boost::bind(&Limit::name,_1),
+ boost::bind(&Limit::name,_2)));
+ break;
+ case Attr::VARIABLE:
+ sort(varVec_.begin(),varVec_.end(),boost::bind(Str::caseInsLess,
+ boost::bind(&Variable::name,_1),
+ boost::bind(&Variable::name,_2)));
+ break;
+ case Attr::UNKNOWN: break;
+ default: break;
+ }
+}
+
+
static std::vector<ecf::TimeAttr> timeVec_;
static std::vector<ecf::TodayAttr> todayVec_;
static std::vector<DateAttr> dates_;
diff --git a/ANode/src/Node.hpp b/ANode/src/Node.hpp
index 130be27..51c1141 100644
--- a/ANode/src/Node.hpp
+++ b/ANode/src/Node.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #251 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -57,6 +57,7 @@
#include "NodeFwd.hpp"
#include "Flag.hpp"
#include "Aspect.hpp"
+#include "Attr.hpp"
class AbstractObserver;
namespace ecf { class Simulator; class SimulatorVisitor; class DefsAnalyserVisitor; class FlatAnalyserVisitor; } // forward declare for friendship
@@ -166,8 +167,8 @@ public:
virtual bool run(JobsParam& jobsParam, bool force) = 0;
/// Recursively determines why the node is not running.
- virtual void top_down_why(std::vector<std::string>& theReasonWhy) const;
- void bottom_up_why(std::vector<std::string>& theReasonWhy) const;
+ virtual bool top_down_why(std::vector<std::string>& theReasonWhy,bool html_tags = false) const;
+ void bottom_up_why(std::vector<std::string>& theReasonWhy,bool html_tags = false) const;
void freeTrigger() const;
void clearTrigger() const;
@@ -291,6 +292,9 @@ public:
/// returns abs node path preceded by the type of the node
std::string debugNodePath() const;
+ static std::string path_href_attribute(const std::string& path);
+ static std::string path_href_attribute(const std::string& path,const std::string& path2);
+ std::string path_href() const;
/// returns true if this node OR any of its children
/// has cron,time,day,date or today time dependencies
@@ -379,8 +383,8 @@ public:
void addDay( const DayAttr& );
void addCron( const ecf::CronAttr& );
- void addLimit(const Limit& ); // will throw std::runtime_error if duplicate
- void addInLimit(const InLimit& l) { inLimitMgr_.addInLimit(l);} // will throw std::runtime_error if duplicate
+ void addLimit(const Limit& ); // will throw std::runtime_error if duplicate
+ void addInLimit(const InLimit& l); // will throw std::runtime_error if duplicate
void auto_add_inlimit_externs(Defs* defs) { inLimitMgr_.auto_add_inlimit_externs(defs);}
void addEvent( const Event& ); // will throw std::runtime_error if duplicate
void addMeter( const Meter& ); // will throw std::runtime_error if duplicate
@@ -390,6 +394,9 @@ public:
void addRepeat( const Repeat& ); // will throw std::runtime_error if duplicate
void addZombie( const ZombieAttr& ); // will throw std::runtime_error if duplicate
+ // sort
+ // expect one attr to be [ event | meter | label | limits | variable ]
+ virtual void sort_attributes( ecf::Attr::Type at, bool recursive);
// Delete functions: can throw std::runtime_error ===================================
// if name argument is empty, delete all attributes of that type
@@ -447,27 +454,27 @@ public:
virtual void collateChanges(DefsDelta& ) const = 0;
void incremental_changes(DefsDelta&, compound_memento_ptr& comp) const;
- void set_memento(const StateMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeDefStatusDeltaMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const SuspendedMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeEventMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeMeterMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeLabelMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeTriggerMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeCompleteMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeRepeatMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeLimitMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeInLimitMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeVariableMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeLateMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeTodayMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeTimeMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeDayMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeCronMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeDateMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeZombieMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const NodeVerifyMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const FlagMemento*,std::vector<ecf::Aspect::Type>& aspects );
+ void set_memento(const StateMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeDefStatusDeltaMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const SuspendedMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeEventMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeMeterMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeLabelMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeTriggerMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeCompleteMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeRepeatMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeLimitMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeInLimitMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeVariableMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeLateMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeTodayMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeTimeMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeDayMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeCronMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeDateMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeZombieMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const NodeVerifyMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const FlagMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
// Find functions: ============================================================
// Will search for a node by name(ie not a path) first on siblings, then on a parent
@@ -593,7 +600,7 @@ protected:
friend class Defs;
friend class Family;
friend class NodeContainer;
- virtual bool doDeleteChild(Node* child) { return false;}
+ virtual bool doDeleteChild(Node* ) { return false;}
/// This function is called as a part of handling state change.
@@ -624,13 +631,14 @@ protected:
void check_for_lateness(const ecf::Calendar& c,const ecf::LateAttr*);
public:
+ void notify_start(const std::vector<ecf::Aspect::Type>& aspects);
void notify(const std::vector<ecf::Aspect::Type>& aspects);
void attach(AbstractObserver*);
void detach(AbstractObserver*);
bool is_observed(AbstractObserver*) const ; // return true if we have this observer in our list
private:
- void why(std::vector<std::string>& theReasonWhy) const;
+ bool why(std::vector<std::string>& theReasonWhy,bool top_down = false,bool html_tags = false) const;
/// Function used as a part of trigger and complete expressions.
/// The search pattern is event,meter,user-variable,repeat, generated-variable
int findExprVariableValue( const std::string& name) const;
@@ -679,6 +687,7 @@ private: // alow simulator access
private: // All mementos access
friend class CompoundMemento;
void clear(); /// Clear *ALL* internal attributes
+ void delete_attributes();
private: /// For use by python interface,
friend void export_Node();
diff --git a/ANode/src/NodeAdd.cpp b/ANode/src/NodeAdd.cpp
index af97318..ac3e947 100644
--- a/ANode/src/NodeAdd.cpp
+++ b/ANode/src/NodeAdd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #50 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -75,6 +75,8 @@ void Node::add_trigger_expression(const Expression& t)
ss << "to add large triggers use multiple calls to Node::add_part_trigger( PartExpression('t1 == complete') )";
throw std::runtime_error( ss.str() );
}
+ if (isSuite()) throw std::runtime_error( "Can not add trigger on a suite" );
+
triggerExpr_ = new Expression(t);
state_change_no_ = Ecf::incr_state_change_no();
}
@@ -87,18 +89,24 @@ void Node::add_complete_expression(const Expression& t)
ss << "to add large complete expressions use multiple calls to Node::add_part_complete( PartExpression('t1 == complete') )";
throw std::runtime_error( ss.str() );
}
+ if (isSuite()) throw std::runtime_error( "Can not add complete trigger on a suite" );
+
completeExpr_ = new Expression(t);
state_change_no_ = Ecf::incr_state_change_no();
}
void Node::add_part_trigger(const PartExpression& part)
{
+ if (isSuite()) throw std::runtime_error( "Can not add trigger on a suite" );
+
if (!triggerExpr_) triggerExpr_ = new Expression();
triggerExpr_->add( part );
state_change_no_ = Ecf::incr_state_change_no();
}
void Node::add_part_complete(const PartExpression& part)
{
+ if (isSuite()) throw std::runtime_error( "Can not add complete trigger on a suite" );
+
if (!completeExpr_) completeExpr_ = new Expression();
completeExpr_->add( part );
state_change_no_ = Ecf::incr_state_change_no();
@@ -230,6 +238,12 @@ void Node::addLimit(const Limit& l )
state_change_no_ = Ecf::incr_state_change_no();
}
+void Node::addInLimit(const InLimit& l)
+{
+ inLimitMgr_.addInLimit(l);
+ state_change_no_ = Ecf::incr_state_change_no();
+}
+
static void throwIfRepeatAllreadyExists(Node* node)
{
if (!node->repeat().empty()) {
diff --git a/ANode/src/NodeChange.cpp b/ANode/src/NodeChange.cpp
index 452c27a..75a73a5 100644
--- a/ANode/src/NodeChange.cpp
+++ b/ANode/src/NodeChange.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #33 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/NodeContainer.cpp b/ANode/src/NodeContainer.cpp
index dcef371..f7838e7 100644
--- a/ANode/src/NodeContainer.cpp
+++ b/ANode/src/NodeContainer.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #135 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -191,11 +191,18 @@ void NodeContainer::status()
for(size_t t = 0; t < node_vec_size; t++) { nodeVec_[t]->status(); }
}
-void NodeContainer::top_down_why(std::vector<std::string>& theReasonWhy) const
+bool NodeContainer::top_down_why(std::vector<std::string>& theReasonWhy,bool html_tags) const
{
- Node::why(theReasonWhy);
- size_t node_vec_size = nodeVec_.size();
- for(size_t t = 0; t < node_vec_size; t++) { nodeVec_[t]->top_down_why(theReasonWhy); }
+ bool why_found = Node::why(theReasonWhy,true/*top down*/,html_tags);
+ if (!why_found) {
+ size_t node_vec_size = nodeVec_.size();
+ for(size_t t = 0; t < node_vec_size; t++) {
+ if (nodeVec_[t]->top_down_why(theReasonWhy,html_tags)) {
+ why_found = true;
+ }
+ }
+ }
+ return why_found;
}
void NodeContainer::incremental_changes( DefsDelta& changes, compound_memento_ptr& comp) const
@@ -223,11 +230,15 @@ void NodeContainer::incremental_changes( DefsDelta& changes, compound_memento_pt
Node::incremental_changes(changes, comp);
}
-void NodeContainer::set_memento( const OrderMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void NodeContainer::set_memento( const OrderMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only) {
#ifdef DEBUG_MEMENTO
std::cout << "NodeContainer::set_memento( const OrderMemento* ) " << debugNodePath() << "\n";
#endif
-
+ if (aspect_only) {
+ aspects.push_back(ecf::Aspect::ORDER);
+ return;
+ }
+
// Order nodeVec_ according to memento ordering
const std::vector<std::string>& order = memento->order_;
if (order.size() != nodeVec_.size()) {
@@ -251,18 +262,20 @@ void NodeContainer::set_memento( const OrderMemento* memento,std::vector<ecf::As
return;
}
- aspects.push_back(ecf::Aspect::ORDER);
nodeVec_ = vec;
}
-void NodeContainer::set_memento( const ChildrenMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void NodeContainer::set_memento( const ChildrenMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only) {
#ifdef DEBUG_MEMENTO
std::cout << "NodeContainer::set_memento( const OrderMemento* ) " << debugNodePath() << "\n";
#endif
- aspects.push_back(ecf::Aspect::ADD_REMOVE_NODE);
- nodeVec_ = memento->children_;
+ if (aspect_only) {
+ aspects.push_back(ecf::Aspect::ADD_REMOVE_NODE);
+ return;
+ }
// setup child parent pointers
+ nodeVec_ = memento->children_;
size_t node_vec_size = nodeVec_.size();
for(size_t t = 0; t < node_vec_size; t++) {
nodeVec_[t]->set_parent(this);
@@ -272,7 +285,7 @@ void NodeContainer::set_memento( const ChildrenMemento* memento,std::vector<ecf:
void NodeContainer::collateChanges(DefsDelta& changes) const
{
- /// There no point in traversing children of we have added/removed children
+ /// Theres no point in traversing children if we have added/removed children
/// since ChildrenMemento will copy all children.
if (add_remove_state_change_no_ > changes.client_state_change_no()) {
return;
@@ -972,7 +985,7 @@ bool NodeContainer::operator==(const NodeContainer& rhs) const
}
Family* family = nodeVec_[i]->isFamily(); LOG_ASSERT( family, "" );
- if ( !( *family == *rhs_family )) {
+ if ( family/*keep clang happy*/ && !( *family == *rhs_family )) {
#ifdef DEBUG
if (Ecf::debug_equality()) {
std::cout << "NodeContainer::operator== if ( !( *family == *rhs_family )) " << absNodePath() << "\n";
@@ -1049,6 +1062,15 @@ void NodeContainer::update_limits()
for(size_t t = 0; t < node_vec_size; t++) { nodeVec_[t]->update_limits(); }
}
+void NodeContainer::sort_attributes(ecf::Attr::Type attr,bool recursive)
+{
+ Node::sort_attributes(attr,recursive);
+ if (recursive) {
+ size_t node_vec_size = nodeVec_.size();
+ for(size_t t = 0; t < node_vec_size; t++) { nodeVec_[t]->sort_attributes(attr,recursive); }
+ }
+}
+
bool NodeContainer::doDeleteChild(Node* child)
{
SuiteChanged1 changed(suite());
diff --git a/ANode/src/NodeContainer.hpp b/ANode/src/NodeContainer.hpp
index 1b1a6a4..0c7ba6a 100644
--- a/ANode/src/NodeContainer.hpp
+++ b/ANode/src/NodeContainer.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #88 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -19,6 +19,7 @@
#include <limits>
#include "Node.hpp"
#include "CheckPtContext.hpp"
+#include "MigrateContext.hpp"
class NodeContainer : public Node {
protected:
@@ -40,10 +41,10 @@ public:
virtual bool run(JobsParam& jobsParam, bool force);
virtual void kill(const std::string& zombie_pid = "");
virtual void status();
- virtual void top_down_why(std::vector<std::string>& theReasonWhy) const;
+ virtual bool top_down_why(std::vector<std::string>& theReasonWhy,bool html_tags = false) const;
virtual void collateChanges(DefsDelta&) const;
- void set_memento(const OrderMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const ChildrenMemento*,std::vector<ecf::Aspect::Type>& aspects );
+ void set_memento(const OrderMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
+ void set_memento(const ChildrenMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f );
virtual void order(Node* immediateChild, NOrder::Order);
virtual bool hasAutoCancel() const;
@@ -62,7 +63,8 @@ public:
virtual node_ptr findImmediateChild(const std::string& name,size_t& child_pos) const;
virtual node_ptr find_node_up_the_tree(const std::string& name) const;
- virtual node_ptr find_relative_node(const std::vector<std::string>& pathToNode);
+ virtual node_ptr
+ find_relative_node(const std::vector<std::string>& pathToNode);
void find_closest_matching_node( const std::vector< std::string >& pathToNode, int indexIntoPathNode, node_ptr& closest_matching_node );
family_ptr findFamily(const std::string& familyName) const;
@@ -101,6 +103,7 @@ public:
virtual void setStateOnlyHierarchically(NState::State s,bool force = false);
virtual void set_state_hierarchically(NState::State s, bool force);
virtual void update_limits();
+ virtual void sort_attributes(ecf::Attr::Type attr,bool recursive);
private:
virtual size_t child_position(const Node*) const;
@@ -150,7 +153,8 @@ private:
// When check-pointing we always need to save the children
if (Archive::is_saving::value &&
get_flag().is_set(ecf::Flag::MIGRATED) &&
- ! ecf::CheckPtContext::in_checkpt()
+ ! ecf::CheckPtContext::in_checkpt() &&
+ ! ecf::MigrateContext::in_migrate()
) {
std::vector<node_ptr> nodeVec;
diff --git a/ANode/src/NodeDelete.cpp b/ANode/src/NodeDelete.cpp
index 9a56fca..e475013 100644
--- a/ANode/src/NodeDelete.cpp
+++ b/ANode/src/NodeDelete.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #26 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/NodeFind.cpp b/ANode/src/NodeFind.cpp
index bd5361b..cb55682 100644
--- a/ANode/src/NodeFind.cpp
+++ b/ANode/src/NodeFind.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #53 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -560,8 +560,13 @@ node_ptr Node::findReferencedNode(const std::string& nodePath, std::string& erro
{
return findReferencedNode(nodePath,Str::EMPTY(),errorMsg);
}
+
+//#define DEBUG_FIND_REFERENCED_NODE 1
node_ptr Node::findReferencedNode(const std::string& nodePath, const std::string& extern_obj, std::string& errorMsg) const
{
+#ifdef DEBUG_FIND_REFERENCED_NODE
+ cout << "Node::findReferencedNode path:" << nodePath << " extern_obj:" << extern_obj << "\n";
+#endif
Defs* theDefs = defs();
if (!theDefs) {
// In the case where we have a stand alone Node. i.e no parent set. The Defs will be NULL.
diff --git a/ANode/src/NodeFwd.hpp b/ANode/src/NodeFwd.hpp
index 0a0287a..1a3edd1 100644
--- a/ANode/src/NodeFwd.hpp
+++ b/ANode/src/NodeFwd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #44 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/NodeMemento.cpp b/ANode/src/NodeMemento.cpp
index 26059ce..0d915e5 100644
--- a/ANode/src/NodeMemento.cpp
+++ b/ANode/src/NodeMemento.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #48 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -278,114 +278,149 @@ void Node::incremental_changes( DefsDelta& changes, compound_memento_ptr& comp)
}
}
-
-void Node::set_memento(const StateMemento* memento,std::vector<ecf::Aspect::Type>& aspects) {
+void Node::set_memento(const StateMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const StateMemento* memento) " << debugNodePath() << " " << NState::toString(memento->state_) << "\n";
#endif
- aspects.push_back(ecf::Aspect::STATE);
- setStateOnly( memento->state_ );
+
+ if (aspect_only) aspects.push_back(ecf::Aspect::STATE);
+ else setStateOnly( memento->state_ );
}
+void Node::set_memento( const NodeDefStatusDeltaMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
-void Node::set_memento( const NodeDefStatusDeltaMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
-#ifdef DEBUG_MEMENTO
+ #ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeDefStatusDeltaMemento* memento) " << debugNodePath() << "\n";
#endif
- aspects.push_back(ecf::Aspect::DEFSTATUS);
- defStatus_.setState( memento->state_ );
-}
+ if (aspect_only) aspects.push_back(ecf::Aspect::DEFSTATUS);
+ else defStatus_.setState( memento->state_ );
+}
-void Node::set_memento( const SuspendedMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const SuspendedMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const SuspendedMemento* memento) " << debugNodePath() << "\n";
#endif
- aspects.push_back(ecf::Aspect::SUSPENDED);
+ if (aspect_only) {
+ aspects.push_back(ecf::Aspect::SUSPENDED);
+ return;
+ }
+
if (memento->suspended_) suspend();
else clearSuspended();
}
-
-void Node::set_memento( const NodeEventMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeEventMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeEventMemento* memento) " << debugNodePath() << "\n";
#endif
+
+ if (aspect_only) {
+ // For attribute add/delete Should have already added ecf::Aspect::ADD_REMOVE_ATTR to aspects
+ aspects.push_back(ecf::Aspect::EVENT);
+ return;
+ }
+
if (child_attrs_) {
- child_attrs_->set_memento(memento,aspects);
+ child_attrs_->set_memento(memento);
return;
}
addEvent( memento->event_);
}
-void Node::set_memento( const NodeMeterMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeMeterMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeMeterMemento* memento) " << debugNodePath() << "\n";
#endif
+
+ if (aspect_only) {
+ // For attribute add/delete Should have already added ecf::Aspect::ADD_REMOVE_ATTR to aspects
+ aspects.push_back(ecf::Aspect::METER);
+ return;
+ }
+
if (child_attrs_) {
- child_attrs_->set_memento(memento,aspects);
+ child_attrs_->set_memento(memento);
return;
}
addMeter(memento->meter_);
}
-void Node::set_memento( const NodeLabelMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeLabelMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeLabelMemento* memento) " << debugNodePath() << "\n";
#endif
+
+ if (aspect_only) {
+ // For attribute add/delete Should have already added ecf::Aspect::ADD_REMOVE_ATTR to aspects
+ aspects.push_back(ecf::Aspect::LABEL);
+ return;
+ }
+
if (child_attrs_) {
- child_attrs_->set_memento(memento,aspects);
+ child_attrs_->set_memento(memento);
return;
}
addLabel(memento->label_);
}
-void Node::set_memento( const NodeTriggerMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeTriggerMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeTriggerMemento* memento) " << debugNodePath() << "\n";
#endif
- if (triggerExpr_) {
+ if (aspect_only) {
+ // For attribute add/delete, should have already added ecf::Aspect::ADD_REMOVE_ATTR to aspects
aspects.push_back(ecf::Aspect::EXPR_TRIGGER);
+ return;
+ }
+
+ if (triggerExpr_) {
if (memento->exp_.isFree()) freeTrigger();
else clearTrigger();
return;
}
-
- // ADD_REMOVE_ATTR aspect
add_trigger_expression( memento->exp_);
}
-void Node::set_memento( const NodeCompleteMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeCompleteMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeCompleteMemento* memento) " << debugNodePath() << "\n";
#endif
- if (completeExpr_) {
+ if (aspect_only) {
+ // For attribute add/delete, should have already added ecf::Aspect::ADD_REMOVE_ATTR to aspects
aspects.push_back(ecf::Aspect::EXPR_COMPLETE);
+ return;
+ }
+
+ if (completeExpr_) {
if (memento->exp_.isFree()) freeComplete();
else clearComplete();
return;
}
-
- // ADD_REMOVE_ATTR aspect
add_complete_expression( memento->exp_);
}
-void Node::set_memento( const NodeRepeatMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeRepeatMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeRepeatMemento* memento) " << debugNodePath() << "\n";
#endif
- if (!repeat_.empty()) {
+ if (aspect_only) {
+ // For attribute add/delete, should have already added ecf::Aspect::ADD_REMOVE_ATTR to aspects
aspects.push_back(ecf::Aspect::REPEAT);
+ return;
+ }
+
+ if (!repeat_.empty()) {
// Note: the node is incremented one past, the last value
// In Node we increment() then check for validity
@@ -399,167 +434,197 @@ void Node::set_memento( const NodeRepeatMemento* memento,std::vector<ecf::Aspect
return;
}
- // ADD_REMOVE_ATTR aspect
addRepeat(memento->repeat_);
}
-void Node::set_memento( const NodeLimitMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeLimitMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeLimitMemento* memento) " << debugNodePath() << " " << memento->limit_.toString() << "\n";
#endif
+ if (aspect_only) {
+ // For attribute add/delete, should have already added ecf::Aspect::ADD_REMOVE_ATTR to aspects
+ aspects.push_back(ecf::Aspect::LIMIT);
+ return;
+ }
+
limit_ptr limit = find_limit(memento->limit_.name());
if (limit.get()) {
- aspects.push_back(ecf::Aspect::LIMIT);
- limit->set_state( memento->limit_.theLimit(), memento->limit_.value(), memento->limit_.paths() );
+ limit->set_state( memento->limit_.theLimit(), memento->limit_.value(), memento->limit_.paths() );
return;
}
-
- // ADD_REMOVE_ATTR aspect
addLimit(memento->limit_);
}
-void Node::set_memento( const NodeInLimitMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeInLimitMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeInLimitMemento* memento) " << debugNodePath() << "\n";
#endif
- // ADD_REMOVE_ATTR aspect only, since no state
+ if (aspect_only) {
+ // ADD_REMOVE_ATTR aspect only, since no state
+ // For attribute add/delete, should have already added ecf::Aspect::ADD_REMOVE_ATTR to aspects
+ return;
+ }
addInLimit(memento->inlimit_);
}
-void Node::set_memento( const NodeVariableMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeVariableMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeVariableMemento* memento) " << debugNodePath() << "\n";
#endif
+ // If we have added/delete variables then ecf::Aspect::ADD_REMOVE_ATTR has already been added to aspects
+ if (aspect_only) {
+ aspects.push_back(ecf::Aspect::NODE_VARIABLE);
+ return;
+ }
size_t theSize = varVec_.size();
for(size_t i = 0; i < theSize; i++) {
if (varVec_[i].name() == memento->var_.name()) {
varVec_[i].set_value( memento->var_.theValue() );
- aspects.push_back(ecf::Aspect::NODE_VARIABLE);
return;
}
}
-
- // ADD_REMOVE_ATTR aspect
addVariable(memento->var_);
}
-void Node::set_memento( const NodeLateMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeLateMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeLateMemento* memento) " << debugNodePath() << "\n";
#endif
- if (lateAttr_) {
+ if (aspect_only) {
+ // For attribute add/delete, should have already added ecf::Aspect::ADD_REMOVE_ATTR to aspects
aspects.push_back(ecf::Aspect::LATE);
+ return;
+ }
+
+ if (lateAttr_) {
lateAttr_->setLate(memento->late_.isLate());
return;
}
-
- // ADD_REMOVE_ATTR aspect
addLate(memento->late_);
}
-void Node::set_memento( const NodeTodayMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeTodayMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeTodayMemento* memento) " << debugNodePath() << "\n";
#endif
- if (time_dep_attrs_ && time_dep_attrs_->set_memento(memento,aspects) ) {
+ if (aspect_only) {
+ // For attribute add/delete, should have already added ecf::Aspect::ADD_REMOVE_ATTR to aspects
aspects.push_back(ecf::Aspect::TODAY);
return;
}
- // ADD_REMOVE_ATTR aspect
+ if (time_dep_attrs_ && time_dep_attrs_->set_memento(memento) ) {
+ return;
+ }
addToday(memento->attr_);
}
-void Node::set_memento( const NodeTimeMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeTimeMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeTimeMemento* memento) " << debugNodePath() << "\n";
#endif
- if (time_dep_attrs_ && time_dep_attrs_->set_memento(memento,aspects) ) {
+ if (aspect_only) {
+ // For attribute add/delete, should have already added ecf::Aspect::ADD_REMOVE_ATTR to aspects
aspects.push_back(ecf::Aspect::TIME);
return;
}
- // ADD_REMOVE_ATTR aspect
+ if (time_dep_attrs_ && time_dep_attrs_->set_memento(memento) ) {
+ return;
+ }
addTime(memento->attr_);
}
-void Node::set_memento( const NodeDayMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeDayMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeDayMemento* memento) " << debugNodePath() << "\n";
#endif
-
- if (time_dep_attrs_ && time_dep_attrs_->set_memento(memento,aspects) ) {
+ if (aspect_only) {
+ // For attribute add/delete, should have already added ecf::Aspect::ADD_REMOVE_ATTR to aspects
aspects.push_back(ecf::Aspect::DAY);
return;
}
- // ADD_REMOVE_ATTR aspect
+ if (time_dep_attrs_ && time_dep_attrs_->set_memento(memento) ) {
+ return;
+ }
addDay(memento->attr_);
}
-void Node::set_memento( const NodeDateMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeDateMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeDateMemento* memento) " << debugNodePath() << "\n";
#endif
- if (time_dep_attrs_ && time_dep_attrs_->set_memento(memento,aspects) ) {
+ if (aspect_only) {
+ // For attribute add/delete, should have already added ecf::Aspect::ADD_REMOVE_ATTR to aspects
aspects.push_back(ecf::Aspect::DATE);
return;
}
- // ADD_REMOVE_ATTR aspect
+ if (time_dep_attrs_ && time_dep_attrs_->set_memento(memento) ) {
+ return;
+ }
addDate(memento->attr_);
}
-void Node::set_memento( const NodeCronMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeCronMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeCronMemento* memento) " << debugNodePath() << "\n";
#endif
-
- if (time_dep_attrs_ && time_dep_attrs_->set_memento(memento,aspects) ) {
+ if (aspect_only) {
+ // For attribute add/delete, should have already added ecf::Aspect::ADD_REMOVE_ATTR to aspects
aspects.push_back(ecf::Aspect::CRON);
return;
}
- // ADD_REMOVE_ATTR aspect
+ if (time_dep_attrs_ && time_dep_attrs_->set_memento(memento) ) {
+ return;
+ }
addCron(memento->attr_);
}
-void Node::set_memento( const FlagMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const FlagMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const FlagMemento* memento) " << debugNodePath() << "\n";
#endif
- aspects.push_back(ecf::Aspect::FLAG);
- flag_.set_flag( memento->flag_.flag() );
+ if (aspect_only) aspects.push_back(ecf::Aspect::FLAG);
+ else flag_.set_flag( memento->flag_.flag() );
}
-void Node::set_memento( const NodeZombieMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeZombieMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeZombieMemento* memento) " << debugNodePath() << "\n";
#endif
+ if (aspect_only) {
+ // For attribute add/delete, should have already added ecf::Aspect::ADD_REMOVE_ATTR to aspects
+ // No state, only ADD_REMOVE_ATTR aspect
+ return;
+ }
+
// Zombie attributes should always be via ADD_REMOVE_ATTR
// See Node::incremental_changes
// Since there is no state to change
@@ -569,16 +634,23 @@ void Node::set_memento( const NodeZombieMemento* memento,std::vector<ecf::Aspect
addZombie(memento->attr_);
}
-void Node::set_memento( const NodeVerifyMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Node::set_memento( const NodeVerifyMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only ) {
#ifdef DEBUG_MEMENTO
std::cout << "Node::set_memento(const NodeVerifyMemento* memento) " << debugNodePath() << "\n";
#endif
+
+ if (aspect_only) {
+ // For attribute add/delete, should have already added ecf::Aspect::ADD_REMOVE_ATTR to aspects
+ return;
+ }
+
if (misc_attrs_) {
misc_attrs_->verifys_.clear();
misc_attrs_->verifys_ = memento->verifys_;
return;
}
+
misc_attrs_ = new MiscAttrs(this);
misc_attrs_->verifys_ = memento->verifys_;
}
diff --git a/ANode/src/NodeState.hpp b/ANode/src/NodeState.hpp
index 933d3ca..445a40a 100644
--- a/ANode/src/NodeState.hpp
+++ b/ANode/src/NodeState.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/NodeTreeVisitor.cpp b/ANode/src/NodeTreeVisitor.cpp
index d69bf88..7786d66 100644
--- a/ANode/src/NodeTreeVisitor.cpp
+++ b/ANode/src/NodeTreeVisitor.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/NodeTreeVisitor.hpp b/ANode/src/NodeTreeVisitor.hpp
index eeaaedb..997bb67 100644
--- a/ANode/src/NodeTreeVisitor.hpp
+++ b/ANode/src/NodeTreeVisitor.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/ResolveExternsVisitor.cpp b/ANode/src/ResolveExternsVisitor.cpp
index 900f38e..38a7612 100644
--- a/ANode/src/ResolveExternsVisitor.cpp
+++ b/ANode/src/ResolveExternsVisitor.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -113,6 +113,21 @@ void AstResolveExternVisitor::visitVariable(AstVariable* astVar)
addExtern(astVar->nodePath(),astVar->name());
}
+void AstResolveExternVisitor::visitFlag(AstFlag* astVar)
+{
+ //std::cout << "AstResolveExternVisitor::visitFlag " << triggerNode_->debugNodePath() << "\n";
+
+ astVar->setParentNode(triggerNode_);
+
+ // See if can reference the path, on the AstFlag, if we can't, it should be added as an extern
+ std::string errorMsg;
+ Node* theReferencedNode = astVar->referencedNode( errorMsg );
+ if ( !theReferencedNode ) {
+ addExtern(astVar->nodePath(),astVar->name()); // return flag:late
+ return;
+ }
+}
+
void AstResolveExternVisitor::addExtern(const std::string& absNodePath, const std::string& var)
{
string ext = absNodePath;
diff --git a/ANode/src/ResolveExternsVisitor.hpp b/ANode/src/ResolveExternsVisitor.hpp
index 5de331f..b8c74c3 100644
--- a/ANode/src/ResolveExternsVisitor.hpp
+++ b/ANode/src/ResolveExternsVisitor.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -69,7 +69,8 @@ public:
virtual void visitNodeState(AstNodeState*){}
virtual void visitEventState(AstEventState*){}
virtual void visitNode(AstNode*);
- virtual void visitVariable(AstVariable*);
+ virtual void visitVariable(AstVariable*);
+ virtual void visitFlag(AstFlag*);
private:
void addExtern(const std::string& absNodePath, const std::string& var = "");
diff --git a/ANode/src/ServerState.cpp b/ANode/src/ServerState.cpp
index 1369b93..6e3026e 100644
--- a/ANode/src/ServerState.cpp
+++ b/ANode/src/ServerState.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #29 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -14,6 +14,8 @@
//============================================================================
#include <assert.h>
#include <iostream>
+#include <boost/bind.hpp>
+
#include "ServerState.hpp"
#include "Str.hpp"
#include "Log.hpp"
@@ -23,6 +25,7 @@
using namespace ecf;
using namespace std;
+using namespace boost;
// When a Defs is loaded into a server:
// o the jobSubmissionInterval_ is set
@@ -131,6 +134,20 @@ bool ServerState::compare(const ServerState& rhs) const
return true;
}
+void ServerState::sort_variables()
+{
+ variable_state_change_no_ = Ecf::incr_state_change_no();
+
+ sort(user_variables_.begin(),user_variables_.end(),boost::bind(Str::caseInsLess,
+ boost::bind(&Variable::name,_1),
+ boost::bind(&Variable::name,_2)));
+
+ sort(server_variables_.begin(),server_variables_.end(),boost::bind(Str::caseInsLess,
+ boost::bind(&Variable::name,_1),
+ boost::bind(&Variable::name,_2)));
+}
+
+
// server variable can NOT be modified or deleted, only overridden
void ServerState::add_or_update_server_variables( const NameValueVec& env)
{
@@ -472,8 +489,9 @@ void ServerState::setup_default_server_variables(std::vector<Variable>& server_
}
/// determines why the node is not running.
-void ServerState::why(std::vector<std::string>& theReasonWhy) const
+bool ServerState::why(std::vector<std::string>& theReasonWhy) const
{
- if (server_state_ == SState::HALTED) theReasonWhy.push_back("The server is halted");
- if (server_state_ == SState::SHUTDOWN) theReasonWhy.push_back("The server is shutdown");
+ if (server_state_ == SState::HALTED) { theReasonWhy.push_back("The server is halted"); return true;}
+ if (server_state_ == SState::SHUTDOWN) { theReasonWhy.push_back("The server is shutdown"); return true;}
+ return false;
}
diff --git a/ANode/src/ServerState.hpp b/ANode/src/ServerState.hpp
index 1faf9da..16e923f 100644
--- a/ANode/src/ServerState.hpp
+++ b/ANode/src/ServerState.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #18 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -48,6 +48,8 @@ public:
/// This does compare server variables. Used in testing
bool compare(const ServerState& rhs) const;
+ void sort_variables();
+
/// The server variable: are automatically added by the server
/// on STARTUP and when a checkpoint file is reloaded.
/// The variable are required by Job creation & needed in creation of generated variables
@@ -99,7 +101,7 @@ public:
unsigned int variable_state_change_no() const { return variable_state_change_no_; }
/// determines why the node is not running.
- void why(std::vector<std::string>& theReasonWhy) const;
+ bool why(std::vector<std::string>& theReasonWhy) const; // return true if why found
/// Used in test
static void setup_default_server_variables(std::vector<Variable>& server_variables, const std::string& port);
diff --git a/ANode/src/Signal.cpp b/ANode/src/Signal.cpp
index aab1747..2db45e1 100644
--- a/ANode/src/Signal.cpp
+++ b/ANode/src/Signal.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/Signal.hpp b/ANode/src/Signal.hpp
index 3ce6263..04845d2 100644
--- a/ANode/src/Signal.hpp
+++ b/ANode/src/Signal.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/Submittable.cpp b/ANode/src/Submittable.cpp
index 3322118..37cada8 100644
--- a/ANode/src/Submittable.cpp
+++ b/ANode/src/Submittable.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #37 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -369,7 +369,7 @@ EcfFile Submittable::locatedEcfFile() const
#ifdef DEBUG_TASK_LOCATION
std::cout << "Submittable::locatedEcfFile() Submittable " << name() << " searching ECF_FILES = '" << ecf_filesDirectory << "' backwards\n";
#endif
- if ( !ecf_filesDirectory.empty() && fs::exists( ecf_filesDirectory ) && fs::is_directory( ecf_filesDirectory ) )
+ if ( !ecf_filesDirectory.empty() && fs::is_directory( ecf_filesDirectory ) )
{
// If File::backwardSearch fails it returns an empty string, i.e failure to locate script (Task/.ecf || Alias/.usr) file
std::string searchResult = File::backwardSearch( ecf_filesDirectory, theAbsNodePath, script_extension() );
@@ -384,7 +384,7 @@ EcfFile Submittable::locatedEcfFile() const
// Before failing try again but with variable Subsitution. ECFLOW-788
std::string original_ecf_filesDirectory = ecf_filesDirectory;
variableSubsitution(ecf_filesDirectory);
- if ( !ecf_filesDirectory.empty() && fs::exists(ecf_filesDirectory) && fs::is_directory(ecf_filesDirectory))
+ if ( !ecf_filesDirectory.empty() && fs::is_directory(ecf_filesDirectory))
{
// If File::backwardSearch fails it returns an empty string, i.e failure to locate script (Task/.ecf || Alias/.usr) file
std::string searchResult = File::backwardSearch( ecf_filesDirectory, theAbsNodePath, script_extension() );
@@ -411,7 +411,7 @@ EcfFile Submittable::locatedEcfFile() const
#ifdef DEBUG_TASK_LOCATION
std::cout << "Submittable::locatedEcfFile() Submittable " << name() << " searching ECF_HOME = '" << ecf_home << "' backwards\n";
#endif
- if ( !ecf_home.empty() && fs::exists( ecf_home ) && fs::is_directory( ecf_home ) )
+ if ( !ecf_home.empty() && fs::is_directory( ecf_home ) )
{
// If File::backwardSearch fails it returns an empty string, i.e failure to locate script (Task/.ecf || Alias/.usr) file
std::string searchResult = File::backwardSearch( ecf_home, theAbsNodePath, script_extension() );
@@ -846,13 +846,16 @@ void Submittable::incremental_changes(DefsDelta& changes, compound_memento_ptr&
Node::incremental_changes(changes,comp);
}
-void Submittable::set_memento(const SubmittableMemento* memento,std::vector<ecf::Aspect::Type>& aspects)
+void Submittable::set_memento(const SubmittableMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only)
{
#ifdef DEBUG_MEMENTO
std::cout << "Submittable::set_memento(const SubmittableMemento*) " << debugNodePath() << "\n";
#endif
- aspects.push_back(ecf::Aspect::SUBMITTABLE);
+ if (aspect_only) {
+ aspects.push_back(ecf::Aspect::SUBMITTABLE);
+ return;
+ }
jobsPassword_ = memento->jobsPassword_;
process_or_remote_id_ = memento->process_or_remote_id_;
diff --git a/ANode/src/Submittable.hpp b/ANode/src/Submittable.hpp
index 8c06af8..0d0c6ac 100644
--- a/ANode/src/Submittable.hpp
+++ b/ANode/src/Submittable.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #16 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -123,7 +123,7 @@ public:
// Memento functions:
void incremental_changes(DefsDelta&, compound_memento_ptr& comp) const;
- void set_memento(const SubmittableMemento*,std::vector<ecf::Aspect::Type>& aspects);
+ void set_memento(const SubmittableMemento*,std::vector<ecf::Aspect::Type>& aspects,bool f);
virtual void read_state(const std::string& line,const std::vector<std::string>& lineTokens);
protected:
diff --git a/ANode/src/Suite.cpp b/ANode/src/Suite.cpp
index 4b077eb..cb1fce1 100644
--- a/ANode/src/Suite.cpp
+++ b/ANode/src/Suite.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #128 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -622,30 +622,33 @@ void Suite::collateChanges(DefsDelta& changes) const
}
}
-void Suite::set_memento( const SuiteClockMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Suite::set_memento( const SuiteClockMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only) {
#ifdef DEBUG_MEMENTO
std::cout << "Suite::set_memento( const SuiteClockMemento*) " << debugNodePath() << "\n";
#endif
- aspects.push_back(ecf::Aspect::SUITE_CLOCK);
- changeClock(memento->clockAttr_);
+ if (aspect_only) aspects.push_back(ecf::Aspect::SUITE_CLOCK);
+ else changeClock(memento->clockAttr_);
}
-void Suite::set_memento( const SuiteBeginDeltaMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Suite::set_memento( const SuiteBeginDeltaMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only) {
#ifdef DEBUG_MEMENTO
std::cout << "Suite::set_memento( const SuiteBeginDeltaMemento* ) " << debugNodePath() << "\n";
#endif
- aspects.push_back(ecf::Aspect::SUITE_BEGIN);
- begun_ = memento->begun_;
+ if (aspect_only) aspects.push_back(ecf::Aspect::SUITE_BEGIN);
+ else begun_ = memento->begun_;
}
-void Suite::set_memento( const SuiteCalendarMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Suite::set_memento( const SuiteCalendarMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only) {
#ifdef DEBUG_MEMENTO
std::cout << "Suite::set_memento( const SuiteCalendarMemento* ) " << debugNodePath() << "\n";
#endif
- aspects.push_back(ecf::Aspect::SUITE_CALENDAR);
+ if (aspect_only) {
+ aspects.push_back(ecf::Aspect::SUITE_CALENDAR);
+ return;
+ }
// The calendar does *NOT* persist the calendar type (hybrid/real) since we can derive this for clock attribute
// Hence make sure calendar/clock are in sync. part of the suite invariants
diff --git a/ANode/src/Suite.hpp b/ANode/src/Suite.hpp
index 4ff8e72..95e22a8 100644
--- a/ANode/src/Suite.hpp
+++ b/ANode/src/Suite.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #73 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -100,11 +100,11 @@ public:
// Memento functions
virtual void collateChanges(DefsDelta&) const;
- void set_memento(const SuiteClockMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const SuiteBeginDeltaMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const SuiteCalendarMemento*,std::vector<ecf::Aspect::Type>& aspects );
- void set_memento(const OrderMemento* m,std::vector<ecf::Aspect::Type>& aspects) { NodeContainer::set_memento(m,aspects); }
- void set_memento(const ChildrenMemento* m,std::vector<ecf::Aspect::Type>& aspects) { NodeContainer::set_memento(m,aspects); }
+ void set_memento(const SuiteClockMemento*,std::vector<ecf::Aspect::Type>& aspects,bool);
+ void set_memento(const SuiteBeginDeltaMemento*,std::vector<ecf::Aspect::Type>& aspects,bool);
+ void set_memento(const SuiteCalendarMemento*,std::vector<ecf::Aspect::Type>& aspects,bool);
+ void set_memento(const OrderMemento* m,std::vector<ecf::Aspect::Type>& aspects,bool f) { NodeContainer::set_memento(m,aspects,f); }
+ void set_memento(const ChildrenMemento* m,std::vector<ecf::Aspect::Type>& aspects,bool f) { NodeContainer::set_memento(m,aspects,f); }
void set_state_change_no( unsigned int x ) { state_change_no_ = x;}
unsigned int state_change_no() const { return state_change_no_; }
diff --git a/ANode/src/SuiteChanged.cpp b/ANode/src/SuiteChanged.cpp
index 7f1fc6a..a799b0f 100644
--- a/ANode/src/SuiteChanged.cpp
+++ b/ANode/src/SuiteChanged.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/SuiteChanged.hpp b/ANode/src/SuiteChanged.hpp
index 11f50c2..47529dd 100644
--- a/ANode/src/SuiteChanged.hpp
+++ b/ANode/src/SuiteChanged.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/System.cpp b/ANode/src/System.cpp
index 3894f79..509a78a 100644
--- a/ANode/src/System.cpp
+++ b/ANode/src/System.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #39 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/System.hpp b/ANode/src/System.hpp
index a01b830..1afd200 100644
--- a/ANode/src/System.hpp
+++ b/ANode/src/System.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #18 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/Task.cpp b/ANode/src/Task.cpp
index b88f4b2..3d0e82b 100644
--- a/ANode/src/Task.cpp
+++ b/ANode/src/Task.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #204 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -786,11 +786,15 @@ void Task::collateChanges(DefsDelta& changes) const
for(size_t t = 0; t < vec_size; t++) { aliases_[t]->collateChanges(changes); }
}
-void Task::set_memento( const OrderMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Task::set_memento( const OrderMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only) {
#ifdef DEBUG_MEMENTO
std::cout << "Task::set_memento( const OrderMemento* ) " << debugNodePath() << "\n";
#endif
-
+ if (aspect_only) {
+ aspects.push_back(ecf::Aspect::ORDER);
+ return;
+ }
+
// Order aliases_ according to memento ordering
const std::vector<std::string>& order = memento->order_;
if (order.size() != aliases_.size()) {
@@ -814,30 +818,35 @@ void Task::set_memento( const OrderMemento* memento,std::vector<ecf::Aspect::Typ
return;
}
- aspects.push_back(ecf::Aspect::ORDER);
aliases_ = vec;
}
-void Task::set_memento( const AliasChildrenMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Task::set_memento( const AliasChildrenMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only) {
#ifdef DEBUG_MEMENTO
std::cout << "Task::set_memento( const AliasChildrenMemento* ) " << debugNodePath() << "\n";
#endif
- aspects.push_back(ecf::Aspect::ADD_REMOVE_NODE);
- aliases_ = memento->children_;
+ if (aspect_only) {
+ aspects.push_back(ecf::Aspect::ADD_REMOVE_NODE);
+ return;
+ }
// set up alias parent pointers. since they are *NOT* serialised.
+ aliases_ = memento->children_;
size_t vec_size = aliases_.size();
for(size_t i = 0; i < vec_size; i++) {
aliases_[i]->set_parent(this);
}
}
-void Task::set_memento( const AliasNumberMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+void Task::set_memento( const AliasNumberMemento* memento,std::vector<ecf::Aspect::Type>& aspects,bool aspect_only) {
#ifdef DEBUG_MEMENTO
std::cout << "Task::set_memento( const AliasNumberMemento* ) " << debugNodePath() << "\n";
#endif
+ if (aspect_only) {
+ aspects.push_back(ecf::Aspect::ALIAS_NUMBER);
+ return;
+ }
- aspects.push_back(ecf::Aspect::ALIAS_NUMBER);
alias_no_ = memento->alias_no_;
}
diff --git a/ANode/src/Task.hpp b/ANode/src/Task.hpp
index 12adcad..c730621 100644
--- a/ANode/src/Task.hpp
+++ b/ANode/src/Task.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #108 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -111,10 +111,10 @@ public:
virtual bool checkInvariants(std::string& errorMsg) const;
virtual void collateChanges(DefsDelta&) const;
- void set_memento(const OrderMemento* m,std::vector<ecf::Aspect::Type>& aspects);
- void set_memento(const AliasChildrenMemento* m,std::vector<ecf::Aspect::Type>& aspects);
- void set_memento(const AliasNumberMemento* m,std::vector<ecf::Aspect::Type>& aspects);
- void set_memento(const SubmittableMemento* m,std::vector<ecf::Aspect::Type>& aspects) { Submittable::set_memento(m,aspects); }
+ void set_memento(const OrderMemento* m,std::vector<ecf::Aspect::Type>& aspects,bool);
+ void set_memento(const AliasChildrenMemento* m,std::vector<ecf::Aspect::Type>& aspects,bool);
+ void set_memento(const AliasNumberMemento* m,std::vector<ecf::Aspect::Type>& aspects,bool);
+ void set_memento(const SubmittableMemento* m,std::vector<ecf::Aspect::Type>& aspects,bool f) { Submittable::set_memento(m,aspects,f); }
virtual void read_state(const std::string& line,const std::vector<std::string>& lineTokens);
private:
diff --git a/ANode/src/TaskScriptGenerator.cpp b/ANode/src/TaskScriptGenerator.cpp
index e55b04b..ea7038c 100644
--- a/ANode/src/TaskScriptGenerator.cpp
+++ b/ANode/src/TaskScriptGenerator.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/TaskScriptGenerator.hpp b/ANode/src/TaskScriptGenerator.hpp
index abc57dc..8ce4a5e 100644
--- a/ANode/src/TaskScriptGenerator.hpp
+++ b/ANode/src/TaskScriptGenerator.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/src/TimeDepAttrs.cpp b/ANode/src/TimeDepAttrs.cpp
index 96b9a06..894f800 100644
--- a/ANode/src/TimeDepAttrs.cpp
+++ b/ANode/src/TimeDepAttrs.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #281 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -556,20 +556,21 @@ bool TimeDepAttrs::operator==(const TimeDepAttrs& rhs) const
//#define DEBUG_WHY 1
-void TimeDepAttrs::why(std::vector<std::string>& vec,const std::string& prefix) const
+bool TimeDepAttrs::why(std::vector<std::string>& vec,const std::string& prefix) const
{
#ifdef DEBUG_WHY
std::cout << " TimeDepAttrs::why " << node_->debugNodePath() << " checking time dependencies\n";
#endif
// postfix = <attr-type dependent> <next run time > < optional current state>
+ bool why_found = false;
std::string postFix;
const Calendar& c = node_->suite()->calendar();
- for(size_t i = 0; i < days_.size(); i++) { postFix.clear(); if (days_[i].why(c,postFix)) { vec.push_back(prefix + postFix); }}
- for(size_t i = 0; i < dates_.size(); i++) { postFix.clear(); if (dates_[i].why(c,postFix)) { vec.push_back(prefix + postFix); }}
- for(size_t i = 0; i < todayVec_.size(); i++){ postFix.clear(); if (todayVec_[i].why(c,postFix)){ vec.push_back(prefix + postFix); }}
- for(size_t i = 0; i < timeVec_.size(); i++) { postFix.clear(); if (timeVec_[i].why(c,postFix)) { vec.push_back(prefix + postFix); }}
- for(size_t i = 0; i < crons_.size(); i++) { postFix.clear(); if (crons_[i].why(c,postFix)) { vec.push_back(prefix + postFix); }}
-
+ for(size_t i = 0; i < days_.size(); i++) { postFix.clear(); if (days_[i].why(c,postFix)) { vec.push_back(prefix + postFix); why_found=true;}}
+ for(size_t i = 0; i < dates_.size(); i++) { postFix.clear(); if (dates_[i].why(c,postFix)) { vec.push_back(prefix + postFix); why_found=true;}}
+ for(size_t i = 0; i < todayVec_.size(); i++){ postFix.clear(); if (todayVec_[i].why(c,postFix)){ vec.push_back(prefix + postFix); why_found=true;}}
+ for(size_t i = 0; i < timeVec_.size(); i++) { postFix.clear(); if (timeVec_[i].why(c,postFix)) { vec.push_back(prefix + postFix); why_found=true;}}
+ for(size_t i = 0; i < crons_.size(); i++) { postFix.clear(); if (crons_[i].why(c,postFix)) { vec.push_back(prefix + postFix); why_found=true;}}
+ return why_found;
}
bool TimeDepAttrs::checkInvariants(std::string& errorMsg) const
@@ -792,8 +793,7 @@ void TimeDepAttrs::delete_cron(const ecf::CronAttr& attr)
// =================================================================================
-
-bool TimeDepAttrs::set_memento( const NodeTodayMemento* memento ,std::vector<ecf::Aspect::Type>& aspects) {
+bool TimeDepAttrs::set_memento( const NodeTodayMemento* memento) {
#ifdef DEBUG_MEMENTO
std::cout << "TimeDepAttrs::set_memento(const NodeTodayMemento* memento) " << node_->debugNodePath() << "\n";
@@ -810,7 +810,7 @@ bool TimeDepAttrs::set_memento( const NodeTodayMemento* memento ,std::vector<ecf
return false;
}
-bool TimeDepAttrs::set_memento( const NodeTimeMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+bool TimeDepAttrs::set_memento( const NodeTimeMemento* memento) {
#ifdef DEBUG_MEMENTO
std::cout << "TimeDepAttrs::set_memento(const NodeTimeMemento* memento) " << node_->debugNodePath() << "\n";
@@ -827,7 +827,7 @@ bool TimeDepAttrs::set_memento( const NodeTimeMemento* memento,std::vector<ecf::
return false;
}
-bool TimeDepAttrs::set_memento( const NodeCronMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+bool TimeDepAttrs::set_memento( const NodeCronMemento* memento) {
#ifdef DEBUG_MEMENTO
std::cout << "TimeDepAttrs::set_memento(const NodeCronMemento* memento) " << node_->debugNodePath() << "\n";
@@ -844,7 +844,7 @@ bool TimeDepAttrs::set_memento( const NodeCronMemento* memento,std::vector<ecf::
return false;
}
-bool TimeDepAttrs::set_memento( const NodeDayMemento* memento ,std::vector<ecf::Aspect::Type>& aspects) {
+bool TimeDepAttrs::set_memento( const NodeDayMemento* memento) {
#ifdef DEBUG_MEMENTO
std::cout << "TimeDepAttrs::set_memento(const NodeDayMemento* memento) " << node_->debugNodePath() << "\n";
@@ -862,7 +862,7 @@ bool TimeDepAttrs::set_memento( const NodeDayMemento* memento ,std::vector<ecf::
return false;
}
-bool TimeDepAttrs::set_memento( const NodeDateMemento* memento,std::vector<ecf::Aspect::Type>& aspects ) {
+bool TimeDepAttrs::set_memento( const NodeDateMemento* memento) {
#ifdef DEBUG_MEMENTO
std::cout << "TimeDepAttrs::set_memento(const NodeDateMemento* memento) " << node_->debugNodePath() << "\n";
diff --git a/ANode/src/TimeDepAttrs.hpp b/ANode/src/TimeDepAttrs.hpp
index 5e24d65..905c5ab 100644
--- a/ANode/src/TimeDepAttrs.hpp
+++ b/ANode/src/TimeDepAttrs.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #231 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -94,13 +94,13 @@ public:
// mementos functions:
/// Collect all the state changes, so that only small subset is returned to client
- bool set_memento(const NodeTodayMemento* ,std::vector<ecf::Aspect::Type>& aspects);
- bool set_memento(const NodeTimeMemento* ,std::vector<ecf::Aspect::Type>& aspects);
- bool set_memento(const NodeDayMemento* ,std::vector<ecf::Aspect::Type>& aspects);
- bool set_memento(const NodeCronMemento* ,std::vector<ecf::Aspect::Type>& aspects);
- bool set_memento(const NodeDateMemento* ,std::vector<ecf::Aspect::Type>& aspects);
+ bool set_memento(const NodeTodayMemento*);
+ bool set_memento(const NodeTimeMemento*);
+ bool set_memento(const NodeDayMemento*);
+ bool set_memento(const NodeCronMemento*);
+ bool set_memento(const NodeDateMemento*);
- void why(std::vector<std::string>& theReasonWhy,const std::string& prefix) const;
+ bool why(std::vector<std::string>& theReasonWhy,const std::string& prefix) const; // return true if why found
bool testTimeDependenciesForRequeue() const;
void resetRelativeDuration();
diff --git a/ANode/test/MyDefsFixture.hpp b/ANode/test/MyDefsFixture.hpp
index a41c089..a9f5d72 100644
--- a/ANode/test/MyDefsFixture.hpp
+++ b/ANode/test/MyDefsFixture.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestAdd.cpp b/ANode/test/TestAdd.cpp
index 50c4d64..0fc8af2 100644
--- a/ANode/test/TestAdd.cpp
+++ b/ANode/test/TestAdd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestAlias.cpp b/ANode/test/TestAlias.cpp
index 5a89723..ecabed6 100644
--- a/ANode/test/TestAlias.cpp
+++ b/ANode/test/TestAlias.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestAssignmentOperator.cpp b/ANode/test/TestAssignmentOperator.cpp
index b9f5969..74f8c1b 100644
--- a/ANode/test/TestAssignmentOperator.cpp
+++ b/ANode/test/TestAssignmentOperator.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -22,9 +22,9 @@ using namespace ecf;
BOOST_AUTO_TEST_SUITE( NodeTestSuite )
-BOOST_AUTO_TEST_CASE( test_assignment_operator )
+BOOST_AUTO_TEST_CASE( test_defs_assignment_operator )
{
- cout << "ANode:: ...test_assignment_operator\n";
+ cout << "ANode:: ...test_defs_assignment_operator\n";
MyDefsFixture theDefsFixture;
Ecf::set_debug_equality(true);
@@ -45,4 +45,142 @@ BOOST_AUTO_TEST_CASE( test_assignment_operator )
Ecf::set_debug_equality(false);
}
+BOOST_AUTO_TEST_CASE( test_suite_assignment_operator )
+{
+ cout << "ANode:: ...test_suite_assignment_operator\n";
+ Suite empty("empty");
+
+ Suite s1("s1");
+ ClockAttr clockAttr(false);
+ clockAttr.date(1,1,2009);
+ clockAttr.set_gain_in_seconds(3600);
+ clockAttr.startStopWithServer(true);
+ s1.addClock( clockAttr );
+ s1.addAutoCancel( ecf::AutoCancelAttr(2) );
+ s1.addVariable( Variable("VAR","value") );
+ s1.add_task( "t1" );
+ s1.add_family( "f1" );
+ std::vector<ecf::Child::CmdType> child_cmds;
+ child_cmds.push_back(ecf::Child::INIT);
+ child_cmds.push_back(ecf::Child::EVENT);
+ child_cmds.push_back(ecf::Child::METER);
+ child_cmds.push_back(ecf::Child::LABEL);
+ child_cmds.push_back(ecf::Child::WAIT);
+ child_cmds.push_back(ecf::Child::ABORT);
+ child_cmds.push_back(ecf::Child::COMPLETE);
+ s1.addZombie( ZombieAttr(ecf::Child::USER, child_cmds, ecf::User::FOB,10) );
+ s1.addZombie( ZombieAttr(ecf::Child::ECF, child_cmds, ecf::User::FAIL,100) );
+ s1.addZombie( ZombieAttr(ecf::Child::PATH, child_cmds, ecf::User::BLOCK,100) );
+
+ ecf::CronAttr cronAttr;
+ ecf::TimeSlot start( 0, 0 );
+ ecf::TimeSlot finish( 10, 0 );
+ ecf::TimeSlot incr( 0, 5 );
+ std::vector<int> weekdays; for(int i=0;i<7;++i) weekdays.push_back(i);
+ std::vector<int> daysOfMonth;for(int i=1;i<32;++i) daysOfMonth.push_back(i);
+ std::vector<int> months; for(int i=1;i<13;++i) months.push_back(i);
+ cronAttr.addTimeSeries(start,finish,incr);
+ cronAttr.addWeekDays( weekdays );
+ cronAttr.addDaysOfMonth(daysOfMonth);
+ cronAttr.addMonths( months );
+ s1.addCron( cronAttr );
+
+ ecf::LateAttr lateAttr;
+ lateAttr.addSubmitted( ecf::TimeSlot(3,12) );
+ lateAttr.addActive( ecf::TimeSlot(3,12) );
+ lateAttr.addComplete( ecf::TimeSlot(4,12), true);
+
+ std::string suiteLimit = "suiteLimit";
+ s1.addLimit( Limit(suiteLimit,10) );
+
+ Ecf::set_debug_equality(true);
+ Suite s2(s1); // s2 is copy
+ BOOST_CHECK_MESSAGE( s1 == s2,"copy constructor failed");
+
+ Suite s3("s3");
+ s3 = empty;
+ BOOST_CHECK_MESSAGE( s3 == empty,"assignment failed");
+
+ s3 = s1;
+ BOOST_CHECK_MESSAGE( s3 == s1,"assignment failed");
+
+ s1 = s2;
+ BOOST_CHECK_MESSAGE( s1 == s2,"assignment failed");
+
+ Ecf::set_debug_equality(false);
+}
+
+BOOST_AUTO_TEST_CASE( test_task_assignment_operator )
+{
+ cout << "ANode:: ...test_task_assignment_operator\n";
+ Task empty("empty");
+
+ Task s1("s1");
+ s1.addAutoCancel( ecf::AutoCancelAttr(2) );
+ s1.addVariable( Variable("VAR","value") );
+ std::vector<ecf::Child::CmdType> child_cmds;
+ child_cmds.push_back(ecf::Child::INIT);
+ child_cmds.push_back(ecf::Child::EVENT);
+ child_cmds.push_back(ecf::Child::METER);
+ child_cmds.push_back(ecf::Child::LABEL);
+ child_cmds.push_back(ecf::Child::WAIT);
+ child_cmds.push_back(ecf::Child::ABORT);
+ child_cmds.push_back(ecf::Child::COMPLETE);
+ s1.addZombie( ZombieAttr(ecf::Child::USER, child_cmds, ecf::User::FOB,10) );
+ s1.addZombie( ZombieAttr(ecf::Child::ECF, child_cmds, ecf::User::FAIL,100) );
+ s1.addZombie( ZombieAttr(ecf::Child::PATH, child_cmds, ecf::User::BLOCK,100) );
+
+ ecf::CronAttr cronAttr;
+ ecf::TimeSlot start( 0, 0 );
+ ecf::TimeSlot finish( 10, 0 );
+ ecf::TimeSlot incr( 0, 5 );
+ std::vector<int> weekdays; for(int i=0;i<7;++i) weekdays.push_back(i);
+ std::vector<int> daysOfMonth;for(int i=1;i<32;++i) daysOfMonth.push_back(i);
+ std::vector<int> months; for(int i=1;i<13;++i) months.push_back(i);
+ cronAttr.addTimeSeries(start,finish,incr);
+ cronAttr.addWeekDays( weekdays );
+ cronAttr.addDaysOfMonth(daysOfMonth);
+ cronAttr.addMonths( months );
+ s1.addCron( cronAttr );
+
+ ecf::LateAttr lateAttr;
+ lateAttr.addSubmitted( ecf::TimeSlot(3,12) );
+ lateAttr.addActive( ecf::TimeSlot(3,12) );
+ lateAttr.addComplete( ecf::TimeSlot(4,12), true);
+
+ std::string suiteLimit = "suiteLimit";
+ s1.addLimit( Limit(suiteLimit,10) );
+
+ s1.addDate( DateAttr(1,2,2009) );
+ s1.addDay( DayAttr(DayAttr::MONDAY) );
+ s1.addVariable( Variable("VAR1","\"value\"") );
+ s1.addEvent( Event(1) );
+ s1.addEvent( Event(2, "eventname" ) );
+ s1.addMeter( Meter("myMeter",0,100,100) );
+ s1.addLabel( Label("label","\"labelValue\"") );
+ s1.addTime( ecf::TimeAttr(ecf::TimeSlot(10,10),true) );
+ s1.addToday( ecf::TodayAttr(ecf::TimeSlot(10,12)) );
+ s1.addToday( ecf::TodayAttr(ecf::TimeSlot(0,1),ecf::TimeSlot(0,3),ecf::TimeSlot(0,1),true) );
+ s1.addDefStatus( DState::COMPLETE );
+ s1.addInLimit( InLimit(suiteLimit,"/name" ));
+ s1.addVerify( VerifyAttr(NState::COMPLETE,3) );
+ s1.addLate( lateAttr );
+
+ Ecf::set_debug_equality(true);
+ Task s2(s1); // s2 is copy
+ BOOST_CHECK_MESSAGE( s1 == s2,"copy constructor failed");
+
+ Task s3("s3");
+ s3 = empty;
+ BOOST_CHECK_MESSAGE( s3 == empty,"assignment failed");
+
+ s3 = s1;
+ BOOST_CHECK_MESSAGE( s3 == s1,"assignment failed");
+
+ s1 = s2;
+ BOOST_CHECK_MESSAGE( s1 == s2,"assignment failed");
+
+ Ecf::set_debug_equality(false);
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/ANode/test/TestChangeMgrSingleton.cpp b/ANode/test/TestChangeMgrSingleton.cpp
index bcafc2c..1a67fed 100644
--- a/ANode/test/TestChangeMgrSingleton.cpp
+++ b/ANode/test/TestChangeMgrSingleton.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -34,6 +34,9 @@ public:
if (node_) node_->detach(this);
}
+ virtual void update_start(const Node*, const std::vector<ecf::Aspect::Type>&) {}
+ virtual void update_start(const Defs*, const std::vector<ecf::Aspect::Type>&) {}
+
virtual void update(const Node*, const std::vector<ecf::Aspect::Type>&){update_count_++;}
virtual void update(const Defs*, const std::vector<ecf::Aspect::Type>&){update_count_++;}
diff --git a/ANode/test/TestCopyConstructor.cpp b/ANode/test/TestCopyConstructor.cpp
index b9310ac..b521a6a 100644
--- a/ANode/test/TestCopyConstructor.cpp
+++ b/ANode/test/TestCopyConstructor.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestDefStatus.cpp b/ANode/test/TestDefStatus.cpp
index 91915a6..4399c0f 100644
--- a/ANode/test/TestDefStatus.cpp
+++ b/ANode/test/TestDefStatus.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestDefs.cpp b/ANode/test/TestDefs.cpp
index fc99ede..bd08239 100644
--- a/ANode/test/TestDefs.cpp
+++ b/ANode/test/TestDefs.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestEcfFile.cpp b/ANode/test/TestEcfFile.cpp
index ac1b4d2..d2577ed 100644
--- a/ANode/test/TestEcfFile.cpp
+++ b/ANode/test/TestEcfFile.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -134,7 +134,7 @@ BOOST_AUTO_TEST_CASE( test_ecf_simple_include_file )
// Open the job file/
std::string job_file_contents;
- BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location);
+ BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location << " (" << strerror(errno) << ")");
std::string expected_job_file_contents = "#head.h\n#body\n#tail.h";
BOOST_CHECK_MESSAGE(job_file_contents == expected_job_file_contents ,"Expected\n" <<expected_job_file_contents << "' but found \n" << job_file_contents << "'");
@@ -202,7 +202,7 @@ BOOST_AUTO_TEST_CASE( test_ECFLOW_495 )
// Open the job file and check job file contents match what we expected
std::string job_file_contents;
- BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location);
+ BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location<< " (" << strerror(errno) << ")");
std::string expected_job_file_contents = "#a.h\n#b.h\nparallel --gnu --verbose -j $PAR_THR ${run:-0} ::: $(seq 0 50)";
BOOST_CHECK_MESSAGE(job_file_contents == expected_job_file_contents ,"Expected\n'" << expected_job_file_contents << "' but found \n'" << job_file_contents << "'");
@@ -284,7 +284,7 @@ BOOST_AUTO_TEST_CASE( test_ECF_SCRIPT_CMD_ECFLOW_427 )
// Open the job file and check contents
std::string job_file_contents;
- BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location);
+ BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location<< " (" << strerror(errno) << ")");
std::string expected_job_file_contents = "#head.h\n#body\n#tail.h";
BOOST_CHECK_MESSAGE(job_file_contents == expected_job_file_contents ,"Expected\n'" <<expected_job_file_contents << "' but found:\n'" << job_file_contents << "'");
}
@@ -386,7 +386,7 @@ BOOST_AUTO_TEST_CASE( test_ecf_include_file )
// Open the job file/
std::string job_file_contents;
- BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location);
+ BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location<< " (" << strerror(errno) << ")");
/// Remove all the generated files
boost::filesystem::remove_all( ecf_home + suite->absNodePath() );
@@ -462,7 +462,7 @@ BOOST_AUTO_TEST_CASE( test_ecf_include_multi_paths_ECFLOW_261 )
// Open the job file
std::string job_file_contents;
- BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location);
+ BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location<< " (" << strerror(errno) << ")");
/// Remove all the generated files
boost::filesystem::remove_all( ecf_home + suite->absNodePath() );
@@ -548,7 +548,7 @@ BOOST_AUTO_TEST_CASE( test_ecf_include_ECFLOW_274 )
// Open the job file
std::string job_file_contents;
- BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location);
+ BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location<< " (" << strerror(errno) << ")");
/// Remove all the generated files. This occasionally fails on ecgb/lxg ???
try { boost::filesystem::remove_all( ecf_home + suite->absNodePath() ); }
@@ -914,7 +914,7 @@ BOOST_AUTO_TEST_CASE( test_ecf_file )
// Open the job file/
std::string job_file_contents;
- BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location);
+ BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location<< " (" << strerror(errno) << ")");
// Test the contents of the job file.
// cout << "\n" << job_file_contents << "\n";
@@ -1004,7 +1004,7 @@ BOOST_AUTO_TEST_CASE( test_ecf_file_includenoop )
// Open the job file and check the contents
BOOST_CHECK_MESSAGE(fs::exists(job_file_location), "Expected job File " << job_file_location << " to exist");
std::string job_file_contents;
- BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location);
+ BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location<< " (" << strerror(errno) << ")");
// Test the contents of the job file. We expect includenopp to be expanded
// The contents should be left as is: i.e no pre_processing,hence expect to find %manual %comment, %VARIABLES%
@@ -1094,7 +1094,7 @@ BOOST_AUTO_TEST_CASE( test_ecf_file_override_ECF_JOB )
// Open the job file and check the contents
BOOST_CHECK_MESSAGE(fs::exists(job_file_location), "Expected job File " << job_file_location << " to exist");
std::string job_file_contents;
- BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location);
+ BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location<< " (" << strerror(errno) << ")");
BOOST_CHECK_MESSAGE( !job_file_contents.empty(),"Job should not be empty");
// Remove all the generated files
@@ -1305,7 +1305,7 @@ static void basic_test_template(
// Open the job file, make sure it matches our expected file
std::string job_file_contents;
- BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location);
+ BOOST_CHECK_MESSAGE(File::open(job_file_location,job_file_contents),"Could not open job file " << job_file_location<< " (" << strerror(errno) << ")");
BOOST_CHECK_MESSAGE(job_file_contents == expected_job_file_contents ,"Expected\n" <<expected_job_file_contents << "' but found \n" << job_file_contents << "'");
}
else {
@@ -1327,7 +1327,7 @@ BOOST_AUTO_TEST_CASE( test_includeonce )
ecf_file += "%includeonce <simple_tail.h>\n";
ecf_file += "%include <simple_tail.h>\n";
- std::string expected_job_file_contents = "#head.h\n#body\n#tail.h";
+ std::string expected_job_file_contents = "#head.h\n#head.h\n#body\n#tail.h\n#tail.h";
basic_test_template("test_includeonce",ecf_file,expected_job_file_contents);
}
diff --git a/ANode/test/TestEcfFileLocator.cpp b/ANode/test/TestEcfFileLocator.cpp
index e079021..849ecd1 100644
--- a/ANode/test/TestEcfFileLocator.cpp
+++ b/ANode/test/TestEcfFileLocator.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestEnviromentSubstitution.cpp b/ANode/test/TestEnviromentSubstitution.cpp
index cb6aecc..056093b 100644
--- a/ANode/test/TestEnviromentSubstitution.cpp
+++ b/ANode/test/TestEnviromentSubstitution.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestExprParser.cpp b/ANode/test/TestExprParser.cpp
index f93b781..55f082d 100644
--- a/ANode/test/TestExprParser.cpp
+++ b/ANode/test/TestExprParser.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -26,6 +26,9 @@
#include "ExprParser.hpp"
#include "ExprAst.hpp"
#include "Expression.hpp"
+#include "Defs.hpp"
+#include "Suite.hpp"
+#include "Task.hpp"
using namespace std;
using namespace boost::gregorian;
@@ -52,6 +55,7 @@ BOOST_AUTO_TEST_CASE( test_expression_parser_basic )
vec.push_back("a:value > 10");
vec.push_back("a:value < 10");
vec.push_back("1 == 1");
+ vec.push_back("1 == 0");
vec.push_back("a:event_name == set");
vec.push_back("a:event_name != set");
vec.push_back("a:event_name == clear");
@@ -85,11 +89,19 @@ BOOST_AUTO_TEST_CASE( test_expression_parser_basic )
std::auto_ptr<AstTop> ast = part.parseExpressions( parseErrorMsg );
BOOST_REQUIRE_MESSAGE(ast.get(),"Failed to parse\n" << vec[i] << " " << parseErrorMsg);
-
std::stringstream s2;
ast->print_flat(s2);
std::string ast_expr = s2.str();
BOOST_CHECK_MESSAGE(vec[i]==ast_expr," Failed\n'" << vec[i] << "' != '" << ast_expr << "'" );
+
+ std::string why; ast->why(why);
+ //cout << "why: " << vec[i] << " -> " << why << "\n";
+ if (ast->evaluate()) {
+ BOOST_CHECK_MESSAGE(why.empty(),"Expected why to be empty when expression evaluates: " << vec[i]);
+ }
+ else {
+ BOOST_CHECK_MESSAGE(!why.empty(),"When ast does not evaluate we expect to find why: " << vec[i]);
+ }
}
}
@@ -124,6 +136,15 @@ BOOST_AUTO_TEST_CASE( test_expression_parser_basic_with_brackets )
ast->print_flat(s2,true/*add_brackets*/);
std::string ast_expr = s2.str();
BOOST_CHECK_MESSAGE(vec[i]==ast_expr," Failed '" << vec[i] << "' != '" << ast_expr << "'" );
+
+ std::string why; ast->why(why);
+ //cout << "why: " << vec[i] << " -> " << why << "\n";
+ if (ast->evaluate()) {
+ BOOST_CHECK_MESSAGE(why.empty(),"Expected why to be empty when expression evaluates: " << vec[i]);
+ }
+ else {
+ BOOST_CHECK_MESSAGE(!why.empty(),"When ast does not evaluate we expect to find why: " << vec[i]);
+ }
}
}
@@ -319,6 +340,18 @@ BOOST_AUTO_TEST_CASE( test_parser_good_expressions )
exprMap["comp == complete and notready == complete"] = std::make_pair(AstAnd::stype(),false);
+ exprMap["/s/f/t<flag>late"] = std::make_pair(AstFlag::stype(),false);
+ exprMap["./s<flag>late"] = std::make_pair(AstFlag::stype(),false);
+ exprMap["../s/f/t<flag>late"] = std::make_pair(AstFlag::stype(),false);
+ exprMap["/s/f/t<flag>late == 0"] = std::make_pair(AstEqual::stype(),true);
+ exprMap["0 == /s/f/t<flag>late"] = std::make_pair(AstEqual::stype(),true);
+ exprMap["/s/f/t<flag>late and /s/f/t<flag>late"] = std::make_pair(AstAnd::stype(),false);
+ exprMap["! /s/f/t<flag>late and ! /s/f/t<flag>late"] = std::make_pair(AstAnd::stype(),true);
+ exprMap["! /s/f/t<flag>late"] = std::make_pair(AstNot::stype(),true);
+ exprMap["/s/f/t<flag>late + 2 >= 2"] = std::make_pair(AstGreaterEqual::stype(),true);
+ exprMap["(/s/f/t<flag>late or 1)"] = std::make_pair(AstOr::stype(),true);
+ exprMap["/<flag>late"] = std::make_pair(AstFlag::stype(),false);
+
int parse_failure = 0;
int ast_failure = 0;
std::pair<string, std::pair<string,bool> > p;
@@ -340,13 +373,23 @@ BOOST_AUTO_TEST_CASE( test_parser_good_expressions )
BOOST_CHECK_MESSAGE( top ,"No abstract syntax tree "+ p.first);
if (top) {
BOOST_CHECK_MESSAGE( top->left() ,"No root created "+ p.first);
- BOOST_CHECK_MESSAGE( top->left()->isRoot() || top->left()->is_variable() ,"First child of top should be a root or variable " + p.first);
+ BOOST_CHECK_MESSAGE( top->left()->isRoot() || top->left()->is_attribute() ,"First child of top should be a root or attribute " + p.first);
BOOST_CHECK_MESSAGE( top->left()->is_evaluateable(),"expected ast to be evaluatable. found: " << top->left()->type() << " " << p.first);
BOOST_CHECK_MESSAGE( top->left()->type() == expectedRootType || top->left()->type() == "variable","expected root type '" << expectedRootType << "' or 'variable' but found '" << top->left()->type() << "' " << p.first);
BOOST_CHECK_MESSAGE( expectedEvaluationResult == top->evaluate(),"evaluation not as expected for:\n" << p.first << "\n" << *top);
std::string error_msg;
BOOST_CHECK_MESSAGE( top->check(error_msg),error_msg << ": Check failed for " << *top);
+
+
+ std::string why; top->why(why);
+ //cout << "why: " << p.first << " -> " << why << "\n";
+ if (top->evaluate()) {
+ BOOST_CHECK_MESSAGE(why.empty(),"Expected why to be empty when expression evaluates: " << p.first);
+ }
+ else {
+ BOOST_CHECK_MESSAGE(!why.empty(),"When ast does not evaluate we expect to find why: " << p.first);
+ }
}
}
}
@@ -393,19 +436,56 @@ BOOST_AUTO_TEST_CASE( test_trigger_functions )
BOOST_CHECK_MESSAGE( top ,"No abstract syntax tree "+ p.first);
if (top) {
BOOST_CHECK_MESSAGE( top->left() ,"No root created "+ p.first);
- BOOST_CHECK_MESSAGE( top->left()->isRoot() || top->left()->is_variable() ,"First child of top should be a root or variable " + p.first);
+ BOOST_CHECK_MESSAGE( top->left()->isRoot() || top->left()->is_attribute() ,"First child of top should be a root or attribute " + p.first);
BOOST_CHECK_MESSAGE( top->left()->is_evaluateable(),"expected ast to be evaluatable. found: " << top->left()->type() << " " << p.first);
BOOST_CHECK_MESSAGE( top->left()->type() == expectedRootType || top->left()->type() == "variable","expected root type '" << expectedRootType << "' or 'variable' but found '" << top->left()->type() << "' " << p.first);
BOOST_CHECK_MESSAGE( expectedEvaluationResult == top->evaluate(),"evaluation not as expected for:\n" << p.first << "\n" << *top);
std::string error_msg;
BOOST_CHECK_MESSAGE( top->check(error_msg),error_msg << ": Check failed for " << *top);
+
+
+ std::string why; top->why(why);
+ //cout << "why: " << p.first << " -> " << why << "\n";
+ if (top->evaluate()) {
+ BOOST_CHECK_MESSAGE(why.empty(),"Expected why to be empty when expression evaluates: " << p.first);
+ }
+ else {
+ BOOST_CHECK_MESSAGE(!why.empty(),"When ast does not evaluate we expect to find why: " << p.first);
+ }
}
}
}
BOOST_REQUIRE_MESSAGE( parse_failure == 0 && ast_failure == 0,"Found failures parse_failure:" << parse_failure << " ast failure:" << ast_failure);
}
+BOOST_AUTO_TEST_CASE( test_date_to_julian_with_repeat_YMD )
+{
+ std::cout << "ANode:: ...test_date_to_julian_with_repeat_YMD\n";
+
+ Defs theDefs;
+ suite_ptr suite = theDefs.add_suite("s1");
+ suite->addRepeat( RepeatDate("YMD",20170101,20180101,1));
+ task_ptr t1 = suite->add_task("t1");
+ t1->add_trigger("2457755 == cal::date_to_julian( /s1:YMD )");
+ theDefs.beginAll();
+
+ std::string err_msg,warn_msg;
+ theDefs.check(err_msg,warn_msg);
+ BOOST_REQUIRE_MESSAGE(err_msg.empty() && warn_msg.empty(),"Expected no errors but found " << err_msg << "\nexpected no warnings but found: " << warn_msg);
+
+ // make sure we can resolve /s1:YMD if this the case bottom_up_why should return vector of size 0
+ std::vector<std::string> theReasonWhy;
+ t1->bottom_up_why(theReasonWhy);
+ BOOST_CHECK_MESSAGE(theReasonWhy.empty() ,"When all is well expected empty reason vec");
+
+ // be more flexible, of vector is returned we should not get: variable-not-found
+ for(size_t i = 0; i < theReasonWhy.size(); i++) {
+ cout << theReasonWhy[i] << "\n";
+ BOOST_CHECK_MESSAGE(theReasonWhy[i].find("variable-not-found") == string::npos,"Variable YMD not found: " << theReasonWhy[i]);
+ }
+}
+
BOOST_AUTO_TEST_CASE( test_trigger_functions_with_boost_date )
{
std::cout << "ANode:: ...test_trigger_functions_with_boost_date\n";
@@ -414,8 +494,8 @@ BOOST_AUTO_TEST_CASE( test_trigger_functions_with_boost_date )
// value.second = result of expected evaluation
map<string,std::pair<string,bool> > exprMap;
- boost::gregorian::date startDate(2016,1,1);
- boost::gregorian::date endDate(2016,12,31);
+ boost::gregorian::date startDate(2017,1,1);
+ boost::gregorian::date endDate(2017,12,31);
while(startDate != endDate) {
long julian_day = startDate.julian_day();
std::string str_julian_day = boost::lexical_cast<std::string>(julian_day);
@@ -453,7 +533,7 @@ BOOST_AUTO_TEST_CASE( test_trigger_functions_with_boost_date )
BOOST_CHECK_MESSAGE( top ,"No abstract syntax tree "+ p.first);
if (top) {
BOOST_CHECK_MESSAGE( top->left() ,"No root created "+ p.first);
- BOOST_CHECK_MESSAGE( top->left()->isRoot() || top->left()->is_variable() ,"First child of top should be a root or variable " + p.first);
+ BOOST_CHECK_MESSAGE( top->left()->isRoot() || top->left()->is_attribute() ,"First child of top should be a root or attribute " + p.first);
BOOST_CHECK_MESSAGE( top->left()->is_evaluateable(),"expected ast to be evaluatable. found: " << top->left()->type() << " " << p.first);
BOOST_CHECK_MESSAGE( top->left()->type() == expectedRootType || top->left()->type() == "variable","expected root type '" << expectedRootType << "' or 'variable' but found '" << top->left()->type() << "' " << p.first);
BOOST_CHECK_MESSAGE( expectedEvaluationResult == top->evaluate(),"evaluation not as expected for:\n" << p.first << "\n" << *top);
@@ -559,6 +639,9 @@ BOOST_AUTO_TEST_CASE( test_parser_bad_expressions )
// triggers that dont make sense in the operational suites.
exprvec.push_back("../../../legA/fc/pf/01 eq complete eq complete");
+ exprvec.push_back("/mofc/mon/hind/14/back == complete or %s:DOW ne 5"); // ECFLOW-888
+
+
BOOST_FOREACH(const string& expr, exprvec ) {
//std::cout << "parsing expression " << expr << "\n";
diff --git a/ANode/test/TestExprRepeatDateArithmetic.cpp b/ANode/test/TestExprRepeatDateArithmetic.cpp
index fa8398c..d6c0599 100644
--- a/ANode/test/TestExprRepeatDateArithmetic.cpp
+++ b/ANode/test/TestExprRepeatDateArithmetic.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestFindAbsNodePath.cpp b/ANode/test/TestFindAbsNodePath.cpp
index ec974be..203b3eb 100644
--- a/ANode/test/TestFindAbsNodePath.cpp
+++ b/ANode/test/TestFindAbsNodePath.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestFlag.cpp b/ANode/test/TestFlag.cpp
index fa4cf0f..b0652a8 100644
--- a/ANode/test/TestFlag.cpp
+++ b/ANode/test/TestFlag.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestFlagMigrated.cpp b/ANode/test/TestFlagMigrated.cpp
index 9465e9a..46cd0c3 100644
--- a/ANode/test/TestFlagMigrated.cpp
+++ b/ANode/test/TestFlagMigrated.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestHistoryParser.cpp b/ANode/test/TestHistoryParser.cpp
index ced96f9..5f02cde 100644
--- a/ANode/test/TestHistoryParser.cpp
+++ b/ANode/test/TestHistoryParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #24 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestInLimit.cpp b/ANode/test/TestInLimit.cpp
index 3886116..2105e86 100644
--- a/ANode/test/TestInLimit.cpp
+++ b/ANode/test/TestInLimit.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #1 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestJobCreator.cpp b/ANode/test/TestJobCreator.cpp
index cd35c9f..cdd9ca8 100644
--- a/ANode/test/TestJobCreator.cpp
+++ b/ANode/test/TestJobCreator.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestJobProfiler.cpp b/ANode/test/TestJobProfiler.cpp
index f575984..ecc979a 100644
--- a/ANode/test/TestJobProfiler.cpp
+++ b/ANode/test/TestJobProfiler.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -72,7 +72,7 @@ BOOST_AUTO_TEST_CASE( test_job_profiler )
// Check the log file, has the profiling
std::string log_file_contents;
- BOOST_CHECK_MESSAGE(File::open(log_path,log_file_contents), "Could not open log file at " << log_path);
+ BOOST_CHECK_MESSAGE(File::open(log_path,log_file_contents), "Could not open log file at " << log_path<< " (" << strerror(errno) << ")");
BOOST_CHECK_MESSAGE(!log_file_contents.empty(),"log file is is empty ?");
BOOST_CHECK_MESSAGE(log_file_contents.find("Exceeds ECF_TASK_THRESHOLD") != std::string::npos, "Exceeds ECF_TASK_THRESHOLD not in profile");
diff --git a/ANode/test/TestLimit.cpp b/ANode/test/TestLimit.cpp
index 0a1b9f8..e4294c6 100644
--- a/ANode/test/TestLimit.cpp
+++ b/ANode/test/TestLimit.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #1 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -161,6 +161,25 @@ BOOST_AUTO_TEST_CASE( test_limit_decrement )
Ecf::set_modify_change_no(0);
}
+BOOST_AUTO_TEST_CASE( test_limit_set_value )
+{
+ cout << "ANode:: ...test_limit_set_value\n";
+
+ Limit limit("name",10); // Limit of 10
+ limit.increment(1,"path"); // consume 1 token
+ limit.increment(1,"path2"); // consume 1 token
+
+ BOOST_CHECK_MESSAGE(limit.value() == 2,"Expected increment to consume 2 token but it has consumed " << limit.value());
+ BOOST_CHECK_MESSAGE(limit.paths().size() == 2,"Expected 2 task paths but found " << limit.paths().size());
+
+ limit.setValue(4);
+ BOOST_CHECK_MESSAGE(limit.value() == 4,"Expected setValue(4) but value found is: " << limit.value());
+ BOOST_CHECK_MESSAGE(limit.paths().size() == 2,"Expected 2 task paths but found " << limit.paths().size());
+
+ limit.setValue(0);
+ BOOST_CHECK_MESSAGE(limit.value() == 0,"Expected setValue(0) but found " << limit.value());
+ BOOST_CHECK_MESSAGE(limit.paths().empty(),"Setting value to zero should clear the paths, but found " << limit.paths().size());
+}
// Globals used throughout the test
static std::string fileName = "testLimit.txt";
diff --git a/ANode/test/TestMigration.cpp b/ANode/test/TestMigration.cpp
index 1ff36f7..1c1e52e 100644
--- a/ANode/test/TestMigration.cpp
+++ b/ANode/test/TestMigration.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestMissNextTimeSlot.cpp b/ANode/test/TestMissNextTimeSlot.cpp
index 63c8876..dc92ff0 100644
--- a/ANode/test/TestMissNextTimeSlot.cpp
+++ b/ANode/test/TestMissNextTimeSlot.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #22 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestNodeBeginReque.cpp b/ANode/test/TestNodeBeginReque.cpp
index ffc5de4..74706bb 100644
--- a/ANode/test/TestNodeBeginReque.cpp
+++ b/ANode/test/TestNodeBeginReque.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #22 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestNodeState.cpp b/ANode/test/TestNodeState.cpp
index 5fc9fe2..1721053 100644
--- a/ANode/test/TestNodeState.cpp
+++ b/ANode/test/TestNodeState.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestOrder.cpp b/ANode/test/TestOrder.cpp
index 3820ce5..a7a82fb 100644
--- a/ANode/test/TestOrder.cpp
+++ b/ANode/test/TestOrder.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestPersistence.cpp b/ANode/test/TestPersistence.cpp
index 83ceb1e..4bc5e7f 100644
--- a/ANode/test/TestPersistence.cpp
+++ b/ANode/test/TestPersistence.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestPreProcessing.cpp b/ANode/test/TestPreProcessing.cpp
index d3dfc5b..c3a3c91 100644
--- a/ANode/test/TestPreProcessing.cpp
+++ b/ANode/test/TestPreProcessing.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestReplace.cpp b/ANode/test/TestReplace.cpp
index 08f890f..be4205a 100644
--- a/ANode/test/TestReplace.cpp
+++ b/ANode/test/TestReplace.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestSetState.cpp b/ANode/test/TestSetState.cpp
index d32bed1..7c117c3 100644
--- a/ANode/test/TestSetState.cpp
+++ b/ANode/test/TestSetState.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestSingleExprParse.cpp b/ANode/test/TestSingleExprParse.cpp
index 8bb3c89..7468386 100644
--- a/ANode/test/TestSingleExprParse.cpp
+++ b/ANode/test/TestSingleExprParse.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -44,8 +44,8 @@ BOOST_AUTO_TEST_CASE( test_single_expression )
// value.second = result of expected evaluation
map<string,std::pair<string,bool> > exprMap;
- exprMap["20160819 == cal::julian_to_date( 2457620 )"] = std::make_pair(AstEqual::stype(),true);
- exprMap["2457620 == cal::date_to_julian( 20160819 )"] = std::make_pair(AstEqual::stype(),true);
+ exprMap["/s/f/t<flag>late"] = std::make_pair(AstFlag::stype(),false);
+ exprMap["/s/f/t:late"] = std::make_pair(AstFlag::stype(),false);
std::pair<string, std::pair<string,bool> > p;
BOOST_FOREACH(p, exprMap ) {
@@ -63,11 +63,15 @@ BOOST_AUTO_TEST_CASE( test_single_expression )
Ast* top = theExprParser.getAst();
BOOST_REQUIRE_MESSAGE( top ,"No abstract syntax tree");
BOOST_REQUIRE_MESSAGE( top->left() ,"No root created");
- BOOST_REQUIRE_MESSAGE( top->left()->isRoot() || top->left()->is_variable() ,"First child of top should be a root or variable " + p.first);
+ BOOST_REQUIRE_MESSAGE( top->left()->isRoot() || top->left()->is_attribute() ,"First child of top should be a root or attribute " + p.first);
BOOST_REQUIRE_MESSAGE( top->left()->is_evaluateable(),"expected ast to be evaluatable. found: " << top->left()->type() << " " << p.first);
BOOST_REQUIRE_MESSAGE( top->left()->type() == expectedRootType || top->left()->type() == "variable","expected root type " << expectedRootType << " or 'variable' but found " << top->left()->type() << " " << p.first);
top->print_flat(ss);
BOOST_REQUIRE_MESSAGE( expectedEvaluationResult == top->evaluate(),"evaluation not as expected for:\n" << p.first << "\n" << ss.str() << "\n" << *top);
+
+ std::string why;
+ top->why(why);
+ cout << "why: " << why << "\n";
}
}
@@ -94,7 +98,7 @@ BOOST_AUTO_TEST_CASE( test_single_expression )
// Ast* top = theExprParser.getAst();
// BOOST_REQUIRE_MESSAGE( top ,"No abstract syntax tree " + line);
// BOOST_REQUIRE_MESSAGE( top->left() ,"No root created " + line);
-// BOOST_REQUIRE_MESSAGE( top->left()->isRoot() || top->left()->is_variable() ,"First child of top should be a root or variable " + line);
+// BOOST_REQUIRE_MESSAGE( top->left()->isRoot() || top->left()->is_attribute() ,"First child of top should be a root or variable " + line);
// //top->print_flat(ss);
// }
// }
diff --git a/ANode/test/TestTaskScriptGenerator.cpp b/ANode/test/TestTaskScriptGenerator.cpp
index 758342c..6aaf3f1 100644
--- a/ANode/test/TestTaskScriptGenerator.cpp
+++ b/ANode/test/TestTaskScriptGenerator.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestTimeDependencies.cpp b/ANode/test/TestTimeDependencies.cpp
index 955b1d9..22f57ca 100644
--- a/ANode/test/TestTimeDependencies.cpp
+++ b/ANode/test/TestTimeDependencies.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestVariableGeneration.cpp b/ANode/test/TestVariableGeneration.cpp
index a1d74c1..08f835f 100644
--- a/ANode/test/TestVariableGeneration.cpp
+++ b/ANode/test/TestVariableGeneration.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestVariableInheritance.cpp b/ANode/test/TestVariableInheritance.cpp
index d211a77..fa4cce7 100644
--- a/ANode/test/TestVariableInheritance.cpp
+++ b/ANode/test/TestVariableInheritance.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestVariableSubstitution.cpp b/ANode/test/TestVariableSubstitution.cpp
index 154ebe5..c9bc484 100644
--- a/ANode/test/TestVariableSubstitution.cpp
+++ b/ANode/test/TestVariableSubstitution.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestVariableSubstitutionDefs.cpp b/ANode/test/TestVariableSubstitutionDefs.cpp
index 4c5a982..bef8ecd 100644
--- a/ANode/test/TestVariableSubstitutionDefs.cpp
+++ b/ANode/test/TestVariableSubstitutionDefs.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/TestZombies.cpp b/ANode/test/TestZombies.cpp
index d5357a9..30befe4 100644
--- a/ANode/test/TestZombies.cpp
+++ b/ANode/test/TestZombies.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/Test_ECFLOW-195.cpp b/ANode/test/Test_ECFLOW-195.cpp
index 31674cf..1472f08 100644
--- a/ANode/test/Test_ECFLOW-195.cpp
+++ b/ANode/test/Test_ECFLOW-195.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/Test_ECFLOW-247.cpp b/ANode/test/Test_ECFLOW-247.cpp
index f366e31..dfa7847 100644
--- a/ANode/test/Test_ECFLOW-247.cpp
+++ b/ANode/test/Test_ECFLOW-247.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/Test_ECFLOW-417.cpp b/ANode/test/Test_ECFLOW-417.cpp
index eff4d75..364f2f4 100644
--- a/ANode/test/Test_ECFLOW-417.cpp
+++ b/ANode/test/Test_ECFLOW-417.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/data/SMSHOME/suite/family/head.h b/ANode/test/data/SMSHOME/suite/family/head.h
index d895ac7..0f6adfc 100644
--- a/ANode/test/data/SMSHOME/suite/family/head.h
+++ b/ANode/test/data/SMSHOME/suite/family/head.h
@@ -1,6 +1,6 @@
#!/bin/ksh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/data/SMSHOME/suite/family/tail.h b/ANode/test/data/SMSHOME/suite/family/tail.h
index 91682fb..1cd050a 100644
--- a/ANode/test/data/SMSHOME/suite/family/tail.h
+++ b/ANode/test/data/SMSHOME/suite/family/tail.h
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/data/SMSHOME2/bad/includes/recursive_head.h b/ANode/test/data/SMSHOME2/bad/includes/recursive_head.h
index 676b8c1..7c237f4 100644
--- a/ANode/test/data/SMSHOME2/bad/includes/recursive_head.h
+++ b/ANode/test/data/SMSHOME2/bad/includes/recursive_head.h
@@ -1,6 +1,6 @@
#!/bin/ksh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/data/SMSHOME2/good/includes/config.h b/ANode/test/data/SMSHOME2/good/includes/config.h
index d74ccd7..04157f6 100644
--- a/ANode/test/data/SMSHOME2/good/includes/config.h
+++ b/ANode/test/data/SMSHOME2/good/includes/config.h
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/data/SMSHOME2/good/includes/config.oc.h b/ANode/test/data/SMSHOME2/good/includes/config.oc.h
index c9c12ca..bd9ed81 100644
--- a/ANode/test/data/SMSHOME2/good/includes/config.oc.h
+++ b/ANode/test/data/SMSHOME2/good/includes/config.oc.h
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/data/SMSHOME2/good/includes/endt.h b/ANode/test/data/SMSHOME2/good/includes/endt.h
index bc9912f..d4da32c 100644
--- a/ANode/test/data/SMSHOME2/good/includes/endt.h
+++ b/ANode/test/data/SMSHOME2/good/includes/endt.h
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/data/SMSHOME2/good/includes/head.h b/ANode/test/data/SMSHOME2/good/includes/head.h
index a4fd5d9..76089bd 100644
--- a/ANode/test/data/SMSHOME2/good/includes/head.h
+++ b/ANode/test/data/SMSHOME2/good/includes/head.h
@@ -1,5 +1,5 @@
#!/bin/ksh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/data/SMSHOME2/good/includes/law.h b/ANode/test/data/SMSHOME2/good/includes/law.h
index a776ede..a8ad78f 100644
--- a/ANode/test/data/SMSHOME2/good/includes/law.h
+++ b/ANode/test/data/SMSHOME2/good/includes/law.h
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/data/SMSHOME2/good/includes/rcp.h b/ANode/test/data/SMSHOME2/good/includes/rcp.h
index 3d72f55..7e6744f 100644
--- a/ANode/test/data/SMSHOME2/good/includes/rcp.h
+++ b/ANode/test/data/SMSHOME2/good/includes/rcp.h
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/data/SMSHOME2/good/includes/recursive_include.h b/ANode/test/data/SMSHOME2/good/includes/recursive_include.h
index e6fbdf0..f098db2 100644
--- a/ANode/test/data/SMSHOME2/good/includes/recursive_include.h
+++ b/ANode/test/data/SMSHOME2/good/includes/recursive_include.h
@@ -1,2 +1,2 @@
# test includeonce with a recursive include
-%include <recursive_include.h>
+%includeonce <recursive_include.h>
diff --git a/ANode/test/data/SMSHOME2/good/includes/set_traps.h b/ANode/test/data/SMSHOME2/good/includes/set_traps.h
index 5dd0bca..a7c3fc5 100644
--- a/ANode/test/data/SMSHOME2/good/includes/set_traps.h
+++ b/ANode/test/data/SMSHOME2/good/includes/set_traps.h
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/data/SMSHOME2/good/includes/setup.h b/ANode/test/data/SMSHOME2/good/includes/setup.h
index abc1ec6..d3366d6 100644
--- a/ANode/test/data/SMSHOME2/good/includes/setup.h
+++ b/ANode/test/data/SMSHOME2/good/includes/setup.h
@@ -1,6 +1,6 @@
banner setup.h
#=======================================================================
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/data/SMSHOME2/good/includes/sms.h b/ANode/test/data/SMSHOME2/good/includes/sms.h
index a0d8cc0..c3e60fc 100644
--- a/ANode/test/data/SMSHOME2/good/includes/sms.h
+++ b/ANode/test/data/SMSHOME2/good/includes/sms.h
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/data/SMSHOME2/good/includes/tail.h b/ANode/test/data/SMSHOME2/good/includes/tail.h
index 91682fb..1cd050a 100644
--- a/ANode/test/data/SMSHOME2/good/includes/tail.h
+++ b/ANode/test/data/SMSHOME2/good/includes/tail.h
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/data/SMSHOME2/good/includes/trap.h b/ANode/test/data/SMSHOME2/good/includes/trap.h
index fa92e53..f932b4a 100644
--- a/ANode/test/data/SMSHOME2/good/includes/trap.h
+++ b/ANode/test/data/SMSHOME2/good/includes/trap.h
@@ -1,6 +1,6 @@
banner trap.h
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/data/includes/head.h b/ANode/test/data/includes/head.h
index ded6592..7c0d77b 100644
--- a/ANode/test/data/includes/head.h
+++ b/ANode/test/data/includes/head.h
@@ -1,6 +1,6 @@
#!/bin/ksh
# ================================== start of head.h ================================
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/ANode/test/data/includes/tail.h b/ANode/test/data/includes/tail.h
index 07fa1a7..640baf9 100644
--- a/ANode/test/data/includes/tail.h
+++ b/ANode/test/data/includes/tail.h
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/Jamfile.jam b/AParser/Jamfile.jam
index 2f53f03..f50e543 100644
--- a/AParser/Jamfile.jam
+++ b/AParser/Jamfile.jam
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/AutoCancelParser.cpp b/AParser/src/AutoCancelParser.cpp
index 33ba735..f49fd4c 100644
--- a/AParser/src/AutoCancelParser.cpp
+++ b/AParser/src/AutoCancelParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/AutoCancelParser.hpp b/AParser/src/AutoCancelParser.hpp
index f413acc..3fa693f 100644
--- a/AParser/src/AutoCancelParser.hpp
+++ b/AParser/src/AutoCancelParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/CalendarParser.cpp b/AParser/src/CalendarParser.cpp
index 98ec667..a17222f 100644
--- a/AParser/src/CalendarParser.cpp
+++ b/AParser/src/CalendarParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #21 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/CalendarParser.hpp b/AParser/src/CalendarParser.hpp
index 6f4d6ce..8362d70 100644
--- a/AParser/src/CalendarParser.hpp
+++ b/AParser/src/CalendarParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/ClockParser.cpp b/AParser/src/ClockParser.cpp
index edf2f2f..76e9ada 100644
--- a/AParser/src/ClockParser.cpp
+++ b/AParser/src/ClockParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #22 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/ClockParser.hpp b/AParser/src/ClockParser.hpp
index 38bbf90..337c140 100644
--- a/AParser/src/ClockParser.hpp
+++ b/AParser/src/ClockParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/CronParser.cpp b/AParser/src/CronParser.cpp
index 7aba877..7731965 100644
--- a/AParser/src/CronParser.cpp
+++ b/AParser/src/CronParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #13 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/CronParser.hpp b/AParser/src/CronParser.hpp
index 4eee2f2..104387c 100644
--- a/AParser/src/CronParser.hpp
+++ b/AParser/src/CronParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/DateParser.cpp b/AParser/src/DateParser.cpp
index 97fd9f4..fee7861 100644
--- a/AParser/src/DateParser.cpp
+++ b/AParser/src/DateParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/DateParser.hpp b/AParser/src/DateParser.hpp
index f039e6e..0c62297 100644
--- a/AParser/src/DateParser.hpp
+++ b/AParser/src/DateParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/DayParser.cpp b/AParser/src/DayParser.cpp
index 1f9cd53..4e1357b 100644
--- a/AParser/src/DayParser.cpp
+++ b/AParser/src/DayParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/DayParser.hpp b/AParser/src/DayParser.hpp
index 211183c..6b4d138 100644
--- a/AParser/src/DayParser.hpp
+++ b/AParser/src/DayParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/DefsParser.cpp b/AParser/src/DefsParser.cpp
index 169ed9b..ea7fb71 100644
--- a/AParser/src/DefsParser.cpp
+++ b/AParser/src/DefsParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #47 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/DefsParser.hpp b/AParser/src/DefsParser.hpp
index 42fcc96..3cc1a36 100644
--- a/AParser/src/DefsParser.hpp
+++ b/AParser/src/DefsParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/DefsStateParser.cpp b/AParser/src/DefsStateParser.cpp
index 80805a7..bb67e2d 100644
--- a/AParser/src/DefsStateParser.cpp
+++ b/AParser/src/DefsStateParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/DefsStateParser.hpp b/AParser/src/DefsStateParser.hpp
index 1cd73dd..3a46bb2 100644
--- a/AParser/src/DefsStateParser.hpp
+++ b/AParser/src/DefsStateParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/DefsStatusParser.cpp b/AParser/src/DefsStatusParser.cpp
index b823a2f..f493993 100644
--- a/AParser/src/DefsStatusParser.cpp
+++ b/AParser/src/DefsStatusParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/DefsStatusParser.hpp b/AParser/src/DefsStatusParser.hpp
index ca42fae..0b5cd43 100644
--- a/AParser/src/DefsStatusParser.hpp
+++ b/AParser/src/DefsStatusParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/DefsStructureParser.cpp b/AParser/src/DefsStructureParser.cpp
index bbef4cf..b47207e 100644
--- a/AParser/src/DefsStructureParser.cpp
+++ b/AParser/src/DefsStructureParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #26 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/DefsStructureParser.hpp b/AParser/src/DefsStructureParser.hpp
index 94944bf..9bcec45 100644
--- a/AParser/src/DefsStructureParser.hpp
+++ b/AParser/src/DefsStructureParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #12 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/EventParser.cpp b/AParser/src/EventParser.cpp
index f295e4a..32741e2 100644
--- a/AParser/src/EventParser.cpp
+++ b/AParser/src/EventParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #17 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/EventParser.hpp b/AParser/src/EventParser.hpp
index f4b568b..33418eb 100644
--- a/AParser/src/EventParser.hpp
+++ b/AParser/src/EventParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/ExternParser.cpp b/AParser/src/ExternParser.cpp
index f090deb..bb975ad 100644
--- a/AParser/src/ExternParser.cpp
+++ b/AParser/src/ExternParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/ExternParser.hpp b/AParser/src/ExternParser.hpp
index cfbe7a4..7a2977b 100644
--- a/AParser/src/ExternParser.hpp
+++ b/AParser/src/ExternParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/InlimitParser.cpp b/AParser/src/InlimitParser.cpp
index d1c725a..46e18b4 100644
--- a/AParser/src/InlimitParser.cpp
+++ b/AParser/src/InlimitParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/InlimitParser.hpp b/AParser/src/InlimitParser.hpp
index 204979e..41be041 100644
--- a/AParser/src/InlimitParser.hpp
+++ b/AParser/src/InlimitParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/LabelParser.cpp b/AParser/src/LabelParser.cpp
index 5b23074..d50d12e 100644
--- a/AParser/src/LabelParser.cpp
+++ b/AParser/src/LabelParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/LabelParser.hpp b/AParser/src/LabelParser.hpp
index cb308d6..566db70 100644
--- a/AParser/src/LabelParser.hpp
+++ b/AParser/src/LabelParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/LateParser.cpp b/AParser/src/LateParser.cpp
index 64d587b..b1b3ab1 100644
--- a/AParser/src/LateParser.cpp
+++ b/AParser/src/LateParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #13 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/LateParser.hpp b/AParser/src/LateParser.hpp
index 918a245..0785ff9 100644
--- a/AParser/src/LateParser.hpp
+++ b/AParser/src/LateParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/LimitParser.cpp b/AParser/src/LimitParser.cpp
index becd85c..3c9ebc1 100644
--- a/AParser/src/LimitParser.cpp
+++ b/AParser/src/LimitParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/LimitParser.hpp b/AParser/src/LimitParser.hpp
index 712fa82..cbd0aa9 100644
--- a/AParser/src/LimitParser.hpp
+++ b/AParser/src/LimitParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/MeterParser.cpp b/AParser/src/MeterParser.cpp
index c6bbafa..b17008b 100644
--- a/AParser/src/MeterParser.cpp
+++ b/AParser/src/MeterParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/MeterParser.hpp b/AParser/src/MeterParser.hpp
index 3b6f25d..a816371 100644
--- a/AParser/src/MeterParser.hpp
+++ b/AParser/src/MeterParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/Parser.cpp b/AParser/src/Parser.cpp
index 1c28685..4dca663 100644
--- a/AParser/src/Parser.cpp
+++ b/AParser/src/Parser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #34 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/Parser.hpp b/AParser/src/Parser.hpp
index 541a1a1..c9d1108 100644
--- a/AParser/src/Parser.hpp
+++ b/AParser/src/Parser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #23 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/RepeatParser.cpp b/AParser/src/RepeatParser.cpp
index cb8e519..e3a7399 100644
--- a/AParser/src/RepeatParser.cpp
+++ b/AParser/src/RepeatParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #31 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/RepeatParser.hpp b/AParser/src/RepeatParser.hpp
index 1451139..8479feb 100644
--- a/AParser/src/RepeatParser.hpp
+++ b/AParser/src/RepeatParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/TimeParser.cpp b/AParser/src/TimeParser.cpp
index 9f5a4c0..45ee8d5 100644
--- a/AParser/src/TimeParser.cpp
+++ b/AParser/src/TimeParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #17 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/TimeParser.hpp b/AParser/src/TimeParser.hpp
index 769e371..1c89bfc 100644
--- a/AParser/src/TimeParser.hpp
+++ b/AParser/src/TimeParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/TodayParser.cpp b/AParser/src/TodayParser.cpp
index 5e0af4a..b773679 100644
--- a/AParser/src/TodayParser.cpp
+++ b/AParser/src/TodayParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #13 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/TodayParser.hpp b/AParser/src/TodayParser.hpp
index 6f97171..aaa4494 100644
--- a/AParser/src/TodayParser.hpp
+++ b/AParser/src/TodayParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/TriggerParser.cpp b/AParser/src/TriggerParser.cpp
index d17c93f..5c16f4a 100644
--- a/AParser/src/TriggerParser.cpp
+++ b/AParser/src/TriggerParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #17 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/TriggerParser.hpp b/AParser/src/TriggerParser.hpp
index cddd911..3ebadca 100644
--- a/AParser/src/TriggerParser.hpp
+++ b/AParser/src/TriggerParser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/VariableParser.cpp b/AParser/src/VariableParser.cpp
index 912ddb1..31f6f24 100644
--- a/AParser/src/VariableParser.cpp
+++ b/AParser/src/VariableParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #23 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/VariableParser.hpp b/AParser/src/VariableParser.hpp
index d57f153..7dfa37d 100644
--- a/AParser/src/VariableParser.hpp
+++ b/AParser/src/VariableParser.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/VerifyParser.cpp b/AParser/src/VerifyParser.cpp
index 84dda56..e030a11 100644
--- a/AParser/src/VerifyParser.cpp
+++ b/AParser/src/VerifyParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/VerifyParser.hpp b/AParser/src/VerifyParser.hpp
index 127fae6..078add3 100644
--- a/AParser/src/VerifyParser.hpp
+++ b/AParser/src/VerifyParser.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/ZombieAttrParser.cpp b/AParser/src/ZombieAttrParser.cpp
index 901dc65..841bcb3 100644
--- a/AParser/src/ZombieAttrParser.cpp
+++ b/AParser/src/ZombieAttrParser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/src/ZombieAttrParser.hpp b/AParser/src/ZombieAttrParser.hpp
index ee40273..4a9c9d3 100644
--- a/AParser/src/ZombieAttrParser.hpp
+++ b/AParser/src/ZombieAttrParser.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/test/ParseOnly.cpp b/AParser/test/ParseOnly.cpp
index bdb1036..f669d16 100644
--- a/AParser/test/ParseOnly.cpp
+++ b/AParser/test/ParseOnly.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/test/ParseTimer.cpp b/AParser/test/ParseTimer.cpp
index dfabecc..915abed 100644
--- a/AParser/test/ParseTimer.cpp
+++ b/AParser/test/ParseTimer.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/test/PersistHelper.cpp b/AParser/test/PersistHelper.cpp
index 5e36bc8..d0dc948 100644
--- a/AParser/test/PersistHelper.cpp
+++ b/AParser/test/PersistHelper.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/test/PersistHelper.hpp b/AParser/test/PersistHelper.hpp
index 6a20097..6f5906a 100644
--- a/AParser/test/PersistHelper.hpp
+++ b/AParser/test/PersistHelper.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/test/TestAutoAddExterns.cpp b/AParser/test/TestAutoAddExterns.cpp
index 569bba6..18529cc 100644
--- a/AParser/test/TestAutoAddExterns.cpp
+++ b/AParser/test/TestAutoAddExterns.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/test/TestDefsStructurePersistAndReload.cpp b/AParser/test/TestDefsStructurePersistAndReload.cpp
index 15b6c22..24b3604 100644
--- a/AParser/test/TestDefsStructurePersistAndReload.cpp
+++ b/AParser/test/TestDefsStructurePersistAndReload.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/test/TestJobGenPerf.log b/AParser/test/TestJobGenPerf.log
new file mode 100644
index 0000000..15a72e8
--- /dev/null
+++ b/AParser/test/TestJobGenPerf.log
@@ -0,0 +1 @@
+ERR:[14:56:14 5.1.2017] Jobs::generate: job generation time(61 seconds) is greater than job submission interval of 20 seconds!!
diff --git a/AParser/test/TestMigration.cpp b/AParser/test/TestMigration.cpp
index c24302c..3137533 100644
--- a/AParser/test/TestMigration.cpp
+++ b/AParser/test/TestMigration.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -105,7 +105,7 @@ BOOST_AUTO_TEST_CASE( test_state_parser )
// Use memento to modify task state
SubmittableMemento memento( "Jobs_password","the_rid","the abort reason with spaces",12);
std::vector<ecf::Aspect::Type> aspects;
- t1->set_memento(&memento,aspects);
+ t1->set_memento(&memento,aspects,false);
BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Add one task failed: " << helper.errorMsg());
@@ -124,7 +124,7 @@ BOOST_AUTO_TEST_CASE( test_state_parser )
// Use memento to modify alias state
SubmittableMemento memento( "Jobs_password","the_rid","the abort reason with spaces",12);
std::vector<ecf::Aspect::Type> aspects;
- t1->set_memento(&memento,aspects);
+ t1->set_memento(&memento,aspects,false);
BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Add one alias failed: " << helper.errorMsg());
// Test multiple
diff --git a/AParser/test/TestParser.cpp b/AParser/test/TestParser.cpp
index 7026026..af8ece9 100644
--- a/AParser/test/TestParser.cpp
+++ b/AParser/test/TestParser.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/test/TestSingleDefsFile.cpp b/AParser/test/TestSingleDefsFile.cpp
index ab134c8..8edb7dd 100644
--- a/AParser/test/TestSingleDefsFile.cpp
+++ b/AParser/test/TestSingleDefsFile.cpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/test/TestVariableParsing.cpp b/AParser/test/TestVariableParsing.cpp
index 7f6b324..df8ed2b 100644
--- a/AParser/test/TestVariableParsing.cpp
+++ b/AParser/test/TestVariableParsing.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/AParser/test/data/bad_defs/cron/cron8.def b/AParser/test/data/bad_defs/cron/cron8.def
new file mode 100644
index 0000000..8895e79
--- /dev/null
+++ b/AParser/test/data/bad_defs/cron/cron8.def
@@ -0,0 +1,3 @@
+suite cron
+ cron 10:00 27:00 01:00 # max end time is 23:59
+endsuite
\ No newline at end of file
diff --git a/AParser/test/data/bad_defs/trigger/suite_with_trigger.def b/AParser/test/data/bad_defs/trigger/suite_with_trigger.def
new file mode 100644
index 0000000..058f67a
--- /dev/null
+++ b/AParser/test/data/bad_defs/trigger/suite_with_trigger.def
@@ -0,0 +1,6 @@
+suite suite_with_trigger_should_fail
+ trigger 1 == 0
+endsuite
+suite suite_with_complete_should_fail
+ complete 1 == 0
+endsuite
\ No newline at end of file
diff --git a/AParser/test/data/good_defs/cron/cron.def b/AParser/test/data/good_defs/cron/cron.def
index ea98a6e..e85f1f7 100644
--- a/AParser/test/data/good_defs/cron/cron.def
+++ b/AParser/test/data/good_defs/cron/cron.def
@@ -6,7 +6,8 @@ suite cron
cron -m 1,2,3 12:00 # run on Jan,Feb and March every day at noon.
cron -w 0,6 12:00
cron -w 0,1,2,3,4,5,6 12:00
- cron -w 0 -m 5,6,7,8 10:00 20:00 01:00 # run every sunday, between May-Aug, every hour between 10am and 8pm
+ cron -w 0 -m 5,6,7,8 10:00 20:00 01:00 # run every sunday, between May-Aug, every hour between 10am and 8pm
+ cron +00:00 23:59 01:00 # relative cron
endsuite
suite s1;cron 23:00 ;cron 10:00 20:00 01:00 ;cron -w 0,1 10:00 ;cron -d 10,11,12 12:00 ;cron -m 1,2,3 12:00 ; cron -w 0,6 12:00;cron -w 0,1,2,3,4,5,6 12:00;cron -w 0 -m 5,6,7,8 10:00 20:00 01:00 # run every sunday, between May-Aug, every hour between 10am and 8pm
diff --git a/AParser/test/data/good_defs/trigger/ECFLOW_867.def b/AParser/test/data/good_defs/trigger/ECFLOW_867.def
new file mode 100644
index 0000000..0323929
--- /dev/null
+++ b/AParser/test/data/good_defs/trigger/ECFLOW_867.def
@@ -0,0 +1,9 @@
+suite testdot
+ family f1.1
+ task t1
+ endfamily
+ family f2
+ task t1
+ trigger ../f1.1/t1 eq complete
+ endfamily
+endsuite
\ No newline at end of file
diff --git a/AParser/test/data/good_defs/trigger/late.def b/AParser/test/data/good_defs/trigger/late.def
new file mode 100644
index 0000000..5689e7c
--- /dev/null
+++ b/AParser/test/data/good_defs/trigger/late.def
@@ -0,0 +1,15 @@
+suite obs
+ family f1
+ task t
+ task t1
+ event event
+ endfamily
+ family anon
+ task t1
+ trigger /obs/f1/t<flag>late
+ task t2
+ trigger /obs/f1/t1:event
+ task t3
+ trigger /<flag>late # late flag set on Defs. Since defs is alawys there, does not need extern
+ endfamily
+endsuite
diff --git a/Base/Jamfile.jam b/Base/Jamfile.jam
index a75f299..7d75ea1 100644
--- a/Base/Jamfile.jam
+++ b/Base/Jamfile.jam
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/AbstractClientEnv.hpp b/Base/src/AbstractClientEnv.hpp
index 539087f..30585d4 100644
--- a/Base/src/AbstractClientEnv.hpp
+++ b/Base/src/AbstractClientEnv.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -29,10 +29,13 @@
class AbstractClientEnv : private boost::noncopyable {
protected:
- AbstractClientEnv() {}
+ AbstractClientEnv() : cli_(false) {}
public:
virtual ~AbstractClientEnv() {}
+ void set_cli(bool f) { cli_ = f ;}
+ bool get_cli() const { return cli_;}
+
/// For all tasks/child based commands we require taskPath and password and optional Remote ID
/// When the jobs use a queueing system the remote id (ECF_RID) is used to
/// aid killing of jobs.(typically zombies)
@@ -66,5 +69,8 @@ public:
/// when testing the client interface we want to avoid opening the log file.
virtual void set_test() = 0;
virtual bool under_test() const = 0;
+
+private:
+ bool cli_; // Command Line Interface. Controls whether output written to standard out, and argument checking
};
#endif
diff --git a/Base/src/AbstractServer.hpp b/Base/src/AbstractServer.hpp
index c8e3bc3..fcd01e7 100644
--- a/Base/src/AbstractServer.hpp
+++ b/Base/src/AbstractServer.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #45 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/Client.cpp b/Base/src/Client.cpp
index 3b8a329..b4b657f 100644
--- a/Base/src/Client.cpp
+++ b/Base/src/Client.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #33 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/Client.hpp b/Base/src/Client.hpp
index 8523e6e..257bbfd 100644
--- a/Base/src/Client.hpp
+++ b/Base/src/Client.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #18 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/ClientToServerRequest.cpp b/Base/src/ClientToServerRequest.cpp
index bc5f1d3..e4da1d9 100644
--- a/Base/src/ClientToServerRequest.cpp
+++ b/Base/src/ClientToServerRequest.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/ClientToServerRequest.hpp b/Base/src/ClientToServerRequest.hpp
index fcd8170..0baa783 100644
--- a/Base/src/ClientToServerRequest.hpp
+++ b/Base/src/ClientToServerRequest.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #32 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/Cmd.hpp b/Base/src/Cmd.hpp
index 765e641..4b35b75 100644
--- a/Base/src/Cmd.hpp
+++ b/Base/src/Cmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #84 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/Connection.cpp b/Base/src/Connection.cpp
index 03ee7d0..98c6bfb 100644
--- a/Base/src/Connection.cpp
+++ b/Base/src/Connection.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #26 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -70,7 +70,7 @@ connection::connection(boost::asio::io_service& io_service)
#endif
-void connection::log_error(const char* msg) const
+void connection::log_error(const char* msg)
{
const char* in_context = ", in client";
if (Ecf::server()) in_context = ", in server";
@@ -78,7 +78,7 @@ void connection::log_error(const char* msg) const
LOG(ecf::Log::ERR, msg << in_context);
}
-void connection::log_archive_error(const char* msg,const boost::archive::archive_exception& ae) const
+void connection::log_archive_error(const char* msg,const boost::archive::archive_exception& ae)
{
const char* in_context = ", in client";
if (Ecf::server()) in_context = ", in server";
diff --git a/Base/src/Connection.hpp b/Base/src/Connection.hpp
index 851e057..afa8063 100644
--- a/Base/src/Connection.hpp
+++ b/Base/src/Connection.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #26 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -284,8 +284,8 @@ private:
private:
- void log_error(const char* msg) const;
- void log_archive_error(const char* msg,const boost::archive::archive_exception& ae) const;
+ static void log_error(const char* msg);
+ static void log_archive_error(const char* msg,const boost::archive::archive_exception& ae);
private:
int allow_new_client_old_server_;
diff --git a/Base/src/Gnuplot.cpp b/Base/src/Gnuplot.cpp
index 7402f0d..0728f04 100644
--- a/Base/src/Gnuplot.cpp
+++ b/Base/src/Gnuplot.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/Gnuplot.hpp b/Base/src/Gnuplot.hpp
index a3aa743..2ecbe66 100644
--- a/Base/src/Gnuplot.hpp
+++ b/Base/src/Gnuplot.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #2 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/Openssl.cpp b/Base/src/Openssl.cpp
index b924c6b..a5c2564 100644
--- a/Base/src/Openssl.cpp
+++ b/Base/src/Openssl.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/Openssl.hpp b/Base/src/Openssl.hpp
index 296599a..6170bf5 100644
--- a/Base/src/Openssl.hpp
+++ b/Base/src/Openssl.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/ServerReply.cpp b/Base/src/ServerReply.cpp
index b055ccc..1ad622d 100644
--- a/Base/src/ServerReply.cpp
+++ b/Base/src/ServerReply.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/ServerReply.hpp b/Base/src/ServerReply.hpp
index d7d342f..14a70cd 100644
--- a/Base/src/ServerReply.hpp
+++ b/Base/src/ServerReply.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #18 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/ServerToClientResponse.cpp b/Base/src/ServerToClientResponse.cpp
index 9c945f9..81dc78f 100644
--- a/Base/src/ServerToClientResponse.cpp
+++ b/Base/src/ServerToClientResponse.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #13 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/ServerToClientResponse.hpp b/Base/src/ServerToClientResponse.hpp
index 8f3b2fc..ba54c2c 100644
--- a/Base/src/ServerToClientResponse.hpp
+++ b/Base/src/ServerToClientResponse.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #30 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/Stats.cpp b/Base/src/Stats.cpp
index c651652..617b6ce 100644
--- a/Base/src/Stats.cpp
+++ b/Base/src/Stats.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #35 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/Stats.hpp b/Base/src/Stats.hpp
index c3d998b..3786bd0 100644
--- a/Base/src/Stats.hpp
+++ b/Base/src/Stats.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #31 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/WhyCmd.cpp b/Base/src/WhyCmd.cpp
index 547f7f4..dde7e9c 100644
--- a/Base/src/WhyCmd.cpp
+++ b/Base/src/WhyCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/WhyCmd.hpp b/Base/src/WhyCmd.hpp
index d85e214..f284050 100644
--- a/Base/src/WhyCmd.hpp
+++ b/Base/src/WhyCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/ZombieCtrl.cpp b/Base/src/ZombieCtrl.cpp
index 18361d3..f770de6 100644
--- a/Base/src/ZombieCtrl.cpp
+++ b/Base/src/ZombieCtrl.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #41 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -531,22 +531,13 @@ void ZombieCtrl::adoptCli( const std::string& path_to_task, Submittable* task)
throw std::runtime_error("ZombieCtrl::adoptCli: Can't adopt zombie, there is no corresponding task!");
}
- /// Try to determine the real zombie. (not 100% precise) by comparing its password with zombie
- /// If zombie password does *NOT* match then this is the real zombie.
- size_t zombieVecSize = zombies_.size();
- for(size_t i = 0 ; i < zombieVecSize; i++) {
- if (zombies_[i].path_to_task() == path_to_task && zombies_[i].jobs_password() != task->jobsPassword()) {
- zombies_[i].set_adopt();
- return;
- }
- }
-
/// ***************************************************************************************
/// IMPORTANT: We should *NEVER* adopt a zombie, when the process id are different
/// This can end up, with two process running, Will mess up job output, as well as corruption caused
- /// but running the same job twice. Better to kill both and re-queue.
+ /// but running the same job twice. Better to kill both and re-queue.
/// Note: PBS can create two process, i.e same password, different PID's
/// ***************************************************************************************
+ size_t zombieVecSize = zombies_.size();
for(size_t i = 0 ; i < zombieVecSize; i++) {
if (zombies_[i].path_to_task() == path_to_task && zombies_[i].process_or_remote_id() != task->process_or_remote_id()) {
std::stringstream ss;
@@ -556,6 +547,15 @@ void ZombieCtrl::adoptCli( const std::string& path_to_task, Submittable* task)
throw std::runtime_error(ss.str());
}
}
+
+ /// Try to determine the real zombie. (not 100% precise) by comparing its password with zombie
+ /// If zombie password does *NOT* match then this is the real zombie.
+ for(size_t i = 0 ; i < zombieVecSize; i++) {
+ if (zombies_[i].path_to_task() == path_to_task && zombies_[i].jobs_password() != task->jobsPassword()) {
+ zombies_[i].set_adopt();
+ return;
+ }
+ }
}
void ZombieCtrl::block( const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password ) {
diff --git a/Base/src/ZombieCtrl.hpp b/Base/src/ZombieCtrl.hpp
index dc0697c..6aa2b78 100644
--- a/Base/src/ZombieCtrl.hpp
+++ b/Base/src/ZombieCtrl.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #23 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/AlterCmd.cpp b/Base/src/cts/AlterCmd.cpp
index db60db9..701db90 100644
--- a/Base/src/cts/AlterCmd.cpp
+++ b/Base/src/cts/AlterCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #62 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -25,6 +25,7 @@
#include "ExprAst.hpp"
#include "SuiteChanged.hpp"
#include "Log.hpp"
+#include "Extract.hpp"
using namespace ecf;
using namespace std;
@@ -123,6 +124,8 @@ static AlterCmd::Add_attr_type addAttrType(const std::string& s)
if (s == "zombie") return AlterCmd::ADD_ZOMBIE;
if (s == "variable") return AlterCmd::ADD_VARIABLE;
if (s == "late") return AlterCmd::ADD_LATE;
+ if (s == "limit") return AlterCmd::ADD_LIMIT;
+ if (s == "inlimit") return AlterCmd::ADD_INLIMIT;
return AlterCmd::ADD_ATTR_ND;
}
static std::string to_string(AlterCmd::Add_attr_type a) {
@@ -134,13 +137,15 @@ static std::string to_string(AlterCmd::Add_attr_type a) {
case AlterCmd::ADD_ZOMBIE: return "zombie"; break;
case AlterCmd::ADD_VARIABLE:return "variable"; break;
case AlterCmd::ADD_LATE: return "late"; break;
- case AlterCmd::ADD_ATTR_ND: break;
+ case AlterCmd::ADD_LIMIT: return "limit"; break;
+ case AlterCmd::ADD_INLIMIT: return "inlimit"; break;
+ case AlterCmd::ADD_ATTR_ND: break;
}
return string();
}
static void validAddAttr(std::vector<std::string>& vec)
{
- vec.reserve(7);
+ vec.reserve(8);
vec.push_back("time");
vec.push_back("today");
vec.push_back("date");
@@ -148,6 +153,7 @@ static void validAddAttr(std::vector<std::string>& vec)
vec.push_back("zombie");
vec.push_back("variable");
vec.push_back("late");
+ vec.push_back("limit");
}
@@ -286,6 +292,13 @@ STC_Cmd_ptr AlterCmd::alter_server_state(AbstractServer* as) const
else as->defs()->flag().clear(flag_type_);
}
+ // sort
+ ecf::Attr::Type attr = Attr::to_attr(name_);
+ if ( attr != ecf::Attr::UNKNOWN) {
+ bool recursive = (value_ == "recursive") ? true: false;
+ as->defs()->sort_attributes(attr,recursive);
+ }
+
return doJobSubmission( as );
}
@@ -372,6 +385,33 @@ STC_Cmd_ptr AlterCmd::doHandleRequest(AbstractServer* as) const
case AlterCmd::ADD_ZOMBIE: node->addZombie( ZombieAttr::create(name_) ); break;
case AlterCmd::ADD_VARIABLE:node->add_variable( name_, value_); break;
case AlterCmd::ADD_LATE: node->addLate( LateAttr::create(name_)); break;
+ case AlterCmd::ADD_LIMIT: {
+ int int_value = 0;
+ try { int_value = boost::lexical_cast< int >( value_ ); }
+ catch ( boost::bad_lexical_cast& ) {
+ std::stringstream ss; ss << "AlterCmd: add_limit " << name_ << " " << value_ << " failed. Expected '" << value_ << "' to be convertible to an integer";
+ throw std::runtime_error( ss.str() );
+ }
+ node->addLimit( Limit(name_, int_value));
+ break;
+ }
+ case AlterCmd::ADD_INLIMIT: {
+ string path_to_limit; // This can be empty
+ string limitName;
+ if ( !Extract::pathAndName( name_, path_to_limit, limitName ) ) {
+ throw std::runtime_error( "AlterCmd::ADD_INLIMIT: Invalid inlimit : " + name_);
+ }
+ int token_value = 1;
+ if (!value_.empty()) {
+ try { token_value = boost::lexical_cast< int >( value_ ); }
+ catch ( boost::bad_lexical_cast& ) {
+ ss << "AlterCmd: add_inlimit expected '" << value_ << "' to be convertible to an integer";
+ throw std::runtime_error( ss.str() );
+ }
+ }
+ node->addInLimit( InLimit( limitName, path_to_limit, token_value ) ); // will throw if not valid
+ break;
+ }
case AlterCmd::ADD_ATTR_ND: break;
}
}
@@ -389,6 +429,13 @@ STC_Cmd_ptr AlterCmd::doHandleRequest(AbstractServer* as) const
node->force_sync();
}
}
+
+ // sort
+ ecf::Attr::Type attr = Attr::to_attr(name_);
+ if ( attr != ecf::Attr::UNKNOWN) {
+ bool recursive = (value_ == "recursive") ? true: false;
+ node->sort_attributes(attr,recursive);
+ }
}
std::string error_msg = ss.str();
@@ -409,29 +456,31 @@ const char* AlterCmd::desc() {
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
return "Alter the node according to the options.\n"
"To add/delete/change server variables use '/' for the path.\n"
- " arg1 = [ delete | change | add | set_flag | clear_flag]\n"
- " one option must be specified\n"
- " arg2 = For delete:\n"
- " [ variable | time | today | date | day | cron | event | meter | late |\n"
- " label | trigger | complete | repeat | limit | inlimit | limit_path | zombie ]\n"
- " For change:\n"
- " [ variable | clock_type | clock_gain | clock_date | clock_sync | event | meter | label |\n"
- " trigger | complete | repeat | limit_max | limit_value | defstatus | late ]\n"
- " *NOTE* If the clock is changed, then the suite will need to be re-queued in order for\n"
- " the change to take effect fully.\n"
- " For add:\n"
- " [ variable | time | today | date | day | zombie | late ]\n"
- " For set_flag and clear_flag:\n"
- " [ force_aborted | user_edit | task_aborted | edit_failed |\n"
- " ecfcmd_failed | no_script | killed | migrated | late |\n"
- " message | complete | queue_limit | task_waiting | locked | zombie ]\n"
- " arg3 = name/value\n"
- " when changing, attributes like variable,meter,event,label,limits,late\n"
- " we expect arguments to be quoted\n"
- " arg4 = new_value\n"
- " specifies the new value only used for 'change'\n"
- " values with spaces must be quoted\n"
- " arg5 = paths : At lease one path required. The paths must start with a leading '/' character\n\n"
+ "arg1 = [ delete | change | add | set_flag | clear_flag | sort ]\n"
+ " one option must be specified\n"
+ "arg2 = For delete:\n"
+ " [ variable | time | today | date | day | cron | event | meter | late |\n"
+ " label | trigger | complete | repeat | limit | inlimit | limit_path | zombie ]\n"
+ " For change:\n"
+ " [ variable | clock_type | clock_gain | clock_date | clock_sync | event | meter | label |\n"
+ " trigger | complete | repeat | limit_max | limit_value | defstatus | late ]\n"
+ " *NOTE* If the clock is changed, then the suite will need to be re-queued in order for\n"
+ " the change to take effect fully.\n"
+ " For add:\n"
+ " [ variable | time | today | date | day | zombie | late | limit | inlimit ]\n"
+ " For set_flag and clear_flag:\n"
+ " [ force_aborted | user_edit | task_aborted | edit_failed |\n"
+ " ecfcmd_failed | no_script | killed | migrated | late |\n"
+ " message | complete | queue_limit | task_waiting | locked | zombie ]\n"
+ " For sort:\n"
+ " [ event | meter | label | variable| limit ]\n"
+ "arg3 = name/value\n"
+ " when changing, attributes like variable,meter,event,label,limits,late\n"
+ " we expect arguments to be quoted. For sort this argument can be called 'recursive'\n"
+ "arg4 = new_value\n"
+ " specifies the new value only used for 'change'\n"
+ " values with spaces must be quoted\n"
+ "arg5 = paths : At lease one path required. The paths must start with a leading '/' character\n\n"
;
}
@@ -464,7 +513,7 @@ void AlterCmd::create( Cmd_ptr& cmd,
throw std::runtime_error( ss.str() );
}
- // arg[0] should one of [ add | delete | change | set_flag | clear_flag ]
+ // arg[0] should one of [ add | delete | change | set_flag | clear_flag | sort ]
std::string alterType = options[0];
if ( alterType == "add") {
@@ -492,9 +541,14 @@ void AlterCmd::create( Cmd_ptr& cmd,
create_flag(cmd,options,paths, false /*clear */);
return;
}
+ else if ( alterType == "sort") {
+
+ create_sort_attributes(cmd,options,paths);
+ return;
+ }
std::stringstream ss;
- ss << "Alter: The first argument must be one of [ change | delete | add | set_flag | clear_flag ] but found '"
+ ss << "Alter: The first argument must be one of [ change | delete | add | set_flag | clear_flag | sort ] but found '"
<< alterType << "'\n" << dump_args(options,paths) << "\n";
throw std::runtime_error( ss.str() );
}
@@ -502,8 +556,8 @@ void AlterCmd::create( Cmd_ptr& cmd,
void AlterCmd::createAdd( Cmd_ptr& cmd, std::vector<std::string>& options, std::vector<std::string>& paths ) const
{
// options[0] - add
- // options[1] - [ time | date | day | zombie | variable ]
- // options[2] - [ time_string | date_string | day_string | zombie_string | variable_name ]
+ // options[1] - [ time | date | day | zombie | variable | limit | inlimit ]
+ // options[2] - [ time_string | date_string | day_string | zombie_string | variable_name | limit_name | path_to_limit ]
// options[3] - variable_value
std::stringstream ss;
@@ -553,6 +607,54 @@ void AlterCmd::createAdd( Cmd_ptr& cmd, std::vector<std::string>& options, std::
Variable check(name,value);
break;
}
+ case AlterCmd::ADD_LIMIT: { // inlimit /obs/limits:hpcd
+ if (options.size() < 4 ) {
+ ss << "AlterCmd: add: Expected 'add inlimit <name> <paths>. Not enough arguments\n" << dump_args(options,paths) << "\n";
+ throw std::runtime_error( ss.str() );
+ }
+ value = options[3];
+
+ int int_value = 0;
+ try { int_value = boost::lexical_cast< int >( value ); }
+ catch ( boost::bad_lexical_cast& ) {
+ ss << "AlterCmd: " << options[0] << " " << options[1] << " " << options[2] << " " << options[3] << paths[0];
+ ss << " expected '" << value << "' to be convertible to an integer\n";
+ ss << dump_args(options,paths) << "\n";
+ throw std::runtime_error( ss.str() );
+ }
+ Limit check(name,int_value); // will throw if not valid
+ break;
+ }
+ case AlterCmd::ADD_INLIMIT: { // inlimit /obs/limits:hpcd 2 name=hpcd, path=/obs/limits, tokens=2(optional)
+ // options[0] - add
+ // options[1] - [ inlimit ]
+ // options[2] - [ path_to_limit:limit_name ]
+ // options[3] - integer (optional)
+ if (options.size() < 3 ) {
+ ss << "AlterCmd: add: Expected 'add inlimit <path-to-limit:limit_name> <int>(optional) <paths>. Not enough arguments\n" << dump_args(options,paths) << "\n";
+ throw std::runtime_error( ss.str() );
+ }
+
+ string path_to_limit; // This can be empty
+ string limitName;
+ if ( !Extract::pathAndName( options[2], path_to_limit, limitName ) ) {
+ throw std::runtime_error( "AlterCmd::ADD_INLIMIT: Invalid inlimit : " + options[2] );
+ }
+
+ int token_value = 1;
+ if (options.size() == 4) {
+ value = options[3];
+ try { token_value = boost::lexical_cast< int >( options[3] ); }
+ catch ( boost::bad_lexical_cast& ) {
+ ss << "AlterCmd: " << options[0] << " " << options[1] << " " << options[2] << " " << options[3] << paths[0];
+ ss << " expected '" << options[3] << "' to be convertible to an integer\n";
+ ss << dump_args(options,paths) << "\n";
+ throw std::runtime_error( ss.str() );
+ }
+ }
+ InLimit inlimit( limitName, path_to_limit, token_value ); // will throw if not valid
+ break;
+ }
case AlterCmd::ADD_ATTR_ND:break;
}
}
@@ -850,17 +952,15 @@ void AlterCmd::createChange( Cmd_ptr& cmd, std::vector<std::string>& options, st
break; }
-
case AlterCmd::LABEL: {
-
if (options.size() == 3 && paths.size() == 1) {
// ECFLOW-648 allow label value to be empty
// HOWEVER , we can not cope multiple paths, and setting value to empty.
- // since empty quotes are removed by boost program options, hence if we have a lavel value which is path, and multiple paths
+ // since empty quotes are removed by boost program options, hence if we have a label value which is path, and multiple paths
value.clear();
}
else {
- // ECFLOW-480 take into account label values that is a path, add ing quotes around the value does not help:
+ // ECFLOW-480 take into account label values that is a path, adding quotes around the value does not help:
// Note boost program options will remove the quotes around the value
// hence its difficult to say what is an option and what is a path.
// However since we expect 4(change,label,<label_name>,<label_value>) options, work around the problem
@@ -893,17 +993,6 @@ void AlterCmd::createChange( Cmd_ptr& cmd, std::vector<std::string>& options, st
break; }
case AlterCmd::TRIGGER: {
- // ECFLOW-137, if the expression contains a leading '/' and *no* spaces,
- // then it will get treated as a path and not an option
- // i.e change trigger 'expression' <path_to_node>
- // change trigger "/suite/task:a" /path/to/a/node
- // Note boost program options will remove the quotes around the expression
- // hence its difficult to say what is an option and what is a path.
- // However since we expect 3 options, work around the problem
- if (options.size() == 2 && paths.size() == 2) {
- options.push_back(paths[0]);
- paths.erase(paths.begin()); // remove first path, since it has been added to options
- }
if (options.size() != 3) {
ss << "AlterCmd: change: expected four args : change trigger 'expression' <path_to_node>";
ss << " but found " << (options.size() + paths.size()) << " arguments. The trigger expression must be quoted\n";
@@ -924,10 +1013,6 @@ void AlterCmd::createChange( Cmd_ptr& cmd, std::vector<std::string>& options, st
break; }
case AlterCmd::COMPLETE: {
- if (options.size() == 2 && paths.size() == 2) {
- options.push_back(paths[0]);
- paths.erase(paths.begin()); // remove first path, since it has been added to options
- }
if (options.size() != 3) {
ss << "AlterCmd: change complete: expected four args: change complete 'expression' <path_to_node> ";
ss << " but found " << (options.size() + paths.size()) << " arguments. The expression must be quoted\n";
@@ -1037,4 +1122,41 @@ void AlterCmd::create_flag( Cmd_ptr& cmd, const std::vector<std::string>& option
cmd = Cmd_ptr( new AlterCmd(paths,theFlagType, flag ) );
}
+void AlterCmd::create_sort_attributes(Cmd_ptr& cmd,const std::vector<std::string>& options,const std::vector<std::string>& paths) const
+{
+ // options[0] - sort
+ // options[1] - [ event | meter | label | limit | variable ]
+ // options[2] - recursive
+ std::stringstream ss;
+
+ if (options.size() < 2 ) {
+ ss << "AlterCmd: add: At least three arguments expected. Found " << (options.size() + paths.size()) << "\n" << dump_args(options,paths) << "\n";
+ throw std::runtime_error( ss.str() );
+ }
+
+ ecf::Attr::Type theAttrType = Attr::to_attr(options[1]);
+ if (theAttrType == Attr::UNKNOWN) {
+ ss << "AlterCmd: sort: The second argument must be one of [ ";
+ std::vector<std::string> valid = Attr::all_attrs();
+ for(size_t i = 0; i < valid.size(); ++i) {
+ if (i != 0) ss << " | ";
+ ss << valid[i];
+ }
+ ss << "] but found " << options[1] << "\n" << AlterCmd::desc();
+ throw std::runtime_error( ss.str() );
+ }
+ std::string name = options[1];
+
+ std::string value;
+ if (options.size() == 3) {
+ if (options[2] != "recursive") {
+ ss << "AlterCmd: sort: Expected third argument to be 'recursive' but found '" << options[2] << "\n" << AlterCmd::desc();
+ throw std::runtime_error( ss.str() );
+ }
+ value = "recursive";
+ }
+
+ cmd = Cmd_ptr( new AlterCmd(paths, name,value) );
+}
+
std::ostream& operator<<(std::ostream& os, const AlterCmd& c) { return c.print(os); }
diff --git a/Base/src/cts/BeginCmd.cpp b/Base/src/cts/BeginCmd.cpp
index 09992ec..2390729 100644
--- a/Base/src/cts/BeginCmd.cpp
+++ b/Base/src/cts/BeginCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #23 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/CFileCmd.cpp b/Base/src/cts/CFileCmd.cpp
index c8bcd54..6b17f82 100644
--- a/Base/src/cts/CFileCmd.cpp
+++ b/Base/src/cts/CFileCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #42 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -141,7 +141,7 @@ STC_Cmd_ptr CFileCmd::doHandleRequest(AbstractServer* as) const
submittable->findParentVariableValue(Str::ECF_JOB(), ecf_job_file);
if (!File::open(ecf_job_file,fileContents)) {
std::stringstream ss;
- ss << "CFileCmd::doHandleRequest: Failed to open the job file('" << ecf_job_file << "') for task " << pathToNode_;
+ ss << "CFileCmd::doHandleRequest: Failed to open the job file('" << ecf_job_file << "') for task " << pathToNode_<< " (" << strerror(errno) << ")";
throw std::runtime_error( ss.str() ) ;
}
break;}
@@ -170,7 +170,7 @@ STC_Cmd_ptr CFileCmd::doHandleRequest(AbstractServer* as) const
std::stringstream ss;
ss << "CFileCmd::doHandleRequest: Failed to open the job-out(ECF_JOBOUT=ECF_OUT/ECF_NAME.ECF_TRYNO) file('"
<< ecf_jobout_gen_var.theValue() << "') *AND* at location (ECF_JOBOUT=ECF_HOME/ECF_NAME.ECF_TRYNO)('"
- << backup_jobout << "') for task " << pathToNode_;
+ << backup_jobout << "') for task " << pathToNode_ << " (" << strerror(errno) << ")";
throw std::runtime_error( ss.str() ) ;
}
}
@@ -191,7 +191,7 @@ STC_Cmd_ptr CFileCmd::doHandleRequest(AbstractServer* as) const
std::string file = ecf_job_file + ".kill";
if (!File::open(file,fileContents)) {
std::stringstream ss;
- ss << "CFileCmd::doHandleRequest: Failed to open the kill output file('" << file << "') for task " << pathToNode_;
+ ss << "CFileCmd::doHandleRequest: Failed to open the kill output file('" << file << "') for task " << pathToNode_<< " (" << strerror(errno) << ")";
throw std::runtime_error( ss.str() ) ;
}
break; }
@@ -202,7 +202,7 @@ STC_Cmd_ptr CFileCmd::doHandleRequest(AbstractServer* as) const
std::string file = ecf_job_file + ".stat";
if (!File::open(file,fileContents)) {
std::stringstream ss;
- ss << "CFileCmd::doHandleRequest: Failed to open the status output file('" << file << "') for task " << pathToNode_;
+ ss << "CFileCmd::doHandleRequest: Failed to open the status output file('" << file << "') for task " << pathToNode_<< " (" << strerror(errno) << ")";
throw std::runtime_error( ss.str() ) ;
}
break; }
@@ -218,7 +218,7 @@ STC_Cmd_ptr CFileCmd::doHandleRequest(AbstractServer* as) const
// First look for .man files in ECF_FILES and then ECF_HOME
std::string ecf_files;
node->findParentUserVariableValue( Str::ECF_FILES(), ecf_files);
- if ( !ecf_files.empty() && fs::exists( ecf_files ) && fs::is_directory( ecf_files ) ) {
+ if ( !ecf_files.empty() && fs::is_directory( ecf_files ) ) {
std::string manFile = File::backwardSearch( ecf_files, node->absNodePath(), File::MAN_EXTN());
if (!manFile.empty()) {
@@ -231,7 +231,7 @@ STC_Cmd_ptr CFileCmd::doHandleRequest(AbstractServer* as) const
// Try under ECF_HOME
std::string ecf_home;
node->findParentUserVariableValue( Str::ECF_HOME(), ecf_home);
- if ( !ecf_home.empty() && fs::exists( ecf_home ) && fs::is_directory( ecf_home ) ) {
+ if ( !ecf_home.empty() && fs::is_directory( ecf_home ) ) {
std::string manFile = File::backwardSearch( ecf_home, node->absNodePath(), File::MAN_EXTN());
EcfFile the_file(node.get(), manFile);
diff --git a/Base/src/cts/CSyncCmd.cpp b/Base/src/cts/CSyncCmd.cpp
index 353b62b..eefc9eb 100644
--- a/Base/src/cts/CSyncCmd.cpp
+++ b/Base/src/cts/CSyncCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #22 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/CheckPtCmd.cpp b/Base/src/cts/CheckPtCmd.cpp
index 2f18f93..c04b907 100644
--- a/Base/src/cts/CheckPtCmd.cpp
+++ b/Base/src/cts/CheckPtCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/ClientHandleCmd.cpp b/Base/src/cts/ClientHandleCmd.cpp
index c1b8f8e..9422762 100644
--- a/Base/src/cts/ClientHandleCmd.cpp
+++ b/Base/src/cts/ClientHandleCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #31 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -43,7 +43,6 @@ std::ostream& ClientHandleCmd::print(std::ostream& os) const
case ClientHandleCmd::DROP_USER:{
if (drop_user_.empty()) return user_cmd(os,CtsApi::ch_drop_user(user()));
return user_cmd(os,CtsApi::ch_drop_user(drop_user_));
- break;
}
case ClientHandleCmd::ADD: return user_cmd(os,CtsApi::to_string(CtsApi::ch_add(client_handle_,suites_))); break;
case ClientHandleCmd::REMOVE: return user_cmd(os,CtsApi::to_string(CtsApi::ch_remove(client_handle_,suites_))); break;
@@ -129,7 +128,6 @@ STC_Cmd_ptr ClientHandleCmd::doHandleRequest(AbstractServer* as) const
case ClientHandleCmd::SUITES: {
return PreAllocatedReply::client_handle_suites_cmd(as) ;
- break;
}
default: assert(false); break;
diff --git a/Base/src/cts/ClientToServerCmd.cpp b/Base/src/cts/ClientToServerCmd.cpp
index e11aa8a..c80acab 100644
--- a/Base/src/cts/ClientToServerCmd.cpp
+++ b/Base/src/cts/ClientToServerCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #67 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/ClientToServerCmd.hpp b/Base/src/cts/ClientToServerCmd.hpp
index 503d555..c23f009 100644
--- a/Base/src/cts/ClientToServerCmd.hpp
+++ b/Base/src/cts/ClientToServerCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #143 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -525,7 +525,8 @@ protected:
static void split_args_to_options_and_paths(
const std::vector<std::string>& args,
std::vector<std::string>& options,
- std::vector<std::string>& paths);
+ std::vector<std::string>& paths,
+ bool treat_colon_in_path_as_path = false);
private:
std::string user_;
@@ -1451,35 +1452,42 @@ public:
enum Change_attr_type { VARIABLE, CLOCK_TYPE, CLOCK_DATE, CLOCK_GAIN, EVENT, METER, LABEL,
TRIGGER, COMPLETE, REPEAT, LIMIT_MAX, LIMIT_VAL, DEFSTATUS, CHANGE_ATTR_ND, CLOCK_SYNC, LATE };
- enum Add_attr_type { ADD_TIME, ADD_TODAY, ADD_DATE, ADD_DAY, ADD_ZOMBIE, ADD_VARIABLE, ADD_ATTR_ND, ADD_LATE };
-
+ enum Add_attr_type { ADD_TIME, ADD_TODAY, ADD_DATE, ADD_DAY, ADD_ZOMBIE, ADD_VARIABLE, ADD_ATTR_ND, ADD_LATE, ADD_LIMIT, ADD_INLIMIT };
+ // add
AlterCmd(const std::string& path, Add_attr_type attr, const std::string& name, const std::string& value = "" )
: paths_(std::vector<std::string>(1,path)), name_(name), value_(value), add_attr_type_(attr),
del_attr_type_(DELETE_ATTR_ND), change_attr_type_(CHANGE_ATTR_ND),flag_type_(ecf::Flag::NOT_SET), flag_(false) {}
AlterCmd(const std::vector<std::string>& paths, Add_attr_type attr, const std::string& name, const std::string& value = "" )
: paths_(paths), name_(name), value_(value), add_attr_type_(attr),
del_attr_type_(DELETE_ATTR_ND), change_attr_type_(CHANGE_ATTR_ND),flag_type_(ecf::Flag::NOT_SET), flag_(false) {}
-
+ // delete
AlterCmd(const std::string& path, Delete_attr_type del, const std::string& name = "" , const std::string& value = "")
: paths_(std::vector<std::string>(1,path)), name_(name), value_(value), add_attr_type_(ADD_ATTR_ND),
del_attr_type_(del), change_attr_type_(CHANGE_ATTR_ND),flag_type_(ecf::Flag::NOT_SET), flag_(false) {}
AlterCmd(const std::vector<std::string>& paths, Delete_attr_type del, const std::string& name = "" , const std::string& value = "")
: paths_(paths), name_(name), value_(value), add_attr_type_(ADD_ATTR_ND),
del_attr_type_(del), change_attr_type_(CHANGE_ATTR_ND),flag_type_(ecf::Flag::NOT_SET), flag_(false) {}
-
+ // change
AlterCmd(const std::string& path, Change_attr_type attr, const std::string& name, const std::string& value = "")
: paths_(std::vector<std::string>(1,path)), name_(name), value_(value), add_attr_type_(ADD_ATTR_ND),
del_attr_type_(DELETE_ATTR_ND), change_attr_type_(attr),flag_type_(ecf::Flag::NOT_SET), flag_(false) {}
AlterCmd(const std::vector<std::string>& paths, Change_attr_type attr, const std::string& name, const std::string& value = "")
: paths_(paths), name_(name), value_(value), add_attr_type_(ADD_ATTR_ND),
del_attr_type_(DELETE_ATTR_ND), change_attr_type_(attr),flag_type_(ecf::Flag::NOT_SET), flag_(false) {}
-
+ // flag
AlterCmd(const std::string& path, ecf::Flag::Type ft, bool flag)
: paths_(std::vector<std::string>(1,path)), add_attr_type_(ADD_ATTR_ND),
del_attr_type_(DELETE_ATTR_ND), change_attr_type_(CHANGE_ATTR_ND),flag_type_(ft), flag_(flag) {}
AlterCmd(const std::vector<std::string>& paths, ecf::Flag::Type ft, bool flag)
: paths_(paths), add_attr_type_(ADD_ATTR_ND),
del_attr_type_(DELETE_ATTR_ND), change_attr_type_(CHANGE_ATTR_ND),flag_type_(ft), flag_(flag) {}
+ // sort
+ AlterCmd(const std::string& path, const std::string& name,const std::string& value)
+ : paths_(std::vector<std::string>(1,path)), name_(name),value_(value),add_attr_type_(ADD_ATTR_ND),
+ del_attr_type_(DELETE_ATTR_ND), change_attr_type_(CHANGE_ATTR_ND),flag_type_(ecf::Flag::NOT_SET), flag_(false) {}
+ AlterCmd(const std::vector<std::string>& paths, const std::string& name,const std::string& value)
+ : paths_(paths), name_(name),value_(value),add_attr_type_(ADD_ATTR_ND),
+ del_attr_type_(DELETE_ATTR_ND), change_attr_type_(CHANGE_ATTR_ND),flag_type_(ecf::Flag::NOT_SET), flag_(false) {}
AlterCmd()
: add_attr_type_(ADD_ATTR_ND), del_attr_type_(DELETE_ATTR_ND),
@@ -1517,6 +1525,7 @@ private:
void createDelete( Cmd_ptr& cmd, const std::vector<std::string>& options, const std::vector<std::string>& paths) const;
void createChange( Cmd_ptr& cmd, std::vector<std::string>& options, std::vector<std::string>& paths) const;
void create_flag( Cmd_ptr& cmd, const std::vector<std::string>& options, const std::vector<std::string>& paths, bool flag) const;
+ void create_sort_attributes(Cmd_ptr& cmd,const std::vector<std::string>& options,const std::vector<std::string>& paths ) const;
std::ostream& my_print(std::ostream& os, const std::vector<std::string>& paths) const;
diff --git a/Base/src/cts/CtsApi.cpp b/Base/src/cts/CtsApi.cpp
index 12f5f35..43992f8 100644
--- a/Base/src/cts/CtsApi.cpp
+++ b/Base/src/cts/CtsApi.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #76 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -651,6 +651,21 @@ std::vector<std::string> CtsApi::alter(
{
return CtsApi::alter(std::vector<std::string>(1,path),alterType,attrType,name,value);
}
+
+std::vector<std::string> CtsApi::alter_sort(
+ const std::vector<std::string>& paths,
+ const std::string& sortable_attribute_name,
+ bool recursive)
+{
+ std::vector<std::string> retVec; retVec.reserve(2 + paths.size());
+
+ retVec.push_back("--alter");
+ retVec.push_back("sort");
+ retVec.push_back(sortable_attribute_name);
+ if ( recursive ) retVec.push_back("recursive");
+ std::copy(paths.begin(),paths.end(),std::back_inserter(retVec));
+ return retVec;
+}
const char* CtsApi::alterArg() { return "alter"; }
diff --git a/Base/src/cts/CtsApi.hpp b/Base/src/cts/CtsApi.hpp
index 2f25e69..a7f19de 100644
--- a/Base/src/cts/CtsApi.hpp
+++ b/Base/src/cts/CtsApi.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #74 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -127,6 +127,9 @@ public:
const std::string& attrType,
const std::string& name = "",
const std::string& value = "");
+ static std::vector<std::string> alter_sort(const std::vector<std::string>& paths,
+ const std::string& sortable_attribute_name,
+ bool recursive);
static std::string reloadwsfile();
static std::string reloadpasswdfile();
diff --git a/Base/src/cts/CtsCmd.cpp b/Base/src/cts/CtsCmd.cpp
index f659c13..b096cf9 100644
--- a/Base/src/cts/CtsCmd.cpp
+++ b/Base/src/cts/CtsCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #81 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -51,8 +51,8 @@ std::ostream& CtsCmd::print(std::ostream& os) const
case CtsCmd::DEBUG_SERVER_ON: return user_cmd(os,CtsApi::debug_server_on()); break;
case CtsCmd::DEBUG_SERVER_OFF: return user_cmd(os,CtsApi::debug_server_off()); break;
case CtsCmd::SERVER_LOAD: return user_cmd(os,CtsApi::server_load("")); break;
- case CtsCmd::NO_CMD: assert(false); break;
- default: assert(false); break;
+ case CtsCmd::NO_CMD: assert(false); os << "CtsCmdCtsCmd::NO_CMD !!!!"; break;
+ default: assert(false); os << "CtsCmd did not match api_ !!!!"; break;
}
return os;
}
@@ -297,8 +297,11 @@ void CtsCmd::addOption(boost::program_options::options_description& desc) const
desc.add_options()( CtsApi::reloadwsfileArg(),
"Reload the white list file.\n"
"The white list file is used to authenticate 'user' commands.\n"
- "File path is specified by ECF_LISTS environment, read by the server on startup.\n"
- "If ECF_LISTS is not specified, then by default it will open <host>.<port>.ecf.lists\n"
+ "File path is specified by ECF_LISTS environment, read by the server on *startup*.\n"
+ "Hence the contents of the file can be changed but not the location\n"
+ "If ECF_LISTS is not specified, or is specified and is 'ecf.lists' then by default\n"
+ "it will open <host>.<port>.ecf.lists.If a path like /var/tmp/ecf.lists was specified\n"
+ "for ECF_LISTS, then this is the path used for reloading the white list file\n"
"On startup, if the file is not present or is present but is empty (i.e just contains the version number)\n"
"then all users have read/write access\n"
"However on reload it will raises an error if file does not exist, or fails to parse\n"
diff --git a/Base/src/cts/CtsCmdRegistry.cpp b/Base/src/cts/CtsCmdRegistry.cpp
index 4bd6aee..de75d9d 100644
--- a/Base/src/cts/CtsCmdRegistry.cpp
+++ b/Base/src/cts/CtsCmdRegistry.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #52 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/CtsCmdRegistry.hpp b/Base/src/cts/CtsCmdRegistry.hpp
index d52f818..7db3cf1 100644
--- a/Base/src/cts/CtsCmdRegistry.hpp
+++ b/Base/src/cts/CtsCmdRegistry.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/CtsNodeCmd.cpp b/Base/src/cts/CtsNodeCmd.cpp
index 2a99784..1d0621c 100644
--- a/Base/src/cts/CtsNodeCmd.cpp
+++ b/Base/src/cts/CtsNodeCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #70 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/EditHistoryMgr.cpp b/Base/src/cts/EditHistoryMgr.cpp
index 81b6724..b83671e 100644
--- a/Base/src/cts/EditHistoryMgr.cpp
+++ b/Base/src/cts/EditHistoryMgr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #72 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/EditHistoryMgr.hpp b/Base/src/cts/EditHistoryMgr.hpp
index dd355c4..8a93cb3 100644
--- a/Base/src/cts/EditHistoryMgr.hpp
+++ b/Base/src/cts/EditHistoryMgr.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #72 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/EditScriptCmd.cpp b/Base/src/cts/EditScriptCmd.cpp
index 5c818fd..c6c3b3f 100644
--- a/Base/src/cts/EditScriptCmd.cpp
+++ b/Base/src/cts/EditScriptCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #37 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -369,7 +369,7 @@ void EditScriptCmd::create( Cmd_ptr& cmd,
throw std::runtime_error(ss.str());
}
if (!File::splitFileIntoLines(path_to_script, script_lines)) {
- ss << "Could not open script file " << path_to_script;
+ ss << "Could not open script file " << path_to_script << " (" << strerror(errno) << ")";
throw std::runtime_error(ss.str());
}
diff --git a/Base/src/cts/ForceCmd.cpp b/Base/src/cts/ForceCmd.cpp
index 76b8e22..1546866 100644
--- a/Base/src/cts/ForceCmd.cpp
+++ b/Base/src/cts/ForceCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #36 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -105,6 +105,10 @@ STC_Cmd_ptr ForceCmd::doHandleRequest(AbstractServer* as) const
node->miss_next_time_slot();
}
+ if ( new_state != NState::ACTIVE && new_state != NState::SUBMITTED) {
+ as->zombie_ctrl().add_user_zombies(node);
+ }
+
if (recursive_) node->set_state_hierarchically( new_state, true /* force */ );
else node->set_state( new_state, true /* force */ );
}
@@ -206,7 +210,7 @@ void ForceCmd::create( Cmd_ptr& cmd,
}
std::vector<std::string> options,paths;
- split_args_to_options_and_paths(args,options,paths); // relative order is still preserved
+ split_args_to_options_and_paths(args,options,paths,true/*treat_colon_in_path_as_path*/); // relative order is still preserved
if (paths.empty()) {
std::stringstream ss;
ss << "ForceCmd: No paths specified. Paths must begin with a leading '/' character\n" << ForceCmd::desc() << "\n";
diff --git a/Base/src/cts/FreeDepCmd.cpp b/Base/src/cts/FreeDepCmd.cpp
index b54d5f9..4a26899 100644
--- a/Base/src/cts/FreeDepCmd.cpp
+++ b/Base/src/cts/FreeDepCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #28 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/GroupCTSCmd.cpp b/Base/src/cts/GroupCTSCmd.cpp
index f3796e6..32fac05 100644
--- a/Base/src/cts/GroupCTSCmd.cpp
+++ b/Base/src/cts/GroupCTSCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #29 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/LoadDefsCmd.cpp b/Base/src/cts/LoadDefsCmd.cpp
index 39e73d1..9c8af78 100644
--- a/Base/src/cts/LoadDefsCmd.cpp
+++ b/Base/src/cts/LoadDefsCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #43 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/LogCmd.cpp b/Base/src/cts/LogCmd.cpp
index a7f8f96..d702b2b 100644
--- a/Base/src/cts/LogCmd.cpp
+++ b/Base/src/cts/LogCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #30 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/LogMessageCmd.cpp b/Base/src/cts/LogMessageCmd.cpp
index 00425a4..6ba412f 100644
--- a/Base/src/cts/LogMessageCmd.cpp
+++ b/Base/src/cts/LogMessageCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/OrderNodeCmd.cpp b/Base/src/cts/OrderNodeCmd.cpp
index b096313..6ac8697 100644
--- a/Base/src/cts/OrderNodeCmd.cpp
+++ b/Base/src/cts/OrderNodeCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #21 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/PathsCmd.cpp b/Base/src/cts/PathsCmd.cpp
index d1f1938..17eb2c4 100644
--- a/Base/src/cts/PathsCmd.cpp
+++ b/Base/src/cts/PathsCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #16 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/PlugCmd.cpp b/Base/src/cts/PlugCmd.cpp
index 31cca4f..32280e2 100644
--- a/Base/src/cts/PlugCmd.cpp
+++ b/Base/src/cts/PlugCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #32 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/ReplaceNodeCmd.cpp b/Base/src/cts/ReplaceNodeCmd.cpp
index f23891b..a6d8b87 100644
--- a/Base/src/cts/ReplaceNodeCmd.cpp
+++ b/Base/src/cts/ReplaceNodeCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #37 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/RequeueNodeCmd.cpp b/Base/src/cts/RequeueNodeCmd.cpp
index 7cf1a15..84c0f28 100644
--- a/Base/src/cts/RequeueNodeCmd.cpp
+++ b/Base/src/cts/RequeueNodeCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #32 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/RunNodeCmd.cpp b/Base/src/cts/RunNodeCmd.cpp
index ecc3c30..0dab4dd 100644
--- a/Base/src/cts/RunNodeCmd.cpp
+++ b/Base/src/cts/RunNodeCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #34 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/ServerVersionCmd.cpp b/Base/src/cts/ServerVersionCmd.cpp
index c2e7ba0..2e46acc 100644
--- a/Base/src/cts/ServerVersionCmd.cpp
+++ b/Base/src/cts/ServerVersionCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/ShowCmd.cpp b/Base/src/cts/ShowCmd.cpp
index 398a245..cfcdd31 100644
--- a/Base/src/cts/ShowCmd.cpp
+++ b/Base/src/cts/ShowCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #20 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/TaskApi.cpp b/Base/src/cts/TaskApi.cpp
index 66f97cd..70aa24b 100644
--- a/Base/src/cts/TaskApi.cpp
+++ b/Base/src/cts/TaskApi.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/TaskApi.hpp b/Base/src/cts/TaskApi.hpp
index 12c7503..5c122a9 100644
--- a/Base/src/cts/TaskApi.hpp
+++ b/Base/src/cts/TaskApi.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/cts/TaskCmds.cpp b/Base/src/cts/TaskCmds.cpp
index 9e79a39..8bd066a 100644
--- a/Base/src/cts/TaskCmds.cpp
+++ b/Base/src/cts/TaskCmds.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #91 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -129,6 +129,9 @@ bool TaskCmd::authenticate(AbstractServer* as, STC_Cmd_ptr& theReply) const
password_missmatch = true;
}
+ /// When state is in SUBMITTED, its process/remote_id is EMPTY. It will be set by the INIT child command.
+ /// Hence we can *NOT* mark it as pid_missmatch.
+ ///
/// *** See Note above: Not all child commands pass a process_id. ***
/// *** Hence this test for zombies is ONLY valid if process sets the process_or_remote_id_ ****
/// *** User should really set ECF_RID in the scripts
diff --git a/Base/src/cts/UserCmd.cpp b/Base/src/cts/UserCmd.cpp
index 078a1cf..6cf2543 100644
--- a/Base/src/cts/UserCmd.cpp
+++ b/Base/src/cts/UserCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #65 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -204,25 +204,46 @@ std::ostream& UserCmd::user_cmd(std::ostream& os, const std::string& the_cmd) co
void UserCmd::split_args_to_options_and_paths(
const std::vector<std::string>& args,
std::vector<std::string>& options,
- std::vector<std::string>& paths)
+ std::vector<std::string>& paths,
+ bool treat_colon_in_path_as_path)
{
// ** ECFLOW-137 **, if the trigger expression have a leading '/' then it gets parsed into the paths
// vector and not options
// This is because boost program options does *NOT* seem to preserve the leading quotes around the
// trigger/complete expression, i.e "/suite/t2 == complete" is read as /suite/t2 == complete
- // However in paths we do expect to see any spaces
-
+ // However in paths we do expect to see any spaces
+
+ // Note: Node names are not allowed ':', hence ':' in a node path is always to reference a node attribute, event,limit in this case
+ // However we need to deal with special situations:
+ // o --alter add inlimit /path/to/node/withlimit:limit_name 10 /s1 # TREAT /path/to/node/withlimit:limit_name as a OPTION
+ // o --change trigger "/suite/task:a" /path/to/a/node # TREAT "/suite/task:a" as a OPTION
+ // o --force=clear /suite/task:ev # TREAT /suite/task:ev as a PATH
+ // We need to distinguish between the two, hence use treat_colon_in_path_as_path
size_t vec_size = args.size();
- for(size_t i = 0; i < vec_size; i++) {
- if (args[i].empty()) continue;
- if (args[i][0] == '/' && args[i].find(" ") == std::string::npos) {
- paths.push_back(args[i]);
+ if (treat_colon_in_path_as_path ) {
+ for(size_t i = 0; i < vec_size; i++) {
+ if (args[i].empty()) continue;
+ if (args[i][0] == '/' && args[i].find(" ") == std::string::npos) {
+ // --force=clear /suite/task:ev -> treat '/suite/task:ev' as a path
+ paths.push_back(args[i]);
+ }
+ else {
+ options.push_back(args[i]);
+ }
}
- else {
- options.push_back(args[i]);
+ }
+ else {
+ // Treat ':' is path as a option, TREAT '/path/to/node/withlimit:limit_name' as a option
+ for(size_t i = 0; i < vec_size; i++) {
+ if (args[i].empty()) continue;
+ if (args[i][0] == '/' && args[i].find(" ") == std::string::npos && args[i].find(":") == std::string::npos) {
+ paths.push_back(args[i]);
+ }
+ else {
+ options.push_back(args[i]);
+ }
}
}
-
#ifdef DEBUG_ME
std::cout << "split_args_to_options_and_paths\n";
for(size_t i = 0; i < args.size(); ++i) { std::cout << "args[" << i << "]=" <<args[i] << "\n"; }
diff --git a/Base/src/cts/ZombieCmd.cpp b/Base/src/cts/ZombieCmd.cpp
index 8aaa1b7..f75ae18 100644
--- a/Base/src/cts/ZombieCmd.cpp
+++ b/Base/src/cts/ZombieCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #24 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -136,7 +136,7 @@ void ZombieCmd::addOption(boost::program_options::options_description& desc) con
"with the server, they will complete successfully (but without updating the node tree)\n"
"allowing the job to finish.\n"
"The server zombie is automatically deleted after 1 hour\n"
- " arg = path to task\n"
+ " arg = path to task # Only a single path allowed\n"
" --zombie_fob=/path/to/task"
);
break;
@@ -149,7 +149,7 @@ void ZombieCmd::addOption(boost::program_options::options_description& desc) con
"force a abort, the abort will also fail.\n"
"Hence job structure should use 'set -e' in the error trapping functions to prevent\n"
"infinite recursion. The server zombie is automatically deleted after 1 hour\n"
- " arg = path to task\n"
+ " arg = path to task # Only a single path allowed\n"
" --zombie_fail=/path/to/task"
);
break;
@@ -160,7 +160,7 @@ void ZombieCmd::addOption(boost::program_options::options_description& desc) con
"Next time the child commands (init,event,meter,label,abort,complete) communicate\n"
"with the server, the password on the zombie is adopted by the task.\n"
"The zombie is then deleted.\n"
- " arg = path to task\n"
+ " arg = path to task # Only a single path allowed\n"
" --zombie_adopt=/path/to/task"
);
break;
@@ -170,7 +170,7 @@ void ZombieCmd::addOption(boost::program_options::options_description& desc) con
"Locates the task in the zombie list, and removes it.\n"
"Since a job typically has many child commands(i.e init, complete, event, meter, label)\n"
"the zombie may reappear\n"
- " arg = path to task\n"
+ " arg = path to task # Only a single path allowed\n"
" --zombie_remove=/path/to/task"
);
break;
@@ -182,7 +182,7 @@ void ZombieCmd::addOption(boost::program_options::options_description& desc) con
"when the server can not match the passwords. Each child commands will continue\n"
"attempting to connect to the server for 24 hours, and will then return an error.\n"
"The connection timeout can be configured with environment ECF_TIMEOUT\n"
- " arg = path to task\n"
+ " arg = path to task # Only a single path allowed\n"
" --zombie_block=/path/to/task"
);
break;
@@ -194,7 +194,7 @@ void ZombieCmd::addOption(boost::program_options::options_description& desc) con
"The job is allowed to continue until the kill is received\n"
"Can only kill zombies that have an associated Task, hence path zombies\n"
"must be killed manually.\n"
- " arg = path to task\n"
+ " arg = path to task # Only a single path allowed \n"
" --zombie_kill=/path/to/task"
);
break;
@@ -226,6 +226,20 @@ void ZombieCmd::create( Cmd_ptr& cmd,
throw std::runtime_error("ZombieCmd::create: expects at least one argument. path to task");
}
+ if (ace->get_cli()) {
+ // We are using command line, only a single path argument is acceptable
+ if (!process_or_remote_id.empty()) {
+ throw std::runtime_error("ZombieCmd::create: expects one argument. path to task, i.e /path/to/task");
+ }
+ if (!password.empty()) {
+ throw std::runtime_error("ZombieCmd::create: expects one argument. path to task, i.e /path/to/task");
+ }
+ }
+
+ if (path.find('/') == std::string::npos) {
+ throw std::runtime_error("ZombieCmd::create: Not a valid path. Expects one argument. path to task, i.e /path/to/task");
+ }
+
cmd = Cmd_ptr(new ZombieCmd(user_action_, path, process_or_remote_id, password ));
}
diff --git a/Base/src/stc/DefsCmd.cpp b/Base/src/stc/DefsCmd.cpp
index fb81db7..702c1c4 100644
--- a/Base/src/stc/DefsCmd.cpp
+++ b/Base/src/stc/DefsCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #27 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -27,19 +27,21 @@ using namespace boost;
//=====================================================================================
// The defs command returns the full definition back to the client
-DefsCmd::DefsCmd(AbstractServer* as,bool save_edit_history)
+DefsCmd::DefsCmd(AbstractServer* as,bool migrate)
{
- init(as,save_edit_history);
+ init(as,migrate); // save edit history and children even if hidden
}
-void DefsCmd::init(AbstractServer* as,bool save_edit_history)
+void DefsCmd::init(AbstractServer* as,bool migrate)
{
+ migrate_ = migrate; // save edit history and children even if hidden
+
defs_ = as->defs();
/// Return the current value of the state change no. So the that
/// the next call to get the SSYncCmd , we need only return what's changed
defs_->set_state_change_no( Ecf::state_change_no() );
defs_->set_modify_change_no( Ecf::modify_change_no() );
- defs_->save_edit_history(save_edit_history);
+ defs_->save_edit_history(migrate);
}
bool DefsCmd::equals(ServerToClientCmd* rhs) const
diff --git a/Base/src/stc/DefsCmd.hpp b/Base/src/stc/DefsCmd.hpp
index 9a28534..53928d2 100644
--- a/Base/src/stc/DefsCmd.hpp
+++ b/Base/src/stc/DefsCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -16,6 +16,7 @@
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
#include "ServerToClientCmd.hpp"
+#include "MigrateContext.hpp"
class AbstractServer;
//================================================================================
@@ -24,10 +25,10 @@ class AbstractServer;
//================================================================================
class DefsCmd : public ServerToClientCmd {
public:
- DefsCmd(AbstractServer* as, bool save_edit_history = false);
- DefsCmd() {}
+ DefsCmd(AbstractServer* as, bool migrate = false);
+ DefsCmd(): migrate_(false) {}
- void init(AbstractServer* as, bool save_edit_history);
+ void init(AbstractServer* as, bool migrate);
defs_ptr defs() const { return defs_; }
@@ -37,13 +38,21 @@ public:
virtual bool equals(ServerToClientCmd*) const;
private:
+
defs_ptr defs_;
+ bool migrate_; // not persisted, save edit history and children even if hidden
friend class boost::serialization::access;
template<class Archive>
void serialize( Archive & ar, const unsigned int /*version*/ ) {
ar & boost::serialization::base_object< ServerToClientCmd >( *this );
- ar & defs_;
+ if (migrate_) {
+ ecf::MigrateContext migrate_context; // save edit history and children even if hidden
+ ar & defs_;
+ }
+ else {
+ ar & defs_;
+ }
}
};
diff --git a/Base/src/stc/ErrorCmd.cpp b/Base/src/stc/ErrorCmd.cpp
index bc93688..75740c1 100644
--- a/Base/src/stc/ErrorCmd.cpp
+++ b/Base/src/stc/ErrorCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #13 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/ErrorCmd.hpp b/Base/src/stc/ErrorCmd.hpp
index ea8ce1a..8e36c76 100644
--- a/Base/src/stc/ErrorCmd.hpp
+++ b/Base/src/stc/ErrorCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/GroupSTCCmd.cpp b/Base/src/stc/GroupSTCCmd.cpp
index 589f06d..0c1a05c 100644
--- a/Base/src/stc/GroupSTCCmd.cpp
+++ b/Base/src/stc/GroupSTCCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #18 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -64,12 +64,15 @@ bool GroupSTCCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr cts
defs_ptr defs = server_reply.client_defs();
node_ptr node = server_reply.client_node();
- if ( cts_cmd->get_cmd() && (defs.get() || node.get())) {
- if (debug) std::cout << " GroupSTCCmd::handle_server_response *get* was called\n";
+ if ( defs.get() || node.get() ) {
+ if (debug) std::cout << " GroupSTCCmd::handle_server_response *get* | *sync* | *sync_full* called\n";
/// client --group="get; show" # where get will call DefsCmd will return defs, from the server
/// client --group="get; show state" # where get will call DefsCmd will return defs, from the server
/// client --group="get /s1; show state" # where get will call DefsCmd will return defs, from the server
+ /// client --group="sync_full; show" # similar to get return defs, from the server
+ /// client --group="sync 1 0 0; show" # where sync will call SyncCmd will return defs, from the server
+ /// # will return those suites with handle 1
// Print out the data that was received from server. as a part of get request.
// The server can not do a show, it MUST be done at the Client side
diff --git a/Base/src/stc/GroupSTCCmd.hpp b/Base/src/stc/GroupSTCCmd.hpp
index 7ceb2b9..c8d12b1 100644
--- a/Base/src/stc/GroupSTCCmd.hpp
+++ b/Base/src/stc/GroupSTCCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/PreAllocatedReply.cpp b/Base/src/stc/PreAllocatedReply.cpp
index edff028..a801e37 100644
--- a/Base/src/stc/PreAllocatedReply.cpp
+++ b/Base/src/stc/PreAllocatedReply.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #24 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -71,10 +71,10 @@ STC_Cmd_ptr PreAllocatedReply::block_client_zombie_cmd()
return stc_cmd_;
}
-STC_Cmd_ptr PreAllocatedReply::defs_cmd(AbstractServer* as,bool save_edit_history)
+STC_Cmd_ptr PreAllocatedReply::defs_cmd(AbstractServer* as,bool migrate)
{
DefsCmd* cmd = dynamic_cast<DefsCmd*>(defs_cmd_.get());
- cmd->init(as,save_edit_history);
+ cmd->init(as,migrate); // save edit history and children even if hidden
return defs_cmd_;
}
diff --git a/Base/src/stc/PreAllocatedReply.hpp b/Base/src/stc/PreAllocatedReply.hpp
index b2df2c3..f6de3d4 100644
--- a/Base/src/stc/PreAllocatedReply.hpp
+++ b/Base/src/stc/PreAllocatedReply.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #22 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -32,7 +32,7 @@ public:
static STC_Cmd_ptr block_client_on_home_server_cmd();
static STC_Cmd_ptr block_client_zombie_cmd();
- static STC_Cmd_ptr defs_cmd(AbstractServer*, bool save_edit_history);
+ static STC_Cmd_ptr defs_cmd(AbstractServer*, bool migrate); // save edit history and children even if hidden
static STC_Cmd_ptr node_cmd(AbstractServer*,node_ptr);
static STC_Cmd_ptr stats_cmd(AbstractServer*);
static STC_Cmd_ptr suites_cmd(AbstractServer*);
diff --git a/Base/src/stc/SClientHandleCmd.cpp b/Base/src/stc/SClientHandleCmd.cpp
index 76a196c..8fe0274 100644
--- a/Base/src/stc/SClientHandleCmd.cpp
+++ b/Base/src/stc/SClientHandleCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SClientHandleCmd.hpp b/Base/src/stc/SClientHandleCmd.hpp
index 10ba403..992f937 100644
--- a/Base/src/stc/SClientHandleCmd.hpp
+++ b/Base/src/stc/SClientHandleCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SClientHandleSuitesCmd.cpp b/Base/src/stc/SClientHandleSuitesCmd.cpp
index 55c393e..7782626 100644
--- a/Base/src/stc/SClientHandleSuitesCmd.cpp
+++ b/Base/src/stc/SClientHandleSuitesCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #12 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SClientHandleSuitesCmd.hpp b/Base/src/stc/SClientHandleSuitesCmd.hpp
index c61a77d..af87e46 100644
--- a/Base/src/stc/SClientHandleSuitesCmd.hpp
+++ b/Base/src/stc/SClientHandleSuitesCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SNewsCmd.cpp b/Base/src/stc/SNewsCmd.cpp
index 1d04eb9..d875082 100644
--- a/Base/src/stc/SNewsCmd.cpp
+++ b/Base/src/stc/SNewsCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #31 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SNewsCmd.hpp b/Base/src/stc/SNewsCmd.hpp
index b60c5e7..a506f93 100644
--- a/Base/src/stc/SNewsCmd.hpp
+++ b/Base/src/stc/SNewsCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SNodeCmd.cpp b/Base/src/stc/SNodeCmd.cpp
index 6912bbc..4fef50b 100644
--- a/Base/src/stc/SNodeCmd.cpp
+++ b/Base/src/stc/SNodeCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SNodeCmd.hpp b/Base/src/stc/SNodeCmd.hpp
index b96a6f9..1be39a3 100644
--- a/Base/src/stc/SNodeCmd.hpp
+++ b/Base/src/stc/SNodeCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SServerLoadCmd.cpp b/Base/src/stc/SServerLoadCmd.cpp
index 41743a0..1a0da9d 100644
--- a/Base/src/stc/SServerLoadCmd.cpp
+++ b/Base/src/stc/SServerLoadCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SServerLoadCmd.hpp b/Base/src/stc/SServerLoadCmd.hpp
index b264211..afd8c62 100644
--- a/Base/src/stc/SServerLoadCmd.hpp
+++ b/Base/src/stc/SServerLoadCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SStatsCmd.cpp b/Base/src/stc/SStatsCmd.cpp
index 1664595..7f8bd46 100644
--- a/Base/src/stc/SStatsCmd.cpp
+++ b/Base/src/stc/SStatsCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SStatsCmd.hpp b/Base/src/stc/SStatsCmd.hpp
index 6818e9b..55c9ca8 100644
--- a/Base/src/stc/SStatsCmd.hpp
+++ b/Base/src/stc/SStatsCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SStringCmd.cpp b/Base/src/stc/SStringCmd.cpp
index 785bdc1..c5698b4 100644
--- a/Base/src/stc/SStringCmd.cpp
+++ b/Base/src/stc/SStringCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SStringCmd.hpp b/Base/src/stc/SStringCmd.hpp
index 852baa3..5d1b20c 100644
--- a/Base/src/stc/SStringCmd.hpp
+++ b/Base/src/stc/SStringCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SStringVecCmd.cpp b/Base/src/stc/SStringVecCmd.cpp
index 2471b11..6922629 100644
--- a/Base/src/stc/SStringVecCmd.cpp
+++ b/Base/src/stc/SStringVecCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SStringVecCmd.hpp b/Base/src/stc/SStringVecCmd.hpp
index b33963f..d989067 100644
--- a/Base/src/stc/SStringVecCmd.hpp
+++ b/Base/src/stc/SStringVecCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SSuitesCmd.cpp b/Base/src/stc/SSuitesCmd.cpp
index c12f8c7..839a3e6 100644
--- a/Base/src/stc/SSuitesCmd.cpp
+++ b/Base/src/stc/SSuitesCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #13 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SSuitesCmd.hpp b/Base/src/stc/SSuitesCmd.hpp
index edf72e2..7bfb2b7 100644
--- a/Base/src/stc/SSuitesCmd.hpp
+++ b/Base/src/stc/SSuitesCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SSyncCmd.cpp b/Base/src/stc/SSyncCmd.cpp
index 54df6af..56bd4da 100644
--- a/Base/src/stc/SSyncCmd.cpp
+++ b/Base/src/stc/SSyncCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #55 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/SSyncCmd.hpp b/Base/src/stc/SSyncCmd.hpp
index 8fe35c0..0e7bb62 100644
--- a/Base/src/stc/SSyncCmd.hpp
+++ b/Base/src/stc/SSyncCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #25 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -85,7 +85,6 @@ public:
// The constructor is *called* in the server.
// This will collate the incremental changes made so far relative to the client_state_change_no.
// For large scale change we use client_modify_change_no this will require a full update
- // *THIS* constructor is used for *TEST* only
SSyncCmd(unsigned int client_handle, // a reference to a set of suites used by client
unsigned int client_state_change_no,
unsigned int client_modify_change_no,
@@ -95,6 +94,7 @@ public:
virtual std::ostream& print(std::ostream& os) const;
virtual bool equals(ServerToClientCmd*) const;
+ virtual bool hasDefs() const { return true; }
// Client side functions:
virtual bool handle_server_response( ServerReply& server_reply, Cmd_ptr cts_cmd, bool debug ) const;
diff --git a/Base/src/stc/ServerToClientCmd.cpp b/Base/src/stc/ServerToClientCmd.cpp
index 9663700..5d9e40e 100644
--- a/Base/src/stc/ServerToClientCmd.cpp
+++ b/Base/src/stc/ServerToClientCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #16 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/ServerToClientCmd.hpp b/Base/src/stc/ServerToClientCmd.hpp
index 46fcce8..0c1badc 100644
--- a/Base/src/stc/ServerToClientCmd.hpp
+++ b/Base/src/stc/ServerToClientCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #19 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/StcCmd.cpp b/Base/src/stc/StcCmd.cpp
index 685b695..1e057f5 100644
--- a/Base/src/stc/StcCmd.cpp
+++ b/Base/src/stc/StcCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/StcCmd.hpp b/Base/src/stc/StcCmd.hpp
index 9e85bd9..5cbadff 100644
--- a/Base/src/stc/StcCmd.hpp
+++ b/Base/src/stc/StcCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/ZombieGetCmd.cpp b/Base/src/stc/ZombieGetCmd.cpp
index ec7f8be..b7ea867 100644
--- a/Base/src/stc/ZombieGetCmd.cpp
+++ b/Base/src/stc/ZombieGetCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/src/stc/ZombieGetCmd.hpp b/Base/src/stc/ZombieGetCmd.hpp
index 01fabee..427ebbf 100644
--- a/Base/src/stc/ZombieGetCmd.hpp
+++ b/Base/src/stc/ZombieGetCmd.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/MockServer.hpp b/Base/test/MockServer.hpp
index a6814d6..05cc63e 100644
--- a/Base/test/MockServer.hpp
+++ b/Base/test/MockServer.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #26 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/TestAlterCmd.cpp b/Base/test/TestAlterCmd.cpp
index b132319..d350c83 100644
--- a/Base/test/TestAlterCmd.cpp
+++ b/Base/test/TestAlterCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #48 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -20,6 +20,7 @@
#include "TestHelper.hpp"
#include "Str.hpp"
#include "System.hpp"
+#include "Ecf.hpp"
using namespace std;
using namespace ecf;
@@ -571,9 +572,9 @@ BOOST_AUTO_TEST_CASE( test_alter_cmd )
{ // test add limit
TestStateChanged changed(s);
- s->addLimit( Limit("limit",10) );
- s->addLimit( Limit("limit1",10) );
- s->addLimit( Limit("limit2",10) );
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_LIMIT,"limit","10")));
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_LIMIT,"limit1","10")));
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_LIMIT,"limit2","10")));
BOOST_CHECK_MESSAGE( s->limits().size() == 3, "expected 3 but found " << s->limits().size());
// test delete limit
@@ -603,6 +604,21 @@ BOOST_AUTO_TEST_CASE( test_alter_cmd )
BOOST_CHECK_MESSAGE( lm.get() && lm->paths().empty(), "Expected no paths but found " << lm->paths().size());
}
+ { // test add inlimit
+ TestStateChanged changed(s);
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"limit_name")));
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"limit_name1","11")));
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"/path/to/limit:limit_name2")));
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"/path/to/limit:limit_name3","10")));
+ BOOST_CHECK_MESSAGE( s->inlimits().size() == 4, "expected 4 but found " << s->inlimits().size());
+
+ // test delete limit
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_INLIMIT,"limit_name")));
+ BOOST_CHECK_MESSAGE( s->inlimits().size() == 3, "expected 3 but found " << s->inlimits().size());
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_INLIMIT)));
+ BOOST_CHECK_MESSAGE( s->inlimits().size() == 0, "expected 0 but found " << s->inlimits().size());
+ }
+
{ // test add repeat
TestStateChanged changed(s);
s->addRepeat( RepeatDate("YMD",20090916,20090930,1));
@@ -795,6 +811,101 @@ BOOST_AUTO_TEST_CASE( test_alter_cmd )
}
}
+
+void add_sortable_attributes(Node* node) {
+ node->add_variable("varz","-");
+ node->add_variable("vary","-");
+ node->add_variable("vara","-");
+ node->addEvent(Event("zevent"));
+ node->addEvent(Event("aevent"));
+ node->addEvent(Event(1));
+ node->addEvent(Event(2));
+ node->addMeter(Meter("zmeter",1,100));
+ node->addMeter(Meter("ameter",1,100));
+ node->addLabel(Label("zlabel","-"));
+ node->addLabel(Label("alabel","-"));
+ node->addLimit(Limit("zlimit",10));
+ node->addLimit(Limit("ylimit",10));
+ node->addLimit(Limit("xlimit",10));
+}
+void add_sorted_attributes(Node* node) {
+ node->add_variable("vara","-");
+ node->add_variable("vary","-");
+ node->add_variable("varz","-");
+ node->addEvent(Event(1));
+ node->addEvent(Event(2));
+ node->addEvent(Event("aevent"));
+ node->addEvent(Event("zevent"));
+ node->addMeter(Meter("ameter",1,100));
+ node->addMeter(Meter("zmeter",1,100));
+ node->addLabel(Label("alabel","-"));
+ node->addLabel(Label("zlabel","-"));
+ node->addLimit(Limit("xlimit",10));
+ node->addLimit(Limit("ylimit",10));
+ node->addLimit(Limit("zlimit",10));
+}
+
+BOOST_AUTO_TEST_CASE( test_alter_sort_attributes )
+{
+ cout << "Base:: ...test_alter_sort_attributes\n";
+
+ Defs defs;
+ defs.set_server().add_or_update_user_variables("z","z");
+ defs.set_server().add_or_update_user_variables("y","y");
+ defs.set_server().add_or_update_user_variables("x","x");
+ suite_ptr s = defs.add_suite("suite"); add_sortable_attributes(s.get());
+ family_ptr f1 = s->add_family("f1"); add_sortable_attributes(f1.get());
+ task_ptr t1 = f1->add_task("t1"); add_sortable_attributes(t1.get());
+
+ Defs sorted_defs;sorted_defs.flag().set(ecf::Flag::MESSAGE); // take into account alter
+ sorted_defs.set_server().add_or_update_user_variables("x","x");
+ sorted_defs.set_server().add_or_update_user_variables("y","y");
+ sorted_defs.set_server().add_or_update_user_variables("z","z");
+ suite_ptr ss = sorted_defs.add_suite("suite"); add_sorted_attributes(ss.get());
+ family_ptr sf1 = ss->add_family("f1"); add_sorted_attributes(sf1.get());
+ task_ptr st1 = sf1->add_task("t1"); add_sorted_attributes(st1.get());
+
+ {
+ TestDefsStateChanged chenged(&defs);
+ TestStateChanged changed(s);
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd("/","event","recursive")));
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd("/","meter","recursive")));
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd("/","label","recursive")));
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd("/","limit","recursive")));
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd("/","variable","recursive")));
+ Ecf::set_debug_equality(true);
+ BOOST_CHECK_MESSAGE(defs == sorted_defs,"Sort failed expected\n" << sorted_defs << "\nbut found\n" << defs);
+ Ecf::set_debug_equality(false);
+ }
+}
+
+BOOST_AUTO_TEST_CASE( test_alter_sort_attributes_for_task )
+{
+ cout << "Base:: ...test_alter_sort_attributes_for_task\n";
+
+ Defs defs;
+ suite_ptr s = defs.add_suite("suite"); add_sortable_attributes(s.get());
+ family_ptr f1 = s->add_family("f1"); add_sortable_attributes(f1.get());
+ task_ptr t1 = f1->add_task("t1"); add_sortable_attributes(t1.get());
+
+ Defs sorted_defs;//sorted_defs.flag().set(ecf::Flag::MESSAGE); // take into account alter
+ suite_ptr ss = sorted_defs.add_suite("suite"); add_sortable_attributes(ss.get());
+ family_ptr sf1 = ss->add_family("f1"); add_sortable_attributes(sf1.get());
+ task_ptr st1 = sf1->add_task("t1"); add_sorted_attributes(st1.get());
+ st1->flag().set(ecf::Flag::MESSAGE);
+ {
+ TestStateChanged changed(s);
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(t1->absNodePath(),"event","recursive")));
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(t1->absNodePath(),"meter","recursive")));
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(t1->absNodePath(),"label","recursive")));
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(t1->absNodePath(),"limit","recursive")));
+ TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(t1->absNodePath(),"variable","recursive")));
+ Ecf::set_debug_equality(true);
+ BOOST_CHECK_MESSAGE(defs == sorted_defs,"Sort failed expected\n" << sorted_defs << "\nbut found\n" << defs);
+ Ecf::set_debug_equality(false);
+ }
+}
+
BOOST_AUTO_TEST_CASE( test_alter_cmd_errors )
{
cout << "Base:: ...test_alter_cmd_errors\n";
@@ -818,6 +929,14 @@ BOOST_AUTO_TEST_CASE( test_alter_cmd_errors )
TestHelper::invokeFailureRequest(&defs,Cmd_ptr( new AlterCmd("/",AlterCmd::ADD_VARIABLE,"ECF_PID","a")));
TestHelper::invokeFailureRequest(&defs,Cmd_ptr( new AlterCmd("/",AlterCmd::ADD_VARIABLE,"ECF_VERSION","a")));
TestHelper::invokeFailureRequest(&defs,Cmd_ptr( new AlterCmd("/",AlterCmd::ADD_VARIABLE,"ECF_LISTS","a")));
+
+ TestHelper::invokeFailureRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_LIMIT,"limit"))); // no limit value
+ TestHelper::invokeFailureRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_LIMIT,"limit","xx"))); // value not convertible to integer
+ TestHelper::invokeFailureRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_LIMIT,".1","10"))); // not a valid name
+
+ TestHelper::invokeFailureRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,""))); // no inlimit value
+ TestHelper::invokeFailureRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"/limit"))); // limit path, but no name
+ TestHelper::invokeFailureRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"/path/tolimit:limit","xx"))); // tokens must be convertible to an integer
}
/// Destroy singleton's to avoid valgrind from complaining
diff --git a/Base/test/TestClientHandleCmd.cpp b/Base/test/TestClientHandleCmd.cpp
index faffdc2..9325c25 100644
--- a/Base/test/TestClientHandleCmd.cpp
+++ b/Base/test/TestClientHandleCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #12 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/TestCmd.cpp b/Base/test/TestCmd.cpp
index 1108cea..8781a83 100644
--- a/Base/test/TestCmd.cpp
+++ b/Base/test/TestCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #23 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/TestDeleteNodeCmd.cpp b/Base/test/TestDeleteNodeCmd.cpp
index 59fc5fb..dc79f64 100644
--- a/Base/test/TestDeleteNodeCmd.cpp
+++ b/Base/test/TestDeleteNodeCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #16 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/TestECFLOW-189.cpp b/Base/test/TestECFLOW-189.cpp
index ef2650c..496c28a 100644
--- a/Base/test/TestECFLOW-189.cpp
+++ b/Base/test/TestECFLOW-189.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #23 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/TestForceCmd.cpp b/Base/test/TestForceCmd.cpp
index 661df05..f58dd7b 100644
--- a/Base/test/TestForceCmd.cpp
+++ b/Base/test/TestForceCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #23 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -63,6 +63,7 @@ BOOST_AUTO_TEST_CASE( test_force_cmd )
BOOST_CHECK_MESSAGE(!s1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be NOT set");
+ the_defs->requeue();
TestHelper::invokeRequest(the_defs.get(),Cmd_ptr( new ForceCmd(s1->absNodePath(),"complete",true /*recursive */, false /* set Repeat to last value */)));
TestHelper::test_state(s1,NState::COMPLETE);
TestHelper::test_state(f1,NState::COMPLETE);
@@ -411,8 +412,10 @@ BOOST_AUTO_TEST_CASE( test_force_interactive_next_time_slot )
BOOST_CHECK_MESSAGE( !t1->timeVec().back().time_series().is_valid(),"Expected 10:00 time slot to have expired");
BOOST_CHECK_MESSAGE( t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be set");
- // call again should, should be do difference
- TestHelper::invokeRequest(&the_defs,Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)));
+ // call again should, should be do difference, EXPECT no change, if its complete, seting complete, avoids another state change
+ TestHelper::invokeRequest(&the_defs,
+ Cmd_ptr( new ForceCmd(t1->absNodePath(),"complete",false /*recursive */, false /* set Repeat to last value */)),
+ false/*dont Check change numbers*/);
TestHelper::test_state(t1,NState::COMPLETE);
BOOST_CHECK_MESSAGE( !t1->timeVec().back().time_series().is_valid(),"Expected 10:00 time slot to have expired");
BOOST_CHECK_MESSAGE( t1->get_flag().is_set(ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP),"Expected ecf::Flag::NO_REQUE_IF_SINGLE_TIME_DEP to be set");
diff --git a/Base/test/TestFreeDepCmd.cpp b/Base/test/TestFreeDepCmd.cpp
index c29b1f3..7201638 100644
--- a/Base/test/TestFreeDepCmd.cpp
+++ b/Base/test/TestFreeDepCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #22 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/TestHelper.hpp b/Base/test/TestHelper.hpp
index 1061cdd..d332a84 100644
--- a/Base/test/TestHelper.hpp
+++ b/Base/test/TestHelper.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #33 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/TestJobGenPerf.cpp b/Base/test/TestJobGenPerf.cpp
index bd7aaa1..32b0ead 100644
--- a/Base/test/TestJobGenPerf.cpp
+++ b/Base/test/TestJobGenPerf.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -38,6 +38,19 @@ namespace fs = boost::filesystem;
//
// The defs is in /var/tmp/ma0/ECFLOW_TEST/TestJobGenPerf
//
+// Timing for /var/tmp/ma0/DEFS/metabuilder.def
+// First/base point: real:10.15 user: 5.58 sys: 1.62
+// After ECFLOW-846: real: 4.46 user: 3.72 sys: 0.74 # Only open/close include file once
+// After ECFLOW-864: real: 4.36 user: 3.68 sys: 0.68 # minimise stat calls
+//
+// strace -c ./Base/bin/gcc-4.8/release/perf_job_gen ./metabuilder.def
+//
+// % time seconds usecs/call calls errors syscall
+// ------ ----------- ----------- --------- --------- ----------------
+// Before ECFLOW-864: 22.77 0.001159 0 132329 50737 stat
+// After ECFLOW-864: 21.35 0.001097 0 125644 50737 stat
+//
+
int main(int argc, char* argv[])
{
if (argc != 2) {
diff --git a/Base/test/TestJobGenPerf.log b/Base/test/TestJobGenPerf.log
new file mode 100644
index 0000000..81dd049
--- /dev/null
+++ b/Base/test/TestJobGenPerf.log
@@ -0,0 +1,7435 @@
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/regenerate job_size:15769
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support
+LOG:[12:55:57 13.4.2017] submitted: /
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxop_dev/gnu.53/var_summary job_size:16065
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxop_dev/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxop_dev
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxop_dev/gnu.53/git_srcs job_size:16303
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxop_dev/gnu.53/make_build_dir job_size:14620
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxop_dev/gnu.53/config job_size:16453
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxop_dev/gnu.53/build job_size:14706
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxop_dev/gnu.53/test job_size:15536
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxop_dev/gnu.53/add_write_perm job_size:15260
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxop_dev/gnu.53/install job_size:15606
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxop_dev/gnu.53/install_log job_size:18867
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxop_dev/gnu.53/remove_write_perm job_size:15300
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxop_dev/gnu.53/module_sync job_size:14247
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxop_dev/gnu.53/wipe_build job_size:15853
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.49/var_summary job_size:36799
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.49/git_srcs job_size:37014
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.49/make_build_dir job_size:35437
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.49/config job_size:37021
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.49/build job_size:35317
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.49/test job_size:36125
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.49/add_write_perm job_size:36081
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.49/install job_size:36275
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.49/install_log job_size:39735
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.49/remove_write_perm job_size:36187
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.49/module_sync job_size:34987
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.49/wipe_build job_size:36579
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.53/var_summary job_size:36799
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.53/git_srcs job_size:37014
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.53/make_build_dir job_size:35437
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.53/config job_size:37021
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.53/build job_size:35317
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.53/test job_size:36125
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.53/add_write_perm job_size:36081
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.53/install job_size:36275
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.53/install_log job_size:39735
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.53/remove_write_perm job_size:36187
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.53/module_sync job_size:34987
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/gnu.53/wipe_build job_size:36579
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/intel.16/var_summary job_size:36870
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/intel.16
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/intel.16/git_srcs job_size:37115
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/intel.16/make_build_dir job_size:35512
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/intel.16/config job_size:37098
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/intel.16/build job_size:35384
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/intel.16/test job_size:36192
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/intel.16/add_write_perm job_size:36148
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/intel.16/install job_size:36344
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/intel.16/install_log job_size:39808
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/intel.16/remove_write_perm job_size:36254
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/intel.16/module_sync job_size:35052
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/intel.16/wipe_build job_size:36650
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.846/var_summary job_size:36779
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.846
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.846/git_srcs job_size:37024
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.846/make_build_dir job_size:35421
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.846/config job_size:37006
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.846/build job_size:35293
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.846/test job_size:36101
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.846/add_write_perm job_size:36057
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.846/install job_size:36253
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.846/install_log job_size:39717
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.846/remove_write_perm job_size:36163
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.846/module_sync job_size:34961
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.846/wipe_build job_size:36559
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.85/var_summary job_size:36748
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.85
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.85/git_srcs job_size:36978
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.85/make_build_dir job_size:35388
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.85/config job_size:36973
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.85/build job_size:35264
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.85/test job_size:36072
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.85/add_write_perm job_size:36028
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.85/install job_size:36223
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.85/install_log job_size:39685
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.85/remove_write_perm job_size:36134
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.85/module_sync job_size:34933
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cct/cray.85/wipe_build job_size:36528
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxc/gnu/var_summary job_size:15954
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxc/gnu
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxc
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxc/gnu/git_srcs job_size:15964
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxc/gnu/make_build_dir job_size:14463
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxc/gnu/config job_size:16234
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxc/gnu/build job_size:14605
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxc/gnu/test job_size:15435
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxc/gnu/add_write_perm job_size:15199
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxc/gnu/install job_size:15531
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxc/gnu/install_log job_size:19182
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxc/gnu/remove_write_perm job_size:15239
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxc/gnu/module_sync job_size:14159
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/lxc/gnu/wipe_build job_size:15722
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.49/var_summary job_size:36799
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.49/git_srcs job_size:37014
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.49/make_build_dir job_size:35437
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.49/config job_size:37021
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.49/build job_size:35317
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.49/test job_size:36125
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.49/add_write_perm job_size:36081
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.49/install job_size:36275
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.49/install_log job_size:39735
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.49/remove_write_perm job_size:36187
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.49/module_sync job_size:34987
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.49/wipe_build job_size:36579
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.53/var_summary job_size:36799
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.53/git_srcs job_size:37014
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.53/make_build_dir job_size:35437
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.53/config job_size:37021
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.53/build job_size:35317
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.53/test job_size:36125
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.53/add_write_perm job_size:36081
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.53/install job_size:36275
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.53/install_log job_size:39735
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.53/remove_write_perm job_size:36187
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.53/module_sync job_size:34987
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/gnu.53/wipe_build job_size:36579
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/intel.16/var_summary job_size:36846
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/intel.16
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/intel.16/git_srcs job_size:37091
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/intel.16/make_build_dir job_size:35488
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/intel.16/config job_size:37074
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/intel.16/build job_size:35360
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/intel.16/test job_size:36168
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/intel.16/add_write_perm job_size:36124
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/intel.16/install job_size:36320
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/intel.16/install_log job_size:39784
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/intel.16/remove_write_perm job_size:36230
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/intel.16/module_sync job_size:35028
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/intel.16/wipe_build job_size:36626
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.846/var_summary job_size:36779
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.846
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.846/git_srcs job_size:37024
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.846/make_build_dir job_size:35421
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.846/config job_size:37006
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.846/build job_size:35293
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.846/test job_size:36101
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.846/add_write_perm job_size:36057
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.846/install job_size:36253
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.846/install_log job_size:39717
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.846/remove_write_perm job_size:36163
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.846/module_sync job_size:34961
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.846/wipe_build job_size:36559
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.85/var_summary job_size:36748
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.85
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.85/git_srcs job_size:36978
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.85/make_build_dir job_size:35388
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.85/config job_size:36973
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.85/build job_size:35264
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.85/test job_size:36072
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.85/add_write_perm job_size:36028
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.85/install job_size:36223
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.85/install_log job_size:39685
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.85/remove_write_perm job_size:36134
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.85/module_sync job_size:34933
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/cca/cray.85/wipe_build job_size:36528
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.49/var_summary job_size:36799
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.49/git_srcs job_size:37014
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.49/make_build_dir job_size:35437
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.49/config job_size:37021
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.49/build job_size:35317
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.49/test job_size:36125
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.49/add_write_perm job_size:36081
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.49/install job_size:36275
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.49/install_log job_size:39735
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.49/remove_write_perm job_size:36187
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.49/module_sync job_size:34987
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.49/wipe_build job_size:36579
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.53/var_summary job_size:36799
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.53/git_srcs job_size:37014
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.53/make_build_dir job_size:35437
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.53/config job_size:37021
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.53/build job_size:35317
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.53/test job_size:36125
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.53/add_write_perm job_size:36081
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.53/install job_size:36275
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.53/install_log job_size:39735
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.53/remove_write_perm job_size:36187
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.53/module_sync job_size:34987
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/gnu.53/wipe_build job_size:36579
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/intel.16/var_summary job_size:36846
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/intel.16
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/intel.16/git_srcs job_size:37091
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/intel.16/make_build_dir job_size:35488
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/intel.16/config job_size:37074
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/intel.16/build job_size:35360
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/intel.16/test job_size:36168
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/intel.16/add_write_perm job_size:36124
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/intel.16/install job_size:36320
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/intel.16/install_log job_size:39784
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/intel.16/remove_write_perm job_size:36230
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/intel.16/module_sync job_size:35028
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/intel.16/wipe_build job_size:36626
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.846/var_summary job_size:36779
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.846
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.846/git_srcs job_size:37024
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.846/make_build_dir job_size:35421
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.846/config job_size:37006
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.846/build job_size:35293
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.846/test job_size:36101
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.846/add_write_perm job_size:36057
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.846/install job_size:36253
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.846/install_log job_size:39717
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.846/remove_write_perm job_size:36163
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.846/module_sync job_size:34961
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.846/wipe_build job_size:36559
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.85/var_summary job_size:36748
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.85
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.85/git_srcs job_size:36978
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.85/make_build_dir job_size:35388
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.85/config job_size:36973
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.85/build job_size:35264
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.85/test job_size:36072
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.85/add_write_perm job_size:36028
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.85/install job_size:36223
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.85/install_log job_size:39685
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.85/remove_write_perm job_size:36134
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.85/module_sync job_size:34933
+LOG:[12:55:57 13.4.2017] submitted: /ifs_support/ccb/cray.85/wipe_build job_size:36528
+WAR:[12:55:57 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:57 13.4.2017] submitted: /Magics/regenerate job_size:15448
+LOG:[12:55:57 13.4.2017] submitted: /Magics
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxop_dev/var_summary job_size:15733
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxop_dev
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxop_dev/git_srcs job_size:15643
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxop_dev/make_build_dir job_size:14284
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxop_dev/config job_size:15276
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxop_dev/build job_size:14414
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxop_dev/test job_size:15244
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxop_dev/add_write_perm job_size:14937
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxop_dev/install job_size:15054
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxop_dev/install_link job_size:14831
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxop_dev/install_log job_size:18438
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxop_dev/remove_write_perm job_size:14976
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxop_dev/module_sync job_size:13961
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxop_dev/wipe_build job_size:15538
+LOG:[12:55:57 13.4.2017] submitted: /Magics/ecgb/var_summary job_size:15664
+LOG:[12:55:57 13.4.2017] submitted: /Magics/ecgb
+LOG:[12:55:57 13.4.2017] submitted: /Magics/ecgb/git_srcs job_size:15460
+LOG:[12:55:57 13.4.2017] submitted: /Magics/ecgb/make_build_dir job_size:14192
+LOG:[12:55:57 13.4.2017] submitted: /Magics/ecgb/config job_size:15189
+LOG:[12:55:57 13.4.2017] submitted: /Magics/ecgb/build job_size:14350
+LOG:[12:55:57 13.4.2017] submitted: /Magics/ecgb/test job_size:15180
+LOG:[12:55:57 13.4.2017] submitted: /Magics/ecgb/add_write_perm job_size:14873
+LOG:[12:55:57 13.4.2017] submitted: /Magics/ecgb/install job_size:14983
+LOG:[12:55:57 13.4.2017] submitted: /Magics/ecgb/install_link job_size:14767
+LOG:[12:55:57 13.4.2017] submitted: /Magics/ecgb/install_log job_size:18362
+LOG:[12:55:57 13.4.2017] submitted: /Magics/ecgb/remove_write_perm job_size:14912
+LOG:[12:55:57 13.4.2017] submitted: /Magics/ecgb/module_sync job_size:13904
+LOG:[12:55:57 13.4.2017] submitted: /Magics/ecgb/wipe_build job_size:15455
+LOG:[12:55:57 13.4.2017] submitted: /Magics/opensuse131/var_summary job_size:15735
+LOG:[12:55:57 13.4.2017] submitted: /Magics/opensuse131
+LOG:[12:55:57 13.4.2017] submitted: /Magics/opensuse131/git_srcs job_size:15564
+LOG:[12:55:57 13.4.2017] submitted: /Magics/opensuse131/make_build_dir job_size:14257
+LOG:[12:55:57 13.4.2017] submitted: /Magics/opensuse131/config job_size:15246
+LOG:[12:55:57 13.4.2017] submitted: /Magics/opensuse131/build job_size:14403
+LOG:[12:55:57 13.4.2017] submitted: /Magics/opensuse131/test job_size:15233
+LOG:[12:55:57 13.4.2017] submitted: /Magics/opensuse131/add_write_perm job_size:14926
+LOG:[12:55:57 13.4.2017] submitted: /Magics/opensuse131/install job_size:15039
+LOG:[12:55:57 13.4.2017] submitted: /Magics/opensuse131/install_link job_size:14820
+LOG:[12:55:57 13.4.2017] submitted: /Magics/opensuse131/install_log job_size:18436
+LOG:[12:55:57 13.4.2017] submitted: /Magics/opensuse131/remove_write_perm job_size:14965
+LOG:[12:55:57 13.4.2017] submitted: /Magics/opensuse131/module_sync job_size:13961
+LOG:[12:55:57 13.4.2017] submitted: /Magics/opensuse131/wipe_build job_size:15518
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxc/var_summary job_size:15650
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxc
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxc/git_srcs job_size:15377
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxc/make_build_dir job_size:14161
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxc/config job_size:15165
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxc/build job_size:14335
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxc/test job_size:15165
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxc/add_write_perm job_size:14858
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxc/install job_size:14964
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxc/install_link job_size:14752
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxc/install_log job_size:18344
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxc/remove_write_perm job_size:14897
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxc/module_sync job_size:13892
+LOG:[12:55:57 13.4.2017] submitted: /Magics/lxc/wipe_build job_size:15435
+LOG:[12:55:57 13.4.2017] submitted: /Magics/leap42/var_summary job_size:15680
+LOG:[12:55:57 13.4.2017] submitted: /Magics/leap42
+LOG:[12:55:57 13.4.2017] submitted: /Magics/leap42/git_srcs job_size:15434
+LOG:[12:55:57 13.4.2017] submitted: /Magics/leap42/make_build_dir job_size:14192
+LOG:[12:55:57 13.4.2017] submitted: /Magics/leap42/config job_size:15191
+LOG:[12:55:57 13.4.2017] submitted: /Magics/leap42/build job_size:14358
+LOG:[12:55:57 13.4.2017] submitted: /Magics/leap42/test job_size:15188
+LOG:[12:55:57 13.4.2017] submitted: /Magics/leap42/add_write_perm job_size:14881
+LOG:[12:55:57 13.4.2017] submitted: /Magics/leap42/install job_size:14989
+LOG:[12:55:57 13.4.2017] submitted: /Magics/leap42/install_link job_size:14775
+LOG:[12:55:57 13.4.2017] submitted: /Magics/leap42/install_log job_size:18376
+LOG:[12:55:57 13.4.2017] submitted: /Magics/leap42/remove_write_perm job_size:14920
+LOG:[12:55:57 13.4.2017] submitted: /Magics/leap42/module_sync job_size:13916
+LOG:[12:55:57 13.4.2017] submitted: /Magics/leap42/wipe_build job_size:15463
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/regenerate job_size:15573
+LOG:[12:55:57 13.4.2017] submitted: /mars_client
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxop_dev/var_summary job_size:15679
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxop_dev
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxop_dev/git_srcs job_size:15763
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxop_dev/make_build_dir job_size:14225
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxop_dev/config job_size:15235
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxop_dev/build job_size:14335
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxop_dev/install job_size:14981
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxop_dev/tests/archive job_size:15697
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxop_dev/tests
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxop_dev/tests/bad_archive job_size:16366
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxop_dev/tests/environment job_size:16301
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxop_dev/install_log job_size:18415
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxop_dev/remove_write_perm job_size:14899
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxop_dev/wipe_build job_size:15469
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cck/var_summary job_size:36142
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cck
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cck/git_srcs job_size:36203
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cck/make_build_dir job_size:34771
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cck/config job_size:35583
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cck/build job_size:34675
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cck/install job_size:35367
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cck/tests/archive job_size:36185
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cck/tests
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cck/tests/bad_archive job_size:36942
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cck/tests/environment job_size:36877
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cck/install_log job_size:38880
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cck/remove_write_perm job_size:35503
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cck/wipe_build job_size:35924
+WAR:[12:55:57 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cct/var_summary job_size:36220
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cct
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cct/git_srcs job_size:36281
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cct/make_build_dir job_size:34849
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cct/config job_size:35676
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cct/build job_size:34753
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cct/install job_size:35445
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cct/tests/archive job_size:36263
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cct/tests
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cct/tests/bad_archive job_size:37020
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cct/tests/environment job_size:36955
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cct/install_log job_size:38958
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cct/remove_write_perm job_size:35581
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cct/wipe_build job_size:36002
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ecgb/var_summary job_size:15618
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ecgb
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ecgb/git_srcs job_size:15588
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ecgb/make_build_dir job_size:14141
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ecgb/config job_size:15063
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ecgb/build job_size:14279
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ecgb/install job_size:14918
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ecgb/tests/archive job_size:15641
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ecgb/tests
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ecgb/tests/bad_archive job_size:16310
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ecgb/tests/environment job_size:16245
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ecgb/install_log job_size:18347
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ecgb/remove_write_perm job_size:14843
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ecgb/wipe_build job_size:15394
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxg/var_summary job_size:15577
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxg
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxg/git_srcs job_size:15478
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxg/make_build_dir job_size:14083
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxg/config job_size:15009
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxg/build job_size:14237
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxg/install job_size:14872
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxg/tests/archive job_size:15599
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxg/tests
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxg/tests/bad_archive job_size:16268
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxg/tests/environment job_size:16203
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxg/install_log job_size:18302
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxg/remove_write_perm job_size:14801
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxg/wipe_build job_size:15347
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/opensuse131/var_summary job_size:15663
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/opensuse131
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/opensuse131/git_srcs job_size:15666
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/opensuse131/make_build_dir job_size:14180
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/opensuse131/config job_size:15099
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/opensuse131/build job_size:14306
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/opensuse131/install job_size:14948
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/opensuse131/tests/archive job_size:15668
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/opensuse131/tests
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/opensuse131/tests/bad_archive job_size:16337
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/opensuse131/tests/environment job_size:16272
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/opensuse131/install_log job_size:18395
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/opensuse131/remove_write_perm job_size:14870
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/opensuse131/wipe_build job_size:15431
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxc/var_summary job_size:15598
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxc
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxc/git_srcs job_size:15499
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxc/make_build_dir job_size:14104
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxc/config job_size:15100
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxc/build job_size:14258
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxc/install job_size:14893
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxc/tests/archive job_size:15620
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxc/tests
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxc/tests/bad_archive job_size:16289
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxc/tests/environment job_size:16224
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxc/install_log job_size:18323
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxc/remove_write_perm job_size:14822
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/lxc/wipe_build job_size:15368
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/leap42/var_summary job_size:15608
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/leap42
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/leap42/git_srcs job_size:15536
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/leap42/make_build_dir job_size:14115
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/leap42/config job_size:15039
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/leap42/build job_size:14261
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/leap42/install job_size:14898
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/leap42/tests/archive job_size:15623
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/leap42/tests
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/leap42/tests/bad_archive job_size:16292
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/leap42/tests/environment job_size:16227
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/leap42/install_log job_size:18335
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/leap42/remove_write_perm job_size:14825
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/leap42/wipe_build job_size:15376
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cca/var_summary job_size:36220
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cca
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cca/git_srcs job_size:36281
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cca/make_build_dir job_size:34849
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cca/config job_size:35676
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cca/build job_size:34753
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cca/install job_size:35445
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cca/tests/archive job_size:36263
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cca/tests
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cca/tests/bad_archive job_size:37020
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cca/tests/environment job_size:36955
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cca/install_log job_size:38958
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cca/remove_write_perm job_size:35581
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/cca/wipe_build job_size:36002
+WAR:[12:55:57 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ccb/var_summary job_size:36220
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ccb
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ccb/git_srcs job_size:36281
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ccb/make_build_dir job_size:34849
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ccb/config job_size:35676
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ccb/build job_size:34753
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ccb/install job_size:35445
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ccb/tests/archive job_size:36263
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ccb/tests
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ccb/tests/bad_archive job_size:37020
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ccb/tests/environment job_size:36955
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ccb/install_log job_size:38958
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ccb/remove_write_perm job_size:35581
+LOG:[12:55:57 13.4.2017] submitted: /mars_client/ccb/wipe_build job_size:36002
+LOG:[12:55:57 13.4.2017] submitted: /mir/regenerate job_size:15491
+LOG:[12:55:57 13.4.2017] submitted: /mir
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.53/var_summary job_size:36075
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.53/git_srcs job_size:36002
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.53/make_build_dir job_size:34721
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.53/config job_size:35521
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.53/build job_size:34633
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.53/test job_size:35441
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.53/test_memcheck job_size:27321
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.53/wipe_build job_size:35871
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.62/var_summary job_size:36075
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.62
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.62/git_srcs job_size:36002
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.62/make_build_dir job_size:34721
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.62/config job_size:35521
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.62/build job_size:34633
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.62/test job_size:35441
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.62/test_memcheck job_size:27321
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/gnu.62/wipe_build job_size:35871
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/intel.17/var_summary job_size:36109
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/intel.17
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/intel.17/git_srcs job_size:36066
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/intel.17/make_build_dir job_size:34759
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/intel.17/config job_size:35557
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/intel.17/build job_size:34663
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/intel.17/test job_size:35471
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/intel.17/test_memcheck job_size:27341
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/intel.17/wipe_build job_size:35905
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/cray.85/var_summary job_size:36042
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/cray.85
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/cray.85/git_srcs job_size:35984
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/cray.85/make_build_dir job_size:34690
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/cray.85/config job_size:35489
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/cray.85/build job_size:34598
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/cray.85/test job_size:35406
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/cray.85/test_memcheck job_size:27281
+LOG:[12:55:57 13.4.2017] submitted: /mir/cck/cray.85/wipe_build job_size:35838
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.49/var_summary job_size:36071
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.49/git_srcs job_size:35998
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.49/make_build_dir job_size:34717
+WAR:[12:55:57 13.4.2017] EcfFile::doCreateJobFile: Too many files open(errno=EMFILE), include file cache size(44) Clearing cache. Check limits with ulimit -Sn
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.49/config job_size:35517
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.49/build job_size:34629
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.49/test job_size:35437
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.49/test_memcheck job_size:27317
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.49/wipe_build job_size:35867
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.53/var_summary job_size:36071
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.53/git_srcs job_size:35998
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.53/make_build_dir job_size:34717
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.53/config job_size:35517
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.53/build job_size:34629
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.53/test job_size:35437
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.53/test_memcheck job_size:27317
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/gnu.53/wipe_build job_size:35867
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/intel.16/var_summary job_size:36136
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/intel.16
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/intel.16/git_srcs job_size:36093
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/intel.16/make_build_dir job_size:34786
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/intel.16/config job_size:35584
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/intel.16/build job_size:34690
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/intel.16/test job_size:35498
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/intel.16/test_memcheck job_size:27368
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/intel.16/wipe_build job_size:35932
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.84/var_summary job_size:36038
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.84
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.84/git_srcs job_size:35980
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.84/make_build_dir job_size:34686
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.84/config job_size:35485
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.84/build job_size:34594
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.84/test job_size:35402
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.84/test_memcheck job_size:27277
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.84/wipe_build job_size:35834
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.85/var_summary job_size:36038
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.85
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.85/git_srcs job_size:35980
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.85/make_build_dir job_size:34686
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.85/config job_size:35485
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.85/build job_size:34594
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.85/test job_size:35402
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.85/test_memcheck job_size:27277
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.85/wipe_build job_size:35834
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.846/var_summary job_size:36066
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.846
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.846/git_srcs job_size:36023
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.846/make_build_dir job_size:34716
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.846/config job_size:35514
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.846/build job_size:34620
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.846/test job_size:35428
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.846/test_memcheck job_size:27298
+LOG:[12:55:57 13.4.2017] submitted: /mir/cct/cray.846/wipe_build job_size:35862
+LOG:[12:55:57 13.4.2017] submitted: /mir/ecgb/gnu.53/var_summary job_size:15605
+LOG:[12:55:57 13.4.2017] submitted: /mir/ecgb/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /mir/ecgb
+LOG:[12:55:57 13.4.2017] submitted: /mir/ecgb/gnu.53/git_srcs job_size:15441
+LOG:[12:55:57 13.4.2017] submitted: /mir/ecgb/gnu.53/make_build_dir job_size:14145
+LOG:[12:55:57 13.4.2017] submitted: /mir/ecgb/gnu.53/config job_size:15083
+LOG:[12:55:57 13.4.2017] submitted: /mir/ecgb/gnu.53/build job_size:14291
+LOG:[12:55:57 13.4.2017] submitted: /mir/ecgb/gnu.53/test job_size:15121
+LOG:[12:55:57 13.4.2017] submitted: /mir/ecgb/gnu.53/test_memcheck job_size:12837
+LOG:[12:55:57 13.4.2017] submitted: /mir/ecgb/gnu.53/wipe_build job_size:15403
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/gnu.53/var_summary job_size:15630
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/gnu.53/git_srcs job_size:15397
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/gnu.53/make_build_dir job_size:14153
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/gnu.53/config job_size:15165
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/gnu.53/build job_size:14315
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/gnu.53/test job_size:15145
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/gnu.53/test_memcheck job_size:12863
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/gnu.53/wipe_build job_size:15422
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/intel.16/var_summary job_size:15690
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/intel.16
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/intel.16/git_srcs job_size:15487
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/intel.16/make_build_dir job_size:14217
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/intel.16/config job_size:15227
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/intel.16/build job_size:14371
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/intel.16/test job_size:15201
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/intel.16/test_memcheck job_size:12915
+LOG:[12:55:57 13.4.2017] submitted: /mir/lxg/intel.16/wipe_build job_size:15482
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.53/var_summary job_size:15619
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.53/git_srcs job_size:15413
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.53/make_build_dir job_size:14143
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.53/config job_size:15083
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.53/build job_size:14297
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.53/test job_size:15127
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.53/test_memcheck job_size:12839
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.53/wipe_build job_size:15409
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.61/var_summary job_size:15643
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.61
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.61/git_srcs job_size:15437
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.61/make_build_dir job_size:14167
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.61/config job_size:15107
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.61/build job_size:14321
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.61/test job_size:15151
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.61/test_memcheck job_size:12863
+LOG:[12:55:57 13.4.2017] submitted: /mir/leap42/gnu.61/wipe_build job_size:15433
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.49/var_summary job_size:36071
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.49/git_srcs job_size:35998
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.49/make_build_dir job_size:34717
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.49/config job_size:35517
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.49/build job_size:34629
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.49/test job_size:35437
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.49/test_memcheck job_size:27317
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.49/wipe_build job_size:35867
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.53/var_summary job_size:36071
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.53/git_srcs job_size:35998
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.53/make_build_dir job_size:34717
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.53/config job_size:35517
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.53/build job_size:34629
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.53/test job_size:35437
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.53/test_memcheck job_size:27317
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/gnu.53/wipe_build job_size:35867
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/intel.16/var_summary job_size:36112
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/intel.16
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/intel.16/git_srcs job_size:36069
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/intel.16/make_build_dir job_size:34762
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/intel.16/config job_size:35560
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/intel.16/build job_size:34666
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/intel.16/test job_size:35474
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/intel.16/test_memcheck job_size:27344
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/intel.16/wipe_build job_size:35908
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.84/var_summary job_size:36038
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.84
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.84/git_srcs job_size:35980
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.84/make_build_dir job_size:34686
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.84/config job_size:35485
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.84/build job_size:34594
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.84/test job_size:35402
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.84/test_memcheck job_size:27277
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.84/wipe_build job_size:35834
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.846/var_summary job_size:36066
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.846
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.846/git_srcs job_size:36023
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.846/make_build_dir job_size:34716
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.846/config job_size:35514
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.846/build job_size:34620
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.846/test job_size:35428
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.846/test_memcheck job_size:27298
+LOG:[12:55:57 13.4.2017] submitted: /mir/ccb/cray.846/wipe_build job_size:35862
+WAR:[12:55:57 13.4.2017] EcfFile::doCreateJobFile: Too many files open(errno=EMFILE), include file cache size(44) Clearing cache. Check limits with ulimit -Sn
+LOG:[12:55:57 13.4.2017] submitted: /pgen/regenerate job_size:15440
+LOG:[12:55:57 13.4.2017] submitted: /pgen
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cca/gnu.49/var_summary job_size:36036
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cca/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cca
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cca/gnu.49/git_srcs job_size:35991
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cca/gnu.49/make_build_dir job_size:34681
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cca/gnu.49/config job_size:35471
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cca/gnu.49/build job_size:34589
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cca/gnu.49/install job_size:35282
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cca/gnu.49/install_log job_size:38861
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cca/gnu.49/remove_write_perm job_size:35417
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cca/gnu.49/module_sync job_size:34259
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cca/gnu.49/wipe_build job_size:35830
+LOG:[12:55:57 13.4.2017] submitted: /pgen/ccb/gnu.49/var_summary job_size:36036
+LOG:[12:55:57 13.4.2017] submitted: /pgen/ccb/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /pgen/ccb
+LOG:[12:55:57 13.4.2017] submitted: /pgen/ccb/gnu.49/git_srcs job_size:35991
+LOG:[12:55:57 13.4.2017] submitted: /pgen/ccb/gnu.49/make_build_dir job_size:34681
+LOG:[12:55:57 13.4.2017] submitted: /pgen/ccb/gnu.49/config job_size:35471
+LOG:[12:55:57 13.4.2017] submitted: /pgen/ccb/gnu.49/build job_size:34589
+LOG:[12:55:57 13.4.2017] submitted: /pgen/ccb/gnu.49/install job_size:35282
+LOG:[12:55:57 13.4.2017] submitted: /pgen/ccb/gnu.49/install_log job_size:38861
+LOG:[12:55:57 13.4.2017] submitted: /pgen/ccb/gnu.49/remove_write_perm job_size:35417
+LOG:[12:55:57 13.4.2017] submitted: /pgen/ccb/gnu.49/module_sync job_size:34259
+LOG:[12:55:57 13.4.2017] submitted: /pgen/ccb/gnu.49/wipe_build job_size:35830
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cct/gnu.49/var_summary job_size:36036
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cct/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cct
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cct/gnu.49/git_srcs job_size:35991
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cct/gnu.49/make_build_dir job_size:34681
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cct/gnu.49/config job_size:35471
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cct/gnu.49/build job_size:34589
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cct/gnu.49/install job_size:35282
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cct/gnu.49/install_log job_size:38861
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cct/gnu.49/remove_write_perm job_size:35417
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cct/gnu.49/module_sync job_size:34259
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cct/gnu.49/wipe_build job_size:35830
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cck/gnu.49/var_summary job_size:35911
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cck/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cck
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cck/gnu.49/git_srcs job_size:35866
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cck/gnu.49/make_build_dir job_size:34556
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cck/gnu.49/config job_size:35346
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cck/gnu.49/build job_size:34464
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cck/gnu.49/install job_size:35157
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cck/gnu.49/install_log job_size:38736
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cck/gnu.49/remove_write_perm job_size:35292
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cck/gnu.49/module_sync job_size:34134
+LOG:[12:55:57 13.4.2017] submitted: /pgen/cck/gnu.49/wipe_build job_size:35705
+WAR:[12:55:57 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/regenerate job_size:15353
+LOG:[12:55:57 13.4.2017] submitted: /prodgen
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cck/gnu.53/var_summary job_size:36201
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cck/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cck
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cck/gnu.53/git_srcs job_size:36219
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cck/gnu.53/make_build_dir job_size:34843
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cck/gnu.53/config job_size:35618
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cck/gnu.53/build job_size:34739
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cck/gnu.53/test job_size:35525
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cck/gnu.53/install job_size:35437
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cck/gnu.53/install_log job_size:39008
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cck/gnu.53/remove_write_perm job_size:35569
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cck/gnu.53/module_sync job_size:34409
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cck/gnu.53/wipe_build job_size:35989
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/gnu.49/var_summary job_size:36196
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/gnu.49/git_srcs job_size:36214
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/gnu.49/make_build_dir job_size:34838
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/gnu.49/config job_size:35613
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/gnu.49/build job_size:34734
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/gnu.49/test job_size:35520
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/gnu.49/install job_size:35432
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/gnu.49/install_log job_size:39003
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/gnu.49/remove_write_perm job_size:35564
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/gnu.49/module_sync job_size:34404
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/gnu.49/wipe_build job_size:35984
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.84/var_summary job_size:36163
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.84
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.84/git_srcs job_size:36196
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.84/make_build_dir job_size:34807
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.84/config job_size:35822
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.84/build job_size:34699
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.84/test job_size:35485
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.84/install job_size:35398
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.84/install_log job_size:38971
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.84/remove_write_perm job_size:35529
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.84/module_sync job_size:34368
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.84/wipe_build job_size:35951
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.841/var_summary job_size:36191
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.841
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.841/git_srcs job_size:36239
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.841/make_build_dir job_size:34837
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.841/config job_size:35850
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.841/build job_size:34725
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.841/test job_size:35511
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.841/install job_size:35425
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.841/install_log job_size:39000
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.841/remove_write_perm job_size:35555
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.841/module_sync job_size:34393
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cct/cray.841/wipe_build job_size:35979
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/opensuse131/gnu.48/var_summary job_size:15524
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/opensuse131/gnu.48
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/opensuse131
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/opensuse131/gnu.48/git_srcs job_size:15484
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/opensuse131/gnu.48/make_build_dir job_size:14054
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/opensuse131/gnu.48/config job_size:15013
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/opensuse131/gnu.48/build job_size:14172
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/opensuse131/gnu.48/test job_size:14980
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/opensuse131/gnu.48/install job_size:14820
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/opensuse131/gnu.48/install_log job_size:18325
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/opensuse131/gnu.48/remove_write_perm job_size:14738
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/opensuse131/gnu.48/module_sync job_size:13724
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/opensuse131/gnu.48/wipe_build job_size:15302
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/leap42/gnu.53/var_summary job_size:15496
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/leap42/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/leap42
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/leap42/gnu.53/git_srcs job_size:15381
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/leap42/gnu.53/make_build_dir job_size:14016
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/leap42/gnu.53/config job_size:14985
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/leap42/gnu.53/build job_size:14154
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/leap42/gnu.53/test job_size:14962
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/leap42/gnu.53/install job_size:14797
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/leap42/gnu.53/install_log job_size:18292
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/leap42/gnu.53/remove_write_perm job_size:14720
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/leap42/gnu.53/module_sync job_size:13706
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/leap42/gnu.53/wipe_build job_size:15274
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/gnu.49/var_summary job_size:36196
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/gnu.49/git_srcs job_size:36214
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/gnu.49/make_build_dir job_size:34838
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/gnu.49/config job_size:35823
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/gnu.49/build job_size:34734
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/gnu.49/test job_size:35520
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/gnu.49/install job_size:35432
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/gnu.49/install_log job_size:39003
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/gnu.49/remove_write_perm job_size:35564
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/gnu.49/module_sync job_size:34404
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/gnu.49/wipe_build job_size:35984
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.84/var_summary job_size:36163
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.84
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.84/git_srcs job_size:36196
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.84/make_build_dir job_size:34807
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.84/config job_size:35822
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.84/build job_size:34699
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.84/test job_size:35485
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.84/install job_size:35398
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.84/install_log job_size:38971
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.84/remove_write_perm job_size:35529
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.84/module_sync job_size:34368
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.84/wipe_build job_size:35951
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.841/var_summary job_size:36191
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.841
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.841/git_srcs job_size:36239
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.841/make_build_dir job_size:34837
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.841/config job_size:35850
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.841/build job_size:34725
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.841/test job_size:35511
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.841/install job_size:35425
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.841/install_log job_size:39000
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.841/remove_write_perm job_size:35555
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.841/module_sync job_size:34393
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/cca/cray.841/wipe_build job_size:35979
+WAR:[12:55:57 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/gnu.49/var_summary job_size:36196
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/gnu.49/git_srcs job_size:36214
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/gnu.49/make_build_dir job_size:34838
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/gnu.49/config job_size:35613
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/gnu.49/build job_size:34734
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/gnu.49/test job_size:35520
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/gnu.49/install job_size:35432
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/gnu.49/install_log job_size:39003
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/gnu.49/remove_write_perm job_size:35564
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/gnu.49/module_sync job_size:34404
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/gnu.49/wipe_build job_size:35984
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.84/var_summary job_size:36163
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.84
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.84/git_srcs job_size:36196
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.84/make_build_dir job_size:34807
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.84/config job_size:35822
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.84/build job_size:34699
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.84/test job_size:35485
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.84/install job_size:35398
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.84/install_log job_size:38971
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.84/remove_write_perm job_size:35529
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.84/module_sync job_size:34368
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.84/wipe_build job_size:35951
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.841/var_summary job_size:36191
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.841
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.841/git_srcs job_size:36239
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.841/make_build_dir job_size:34837
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.841/config job_size:35850
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.841/build job_size:34725
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.841/test job_size:35511
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.841/install job_size:35425
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.841/install_log job_size:39000
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.841/remove_write_perm job_size:35555
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.841/module_sync job_size:34393
+LOG:[12:55:57 13.4.2017] submitted: /prodgen/ccb/cray.841/wipe_build job_size:35979
+LOG:[12:55:57 13.4.2017] submitted: /metview/regenerate job_size:15353
+LOG:[12:55:57 13.4.2017] submitted: /metview
+LOG:[12:55:57 13.4.2017] submitted: /metview/localhost/var_summary job_size:15690
+LOG:[12:55:57 13.4.2017] submitted: /metview/localhost
+LOG:[12:55:57 13.4.2017] submitted: /metview/localhost/git_srcs job_size:15547
+LOG:[12:55:57 13.4.2017] submitted: /metview/localhost/git_update_repos job_size:17625
+LOG:[12:55:57 13.4.2017] submitted: /metview/localhost/make_build_dir job_size:14205
+LOG:[12:55:57 13.4.2017] submitted: /metview/localhost/config job_size:15952
+LOG:[12:55:57 13.4.2017] submitted: /metview/localhost/build job_size:14351
+LOG:[12:55:57 13.4.2017] submitted: /metview/localhost/test job_size:15181
+LOG:[12:55:57 13.4.2017] submitted: /metview/localhost/set_write_permissions job_size:15321
+LOG:[12:55:57 13.4.2017] submitted: /metview/localhost/install job_size:15014
+LOG:[12:55:57 13.4.2017] submitted: /metview/localhost/install_test job_size:14930
+LOG:[12:55:57 13.4.2017] submitted: /metview/localhost/install_log job_size:18630
+LOG:[12:55:57 13.4.2017] submitted: /metview/localhost/remove_write_perm job_size:14940
+LOG:[12:55:57 13.4.2017] submitted: /metview/localhost/module_sync job_size:13905
+LOG:[12:55:57 13.4.2017] submitted: /metview/localhost/wipe_build job_size:15473
+LOG:[12:55:57 13.4.2017] submitted: /metkit/regenerate job_size:15334
+LOG:[12:55:57 13.4.2017] submitted: /metkit
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.49/var_summary job_size:15492
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.49/git_srcs job_size:15488
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.49/make_build_dir job_size:14052
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.49/config job_size:14917
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.49/build job_size:14158
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.49/test job_size:14988
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.49/add_write_perm job_size:14715
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.49/install job_size:14839
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.49/install_log job_size:18647
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.49/remove_write_perm job_size:14754
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.49/wipe_build job_size:15295
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.53/var_summary job_size:15516
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.53/git_srcs job_size:15512
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.53/make_build_dir job_size:14076
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.53/config job_size:14941
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.53/build job_size:14182
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.53/test job_size:15012
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.53/add_write_perm job_size:14739
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.53/install job_size:14863
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.53/install_log job_size:18671
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.53/remove_write_perm job_size:14778
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxop_dev/gnu.53/wipe_build job_size:15319
+WAR:[12:55:57 13.4.2017] EcfFile::doCreateJobFile: Too many files open(errno=EMFILE), include file cache size(44) Clearing cache. Check limits with ulimit -Sn
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.53/var_summary job_size:36014
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.53/git_srcs job_size:35987
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.53/make_build_dir job_size:34657
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.53/config job_size:35364
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.53/build job_size:34557
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.53/test job_size:35365
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.53/add_write_perm job_size:35284
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.53/install job_size:35256
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.53/install_log job_size:38863
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.53/remove_write_perm job_size:35389
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.53/wipe_build job_size:35804
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.62/var_summary job_size:36014
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.62
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.62/git_srcs job_size:35987
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.62/make_build_dir job_size:34657
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.62/config job_size:35364
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.62/build job_size:34557
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.62/test job_size:35365
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.62/add_write_perm job_size:35284
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.62/install job_size:35256
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.62/install_log job_size:38863
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.62/remove_write_perm job_size:35389
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/gnu.62/wipe_build job_size:35804
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/intel.17/var_summary job_size:36048
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/intel.17
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/intel.17/git_srcs job_size:36051
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/intel.17/make_build_dir job_size:34695
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/intel.17/config job_size:35398
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/intel.17/build job_size:34587
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/intel.17/test job_size:35395
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/intel.17/add_write_perm job_size:35314
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/intel.17/install job_size:35288
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/intel.17/install_log job_size:38899
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/intel.17/remove_write_perm job_size:35419
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/intel.17/wipe_build job_size:35838
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/cray.85/var_summary job_size:35981
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/cray.85
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/cray.85/git_srcs job_size:35969
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/cray.85/make_build_dir job_size:34626
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/cray.85/config job_size:35331
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/cray.85/build job_size:34522
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/cray.85/test job_size:35330
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/cray.85/add_write_perm job_size:35249
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/cray.85/install job_size:35222
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/cray.85/install_log job_size:38831
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/cray.85/remove_write_perm job_size:35354
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cck/cray.85/wipe_build job_size:35771
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.49/var_summary job_size:36010
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.49/git_srcs job_size:35983
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.49/make_build_dir job_size:34653
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.49/config job_size:35360
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.49/build job_size:34553
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.49/test job_size:35361
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.49/add_write_perm job_size:35280
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.49/install job_size:35252
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.49/install_log job_size:38859
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.49/remove_write_perm job_size:35385
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.49/wipe_build job_size:35800
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.53/var_summary job_size:36010
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.53/git_srcs job_size:35983
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.53/make_build_dir job_size:34653
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.53/config job_size:35360
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.53/build job_size:34553
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.53/test job_size:35361
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.53/add_write_perm job_size:35280
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.53/install job_size:35252
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.53/install_log job_size:38859
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.53/remove_write_perm job_size:35385
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/gnu.53/wipe_build job_size:35800
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.14/var_summary job_size:36075
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.14
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.14/git_srcs job_size:36078
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.14/make_build_dir job_size:34722
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.14/config job_size:35425
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.14/build job_size:34614
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.14/test job_size:35422
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.14/add_write_perm job_size:35341
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.14/install job_size:35315
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.14/install_log job_size:38926
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.14/remove_write_perm job_size:35446
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.14/wipe_build job_size:35865
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.15/var_summary job_size:36075
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.15
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.15/git_srcs job_size:36078
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.15/make_build_dir job_size:34722
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.15/config job_size:35425
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.15/build job_size:34614
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.15/test job_size:35422
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.15/add_write_perm job_size:35341
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.15/install job_size:35315
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.15/install_log job_size:38926
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.15/remove_write_perm job_size:35446
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.15/wipe_build job_size:35865
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.16/var_summary job_size:36075
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.16
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.16/git_srcs job_size:36078
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.16/make_build_dir job_size:34722
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.16/config job_size:35425
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.16/build job_size:34614
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.16/test job_size:35422
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.16/add_write_perm job_size:35341
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.16/install job_size:35315
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.16/install_log job_size:38926
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.16/remove_write_perm job_size:35446
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/intel.16/wipe_build job_size:35865
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.84/var_summary job_size:35977
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.84
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.84/git_srcs job_size:35965
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.84/make_build_dir job_size:34622
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.84/config job_size:35327
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.84/build job_size:34518
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.84/test job_size:35326
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.84/add_write_perm job_size:35245
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.84/install job_size:35218
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.84/install_log job_size:38827
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.84/remove_write_perm job_size:35350
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.84/wipe_build job_size:35767
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.85/var_summary job_size:35977
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.85
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.85/git_srcs job_size:35965
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.85/make_build_dir job_size:34622
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.85/config job_size:35327
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.85/build job_size:34518
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.85/test job_size:35326
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.85/add_write_perm job_size:35245
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.85/install job_size:35218
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.85/install_log job_size:38827
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.85/remove_write_perm job_size:35350
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.85/wipe_build job_size:35767
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.846/var_summary job_size:36005
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.846
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.846/git_srcs job_size:36008
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.846/make_build_dir job_size:34652
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.846/config job_size:35355
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.846/build job_size:34544
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.846/test job_size:35352
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.846/add_write_perm job_size:35271
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.846/install job_size:35245
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.846/install_log job_size:38856
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.846/remove_write_perm job_size:35376
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cct/cray.846/wipe_build job_size:35795
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappa/var_summary job_size:15389
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappa
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappa/git_srcs job_size:15127
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappa/make_build_dir job_size:13899
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappa/config job_size:14730
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappa/build job_size:14069
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappa/test job_size:14899
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappa/add_write_perm job_size:14585
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappa/install job_size:14693
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappa/install_log job_size:18077
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappa/remove_write_perm job_size:14624
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappa/wipe_build job_size:15179
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.44/var_summary job_size:15451
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.44
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.44/git_srcs job_size:15333
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.44/make_build_dir job_size:13988
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.44/config job_size:14842
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.44/build job_size:14122
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.44/test job_size:14952
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.44/add_write_perm job_size:14679
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.44/install job_size:14796
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.44/install_log job_size:18599
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.44/remove_write_perm job_size:14718
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.44/wipe_build job_size:15240
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.53/var_summary job_size:15427
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.53/git_srcs job_size:15309
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.53/make_build_dir job_size:13964
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.53/config job_size:14818
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.53/build job_size:14098
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.53/test job_size:14928
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.53/add_write_perm job_size:14655
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.53/install job_size:14772
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.53/install_log job_size:18575
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.53/remove_write_perm job_size:14694
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ecgb/gnu.53/wipe_build job_size:15216
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/gnu.53/var_summary job_size:15413
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/gnu.53/git_srcs job_size:15226
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/gnu.53/make_build_dir job_size:13933
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/gnu.53/config job_size:14795
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/gnu.53/build job_size:14083
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/gnu.53/test job_size:14913
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/gnu.53/add_write_perm job_size:14640
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/gnu.53/install job_size:14753
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/gnu.53/install_log job_size:18557
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/gnu.53/remove_write_perm job_size:14679
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/gnu.53/wipe_build job_size:15196
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/intel.16/var_summary job_size:15473
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/intel.16
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/intel.16/git_srcs job_size:15316
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/intel.16/make_build_dir job_size:13997
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/intel.16/config job_size:14855
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/intel.16/build job_size:14139
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/intel.16/test job_size:14969
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/intel.16/add_write_perm job_size:14696
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/intel.16/install job_size:14811
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/intel.16/install_log job_size:18619
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/intel.16/remove_write_perm job_size:14735
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/intel.16/wipe_build job_size:15256
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/pgi.16/var_summary job_size:15451
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/pgi.16
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/pgi.16/git_srcs job_size:15264
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/pgi.16/make_build_dir job_size:13971
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/pgi.16/config job_size:14833
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/pgi.16/build job_size:14121
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/pgi.16/test job_size:14951
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/pgi.16/add_write_perm job_size:14678
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/pgi.16/install job_size:14791
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/pgi.16/install_log job_size:18595
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/pgi.16/remove_write_perm job_size:14717
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxg/pgi.16/wipe_build job_size:15234
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.48/var_summary job_size:15518
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.48
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.48/git_srcs job_size:15433
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.48/make_build_dir job_size:14049
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.48/config job_size:14897
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.48/build job_size:14171
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.48/test job_size:15001
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.48/add_write_perm job_size:14728
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.48/install job_size:14848
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.48/install_log job_size:18669
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.48/remove_write_perm job_size:14767
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.48/wipe_build job_size:15299
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.53/var_summary job_size:15542
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.53/git_srcs job_size:15457
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.53/make_build_dir job_size:14073
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.53/config job_size:14921
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.53/build job_size:14195
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.53/test job_size:15025
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.53/add_write_perm job_size:14752
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.53/install job_size:14872
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.53/install_log job_size:18693
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.53/remove_write_perm job_size:14791
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.53/wipe_build job_size:15323
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.61/var_summary job_size:15542
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.61
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.61/git_srcs job_size:15457
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.61/make_build_dir job_size:14073
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.61/config job_size:14921
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.61/build job_size:14195
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.61/test job_size:15025
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.61/add_write_perm job_size:14752
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.61/install job_size:14872
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.61/install_log job_size:18693
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.61/remove_write_perm job_size:14791
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/gnu.61/wipe_build job_size:15323
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/pgi/var_summary job_size:15526
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/pgi
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/pgi/git_srcs job_size:15396
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/pgi/make_build_dir job_size:14051
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/pgi/config job_size:14905
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/pgi/build job_size:14185
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/pgi/test job_size:15015
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/pgi/add_write_perm job_size:14742
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/pgi/install job_size:14859
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/pgi/install_log job_size:18674
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/pgi/remove_write_perm job_size:14781
+LOG:[12:55:57 13.4.2017] submitted: /metkit/opensuse131/pgi/wipe_build job_size:15307
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.49/var_summary job_size:15414
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.49/git_srcs job_size:15227
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.49/make_build_dir job_size:13934
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.49/config job_size:14796
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.49/build job_size:14084
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.49/test job_size:14914
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.49/add_write_perm job_size:14641
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.49/install job_size:14754
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.49/install_log job_size:18558
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.49/remove_write_perm job_size:14680
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.49/wipe_build job_size:15197
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.53/var_summary job_size:15438
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.53/git_srcs job_size:15251
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.53/make_build_dir job_size:13958
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.53/config job_size:14820
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.53/build job_size:14108
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.53/test job_size:14938
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.53/add_write_perm job_size:14665
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.53/install job_size:14778
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.53/install_log job_size:18582
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.53/remove_write_perm job_size:14704
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/gnu.53/wipe_build job_size:15221
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/pgi/var_summary job_size:15422
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/pgi
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/pgi/git_srcs job_size:15190
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/pgi/make_build_dir job_size:13936
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/pgi/config job_size:14804
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/pgi/build job_size:14098
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/pgi/test job_size:14928
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/pgi/add_write_perm job_size:14655
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/pgi/install job_size:14765
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/pgi/install_log job_size:18563
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/pgi/remove_write_perm job_size:14694
+LOG:[12:55:57 13.4.2017] submitted: /metkit/lxc/pgi/wipe_build job_size:15205
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.53/var_summary job_size:15468
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.53/git_srcs job_size:15308
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.53/make_build_dir job_size:13989
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.53/config job_size:14847
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.53/build job_size:14131
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.53/test job_size:14961
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.53/add_write_perm job_size:14688
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.53/install job_size:14803
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.53/install_log job_size:18614
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.53/remove_write_perm job_size:14727
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.53/wipe_build job_size:15249
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.61/var_summary job_size:15492
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.61
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.61/git_srcs job_size:15332
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.61/make_build_dir job_size:14013
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.61/config job_size:14871
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.61/build job_size:14155
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.61/test job_size:14985
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.61/add_write_perm job_size:14712
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.61/install job_size:14827
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.61/install_log job_size:18638
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.61/remove_write_perm job_size:14751
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/gnu.61/wipe_build job_size:15273
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/pgi/var_summary job_size:15476
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/pgi
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/pgi/git_srcs job_size:15271
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/pgi/make_build_dir job_size:13991
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/pgi/config job_size:14855
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/pgi/build job_size:14145
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/pgi/test job_size:14975
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/pgi/add_write_perm job_size:14702
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/pgi/install job_size:14814
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/pgi/install_log job_size:18619
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/pgi/remove_write_perm job_size:14741
+LOG:[12:55:57 13.4.2017] submitted: /metkit/leap42/pgi/wipe_build job_size:15257
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappb/var_summary job_size:15389
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappb
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappb/git_srcs job_size:15127
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappb/make_build_dir job_size:13899
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappb/config job_size:14730
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappb/build job_size:14069
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappb/test job_size:14899
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappb/add_write_perm job_size:14585
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappb/install job_size:14693
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappb/install_log job_size:18077
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappb/remove_write_perm job_size:14624
+LOG:[12:55:57 13.4.2017] submitted: /metkit/sappb/wipe_build job_size:15179
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.49/var_summary job_size:36010
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.49/git_srcs job_size:35983
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.49/make_build_dir job_size:34653
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.49/config job_size:35360
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.49/build job_size:34553
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.49/test job_size:35361
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.49/add_write_perm job_size:35280
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.49/install job_size:35252
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.49/install_log job_size:38859
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.49/remove_write_perm job_size:35385
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.49/wipe_build job_size:35800
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.53/var_summary job_size:36010
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.53/git_srcs job_size:35983
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.53/make_build_dir job_size:34653
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.53/config job_size:35360
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.53/build job_size:34553
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.53/test job_size:35361
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.53/add_write_perm job_size:35280
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.53/install job_size:35252
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.53/install_log job_size:38859
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.53/remove_write_perm job_size:35385
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/gnu.53/wipe_build job_size:35800
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.14/var_summary job_size:36075
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.14
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.14/git_srcs job_size:36078
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.14/make_build_dir job_size:34722
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.14/config job_size:35425
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.14/build job_size:34614
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.14/test job_size:35422
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.14/add_write_perm job_size:35341
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.14/install job_size:35315
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.14/install_log job_size:38926
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.14/remove_write_perm job_size:35446
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.14/wipe_build job_size:35865
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.15/var_summary job_size:36075
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.15
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.15/git_srcs job_size:36078
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.15/make_build_dir job_size:34722
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.15/config job_size:35425
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.15/build job_size:34614
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.15/test job_size:35422
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.15/add_write_perm job_size:35341
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.15/install job_size:35315
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.15/install_log job_size:38926
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.15/remove_write_perm job_size:35446
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.15/wipe_build job_size:35865
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.16/var_summary job_size:36051
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.16
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.16/git_srcs job_size:36054
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.16/make_build_dir job_size:34698
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.16/config job_size:35401
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.16/build job_size:34590
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.16/test job_size:35398
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.16/add_write_perm job_size:35317
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.16/install job_size:35291
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.16/install_log job_size:38902
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.16/remove_write_perm job_size:35422
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/intel.16/wipe_build job_size:35841
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.84/var_summary job_size:35977
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.84
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.84/git_srcs job_size:35965
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.84/make_build_dir job_size:34622
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.84/config job_size:35327
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.84/build job_size:34518
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.84/test job_size:35326
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.84/add_write_perm job_size:35245
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.84/install job_size:35218
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.84/install_log job_size:38827
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.84/remove_write_perm job_size:35350
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.84/wipe_build job_size:35767
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.846/var_summary job_size:36005
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.846
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.846/git_srcs job_size:36008
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.846/make_build_dir job_size:34652
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.846/config job_size:35355
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.846/build job_size:34544
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.846/test job_size:35352
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.846/add_write_perm job_size:35271
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.846/install job_size:35245
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.846/install_log job_size:38856
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.846/remove_write_perm job_size:35376
+LOG:[12:55:57 13.4.2017] submitted: /metkit/cca/cray.846/wipe_build job_size:35795
+WAR:[12:55:57 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.49/var_summary job_size:36010
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.49/git_srcs job_size:35983
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.49/make_build_dir job_size:34653
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.49/config job_size:35360
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.49/build job_size:34553
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.49/test job_size:35361
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.49/add_write_perm job_size:35280
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.49/install job_size:35252
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.49/install_log job_size:38859
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.49/remove_write_perm job_size:35385
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.49/wipe_build job_size:35800
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.53/var_summary job_size:36010
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.53/git_srcs job_size:35983
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.53/make_build_dir job_size:34653
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.53/config job_size:35360
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.53/build job_size:34553
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.53/test job_size:35361
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.53/add_write_perm job_size:35280
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.53/install job_size:35252
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.53/install_log job_size:38859
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.53/remove_write_perm job_size:35385
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/gnu.53/wipe_build job_size:35800
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.14/var_summary job_size:36075
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.14
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.14/git_srcs job_size:36078
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.14/make_build_dir job_size:34722
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.14/config job_size:35425
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.14/build job_size:34614
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.14/test job_size:35422
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.14/add_write_perm job_size:35341
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.14/install job_size:35315
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.14/install_log job_size:38926
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.14/remove_write_perm job_size:35446
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.14/wipe_build job_size:35865
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.15/var_summary job_size:36075
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.15
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.15/git_srcs job_size:36078
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.15/make_build_dir job_size:34722
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.15/config job_size:35425
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.15/build job_size:34614
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.15/test job_size:35422
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.15/add_write_perm job_size:35341
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.15/install job_size:35315
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.15/install_log job_size:38926
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.15/remove_write_perm job_size:35446
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.15/wipe_build job_size:35865
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.16/var_summary job_size:36051
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.16
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.16/git_srcs job_size:36054
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.16/make_build_dir job_size:34698
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.16/config job_size:35401
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.16/build job_size:34590
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.16/test job_size:35398
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.16/add_write_perm job_size:35317
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.16/install job_size:35291
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.16/install_log job_size:38902
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.16/remove_write_perm job_size:35422
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/intel.16/wipe_build job_size:35841
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.84/var_summary job_size:35977
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.84
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.84/git_srcs job_size:35965
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.84/make_build_dir job_size:34622
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.84/config job_size:35327
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.84/build job_size:34518
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.84/test job_size:35326
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.84/add_write_perm job_size:35245
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.84/install job_size:35218
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.84/install_log job_size:38827
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.84/remove_write_perm job_size:35350
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.84/wipe_build job_size:35767
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.846/var_summary job_size:36005
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.846
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.846/git_srcs job_size:36008
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.846/make_build_dir job_size:34652
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.846/config job_size:35355
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.846/build job_size:34544
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.846/test job_size:35352
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.846/add_write_perm job_size:35271
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.846/install job_size:35245
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.846/install_log job_size:38856
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.846/remove_write_perm job_size:35376
+LOG:[12:55:57 13.4.2017] submitted: /metkit/ccb/cray.846/wipe_build job_size:35795
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/regenerate job_size:15351
+LOG:[12:55:57 13.4.2017] submitted: /eccodes
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.49/var_summary job_size:15522
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.49/git_srcs job_size:15544
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.49/make_build_dir job_size:14081
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.49/config job_size:15049
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.49/build job_size:14183
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.49/test job_size:15013
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.49/install job_size:14863
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.49/post_install job_size:14892
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.49/install_check job_size:16184
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.49/install_log job_size:18685
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.49/remove_write_perm job_size:14777
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.49/module_sync job_size:13724
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.49/wipe_build job_size:15322
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.53/var_summary job_size:15546
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.53/git_srcs job_size:15568
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.53/make_build_dir job_size:14105
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.53/config job_size:15073
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.53/build job_size:14207
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.53/test job_size:15037
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.53/install job_size:14887
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.53/post_install job_size:14916
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.53/install_check job_size:16208
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.53/install_log job_size:18709
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.53/remove_write_perm job_size:14801
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.53/module_sync job_size:13748
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxop_dev/gnu.53/wipe_build job_size:15346
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.53/var_summary job_size:36036
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.53/git_srcs job_size:36035
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.53/make_build_dir job_size:34678
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.53/config job_size:35488
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.53/build job_size:34574
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.53/test job_size:35382
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.53/install job_size:35272
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.53/post_install job_size:35406
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.53/install_check job_size:36725
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.53/install_log job_size:38893
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.53/remove_write_perm job_size:35404
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.53/module_sync job_size:34244
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.53/wipe_build job_size:35824
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.62/var_summary job_size:36036
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.62
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.62/git_srcs job_size:36035
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.62/make_build_dir job_size:34678
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.62/config job_size:35488
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.62/build job_size:34574
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.62/test job_size:35382
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.62/install job_size:35272
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.62/post_install job_size:35406
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.62/install_check job_size:36725
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.62/install_log job_size:38893
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.62/remove_write_perm job_size:35404
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.62/module_sync job_size:34244
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/gnu.62/wipe_build job_size:35824
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/intel.17/var_summary job_size:36070
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/intel.17
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/intel.17/git_srcs job_size:36099
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/intel.17/make_build_dir job_size:34716
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/intel.17/config job_size:35522
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/intel.17/build job_size:34604
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/intel.17/test job_size:35412
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/intel.17/install job_size:35304
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/intel.17/post_install job_size:35436
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/intel.17/install_check job_size:36757
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/intel.17/install_log job_size:38929
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/intel.17/remove_write_perm job_size:35434
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/intel.17/module_sync job_size:34272
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/intel.17/wipe_build job_size:35858
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/cray.85/var_summary job_size:36003
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/cray.85
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/cray.85/git_srcs job_size:36017
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/cray.85/make_build_dir job_size:34647
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/cray.85/config job_size:35455
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/cray.85/build job_size:34539
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/cray.85/test job_size:35347
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/cray.85/install job_size:35238
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/cray.85/post_install job_size:35371
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/cray.85/install_check job_size:36691
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/cray.85/install_log job_size:38861
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/cray.85/remove_write_perm job_size:35369
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/cray.85/module_sync job_size:34208
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cck/cray.85/wipe_build job_size:35791
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.49/var_summary job_size:36079
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.49/git_srcs job_size:36078
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.49/make_build_dir job_size:34721
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.49/config job_size:35550
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.49/build job_size:34617
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.49/test job_size:35425
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.49/install job_size:35315
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.49/post_install job_size:35449
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.49/install_check job_size:36768
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.49/install_log job_size:38936
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.49/remove_write_perm job_size:35447
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.49/module_sync job_size:34287
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.49/wipe_build job_size:35867
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.53/var_summary job_size:36079
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.53/git_srcs job_size:36078
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.53/make_build_dir job_size:34721
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.53/config job_size:35550
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.53/build job_size:34617
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.53/test job_size:35425
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.53/install job_size:35315
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.53/post_install job_size:35449
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.53/install_check job_size:36768
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.53/install_log job_size:38936
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.53/remove_write_perm job_size:35447
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.53/module_sync job_size:34287
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/gnu.53/wipe_build job_size:35867
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.14/var_summary job_size:36144
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.14
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.14/git_srcs job_size:36173
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.14/make_build_dir job_size:34790
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.14/config job_size:35635
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.14/build job_size:34678
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.14/test job_size:35486
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.14/install job_size:35378
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.14/post_install job_size:35510
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.14/install_check job_size:36831
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.14/install_log job_size:39003
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.14/remove_write_perm job_size:35508
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.14/module_sync job_size:34346
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.14/wipe_build job_size:35932
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.15/var_summary job_size:36144
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.15
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.15/git_srcs job_size:36173
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.15/make_build_dir job_size:34790
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.15/config job_size:35635
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.15/build job_size:34678
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.15/test job_size:35486
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.15/install job_size:35378
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.15/post_install job_size:35510
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.15/install_check job_size:36831
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.15/install_log job_size:39003
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.15/remove_write_perm job_size:35508
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.15/module_sync job_size:34346
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.15/wipe_build job_size:35932
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.16/var_summary job_size:36144
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.16
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.16/git_srcs job_size:36173
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.16/make_build_dir job_size:34790
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.16/config job_size:35635
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.16/build job_size:34678
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.16/test job_size:35486
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.16/install job_size:35378
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.16/post_install job_size:35510
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.16/install_check job_size:36831
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.16/install_log job_size:39003
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.16/remove_write_perm job_size:35508
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.16/module_sync job_size:34346
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/intel.16/wipe_build job_size:35932
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.84/var_summary job_size:36046
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.84
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.84/git_srcs job_size:36060
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.84/make_build_dir job_size:34690
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.84/config job_size:35602
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.84/build job_size:34582
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.84/test job_size:35390
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.84/install job_size:35281
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.84/post_install job_size:35414
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.84/install_check job_size:36734
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.84/install_log job_size:38904
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.84/remove_write_perm job_size:35412
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.84/module_sync job_size:34251
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.84/wipe_build job_size:35834
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.85/var_summary job_size:36046
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.85
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.85/git_srcs job_size:36060
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.85/make_build_dir job_size:34690
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.85/config job_size:35602
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.85/build job_size:34582
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.85/test job_size:35390
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.85/install job_size:35281
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.85/post_install job_size:35414
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.85/install_check job_size:36734
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.85/install_log job_size:38904
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.85/remove_write_perm job_size:35412
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.85/module_sync job_size:34251
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.85/wipe_build job_size:35834
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.846/var_summary job_size:36074
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.846
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.846/git_srcs job_size:36103
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.846/make_build_dir job_size:34720
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.846/config job_size:35630
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.846/build job_size:34608
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.846/test job_size:35416
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.846/install job_size:35308
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.846/post_install job_size:35440
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.846/install_check job_size:36761
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.846/install_log job_size:38933
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.846/remove_write_perm job_size:35438
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.846/module_sync job_size:34276
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cct/cray.846/wipe_build job_size:35862
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappa/var_summary job_size:15452
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappa
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappa/git_srcs job_size:15216
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappa/make_build_dir job_size:13961
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappa/config job_size:14895
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappa/build job_size:14127
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappa/test job_size:14957
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappa/install job_size:14750
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappa/post_install job_size:14798
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappa/install_check job_size:16071
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappa/install_log job_size:18148
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappa/remove_write_perm job_size:14680
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappa/module_sync job_size:13685
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappa/wipe_build job_size:15240
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.44/var_summary job_size:15462
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.44
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.44/git_srcs job_size:15370
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.44/make_build_dir job_size:13998
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.44/config job_size:14955
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.44/build job_size:14128
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.44/test job_size:14958
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.44/install job_size:14801
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.44/post_install job_size:14837
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.44/install_check job_size:16122
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.44/install_log job_size:18618
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.44/remove_write_perm job_size:14722
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.44/module_sync job_size:13676
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.44/wipe_build job_size:15248
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.53/var_summary job_size:15438
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.53/git_srcs job_size:15346
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.53/make_build_dir job_size:13974
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.53/config job_size:14931
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.53/build job_size:14104
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.53/test job_size:14934
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.53/install job_size:14777
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.53/post_install job_size:14813
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.53/install_check job_size:16098
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.53/install_log job_size:18594
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.53/remove_write_perm job_size:14698
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.53/module_sync job_size:13652
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/ecgb/gnu.53/wipe_build job_size:15224
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/gnu.53/var_summary job_size:15437
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/gnu.53/git_srcs job_size:15276
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/gnu.53/make_build_dir job_size:13956
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/gnu.53/config job_size:14921
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/gnu.53/build job_size:14102
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/gnu.53/test job_size:14932
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/gnu.53/install job_size:14771
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/gnu.53/post_install job_size:14808
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/gnu.53/install_check job_size:16092
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/gnu.53/install_log job_size:18589
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/gnu.53/remove_write_perm job_size:14696
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/gnu.53/module_sync job_size:13653
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/gnu.53/wipe_build job_size:15217
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/intel.16/var_summary job_size:15497
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/intel.16
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/intel.16/git_srcs job_size:15366
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/intel.16/make_build_dir job_size:14020
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/intel.16/config job_size:14981
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/intel.16/build job_size:14158
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/intel.16/test job_size:14988
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/intel.16/install job_size:14829
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/intel.16/post_install job_size:14864
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/intel.16/install_check job_size:16150
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/intel.16/install_log job_size:18651
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/intel.16/remove_write_perm job_size:14752
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/intel.16/module_sync job_size:13707
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/intel.16/wipe_build job_size:15277
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/pgi.16/var_summary job_size:15475
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/pgi.16
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/pgi.16/git_srcs job_size:15314
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/pgi.16/make_build_dir job_size:13994
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/pgi.16/config job_size:14996
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/pgi.16/build job_size:14140
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/pgi.16/test job_size:14970
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/pgi.16/install job_size:14809
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/pgi.16/post_install job_size:14846
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/pgi.16/install_check job_size:16130
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/pgi.16/install_log job_size:18627
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/pgi.16/remove_write_perm job_size:14734
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/pgi.16/module_sync job_size:13691
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxg/pgi.16/wipe_build job_size:15255
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.48/var_summary job_size:15502
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.48
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.48/git_srcs job_size:15443
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.48/make_build_dir job_size:14032
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.48/config job_size:14999
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.48/build job_size:14150
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.48/test job_size:14980
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.48/install job_size:14826
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.48/post_install job_size:14880
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.48/install_check job_size:16147
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.48/install_log job_size:18661
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.48/remove_write_perm job_size:14744
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.48/module_sync job_size:13702
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.48/wipe_build job_size:15280
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.53/var_summary job_size:15526
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.53/git_srcs job_size:15467
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.53/make_build_dir job_size:14056
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.53/config job_size:15023
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.53/build job_size:14174
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.53/test job_size:15004
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.53/install job_size:14850
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.53/post_install job_size:14904
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.53/install_check job_size:16171
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.53/install_log job_size:18685
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.53/remove_write_perm job_size:14768
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.53/module_sync job_size:13726
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.53/wipe_build job_size:15304
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.61/var_summary job_size:15526
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.61
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.61/git_srcs job_size:15467
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.61/make_build_dir job_size:14056
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.61/config job_size:15023
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.61/build job_size:14174
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.61/test job_size:15004
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.61/install job_size:14850
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.61/post_install job_size:14904
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.61/install_check job_size:16171
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.61/install_log job_size:18685
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.61/remove_write_perm job_size:14768
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.61/module_sync job_size:13726
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/gnu.61/wipe_build job_size:15304
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/pgi/var_summary job_size:15528
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/pgi
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/pgi/git_srcs job_size:15424
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/pgi/make_build_dir job_size:14052
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/pgi/config job_size:15062
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/pgi/build job_size:14182
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/pgi/test job_size:15012
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/pgi/install job_size:14855
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/pgi/post_install job_size:14912
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/pgi/install_check job_size:16176
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/pgi/install_log job_size:18684
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/pgi/remove_write_perm job_size:14776
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/pgi/module_sync job_size:13737
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/opensuse131/pgi/wipe_build job_size:15306
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.49/var_summary job_size:15438
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.49/git_srcs job_size:15277
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.49/make_build_dir job_size:13957
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.49/config job_size:14922
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.49/build job_size:14103
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.49/test job_size:14933
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.49/install job_size:14772
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.49/post_install job_size:14809
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.49/install_check job_size:16093
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.49/install_log job_size:18590
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.49/remove_write_perm job_size:14697
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.49/module_sync job_size:13654
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.49/wipe_build job_size:15218
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.53/var_summary job_size:15462
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.53/git_srcs job_size:15301
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.53/make_build_dir job_size:13981
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.53/config job_size:14946
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.53/build job_size:14127
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.53/test job_size:14957
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.53/install job_size:14796
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.53/post_install job_size:14833
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.53/install_check job_size:16117
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.53/install_log job_size:18614
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.53/remove_write_perm job_size:14721
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.53/module_sync job_size:13678
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/gnu.53/wipe_build job_size:15242
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/pgi/var_summary job_size:15465
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/pgi
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/pgi/git_srcs job_size:15259
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/pgi/make_build_dir job_size:13978
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/pgi/config job_size:14986
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/pgi/build job_size:14136
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/pgi/test job_size:14966
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/pgi/install job_size:14802
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/pgi/post_install job_size:14842
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/pgi/install_check job_size:16123
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/pgi/install_log job_size:18614
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/pgi/remove_write_perm job_size:14730
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/pgi/module_sync job_size:13690
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/lxc/pgi/wipe_build job_size:15245
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.53/var_summary job_size:15452
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.53/git_srcs job_size:15318
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.53/make_build_dir job_size:13972
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.53/config job_size:14949
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.53/build job_size:14110
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.53/test job_size:14940
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.53/install job_size:14781
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.53/post_install job_size:14825
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.53/install_check job_size:16102
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.53/install_log job_size:18606
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.53/remove_write_perm job_size:14704
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.53/module_sync job_size:13662
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.53/wipe_build job_size:15230
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.61/var_summary job_size:15476
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.61
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.61/git_srcs job_size:15342
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.61/make_build_dir job_size:13996
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.61/config job_size:14973
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.61/build job_size:14134
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.61/test job_size:14964
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.61/install job_size:14805
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.61/post_install job_size:14849
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.61/install_check job_size:16126
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.61/install_log job_size:18630
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.61/remove_write_perm job_size:14728
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.61/module_sync job_size:13686
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/gnu.61/wipe_build job_size:15254
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/pgi/var_summary job_size:15478
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/pgi
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/pgi/git_srcs job_size:15299
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/pgi/make_build_dir job_size:13992
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/pgi/config job_size:15012
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/pgi/build job_size:14142
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/pgi/test job_size:14972
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/pgi/install job_size:14810
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/pgi/post_install job_size:14857
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/pgi/install_check job_size:16131
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/pgi/install_log job_size:18629
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/pgi/remove_write_perm job_size:14736
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/pgi/module_sync job_size:13697
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/leap42/pgi/wipe_build job_size:15256
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappb/var_summary job_size:15452
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappb
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappb/git_srcs job_size:15216
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappb/make_build_dir job_size:13961
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappb/config job_size:14895
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappb/build job_size:14127
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappb/test job_size:14957
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappb/install job_size:14750
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappb/post_install job_size:14798
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappb/install_check job_size:16071
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappb/install_log job_size:18148
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappb/remove_write_perm job_size:14680
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappb/module_sync job_size:13685
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/sappb/wipe_build job_size:15240
+WAR:[12:55:57 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.49/var_summary job_size:36079
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.49
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.49/git_srcs job_size:36078
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.49/make_build_dir job_size:34721
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.49/config job_size:35550
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.49/build job_size:34617
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.49/test job_size:35425
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.49/install job_size:35315
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.49/post_install job_size:35449
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.49/install_check job_size:36768
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.49/install_log job_size:38936
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.49/remove_write_perm job_size:35447
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.49/module_sync job_size:34287
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.49/wipe_build job_size:35867
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.53/var_summary job_size:36079
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.53
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.53/git_srcs job_size:36078
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.53/make_build_dir job_size:34721
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.53/config job_size:35550
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.53/build job_size:34617
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.53/test job_size:35425
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.53/install job_size:35315
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.53/post_install job_size:35449
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.53/install_check job_size:36768
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.53/install_log job_size:38936
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.53/remove_write_perm job_size:35447
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.53/module_sync job_size:34287
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/gnu.53/wipe_build job_size:35867
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.14/var_summary job_size:36144
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.14
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.14/git_srcs job_size:36173
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.14/make_build_dir job_size:34790
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.14/config job_size:35635
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.14/build job_size:34678
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.14/test job_size:35486
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.14/install job_size:35378
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.14/post_install job_size:35510
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.14/install_check job_size:36831
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.14/install_log job_size:39003
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.14/remove_write_perm job_size:35508
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.14/module_sync job_size:34346
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.14/wipe_build job_size:35932
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.15/var_summary job_size:36144
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.15
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.15/git_srcs job_size:36173
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.15/make_build_dir job_size:34790
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.15/config job_size:35635
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.15/build job_size:34678
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.15/test job_size:35486
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.15/install job_size:35378
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.15/post_install job_size:35510
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.15/install_check job_size:36831
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.15/install_log job_size:39003
+LOG:[12:55:57 13.4.2017] submitted: /eccodes/cca/intel.15/remove_write_perm job_size:35508
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/intel.15/module_sync job_size:34346
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/intel.15/wipe_build job_size:35932
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/intel.16/var_summary job_size:36120
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/intel.16
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/intel.16/git_srcs job_size:36149
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/intel.16/make_build_dir job_size:34766
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/intel.16/config job_size:35611
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/intel.16/build job_size:34654
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/intel.16/test job_size:35462
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/intel.16/install job_size:35354
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/intel.16/post_install job_size:35486
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/intel.16/install_check job_size:36807
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/intel.16/install_log job_size:38979
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/intel.16/remove_write_perm job_size:35484
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/intel.16/module_sync job_size:34322
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/intel.16/wipe_build job_size:35908
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.84/var_summary job_size:36046
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.84
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.84/git_srcs job_size:36060
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.84/make_build_dir job_size:34690
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.84/config job_size:35602
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.84/build job_size:34582
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.84/test job_size:35390
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.84/install job_size:35281
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.84/post_install job_size:35414
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.84/install_check job_size:36734
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.84/install_log job_size:38904
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.84/remove_write_perm job_size:35412
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.84/module_sync job_size:34251
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.84/wipe_build job_size:35834
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.846/var_summary job_size:36074
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.846
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.846/git_srcs job_size:36103
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.846/make_build_dir job_size:34720
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.846/config job_size:35630
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.846/build job_size:34608
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.846/test job_size:35416
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.846/install job_size:35308
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.846/post_install job_size:35440
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.846/install_check job_size:36761
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.846/install_log job_size:38933
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.846/remove_write_perm job_size:35438
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.846/module_sync job_size:34276
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/cca/cray.846/wipe_build job_size:35862
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.49/var_summary job_size:36079
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.49
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.49/git_srcs job_size:36078
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.49/make_build_dir job_size:34721
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.49/config job_size:35550
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.49/build job_size:34617
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.49/test job_size:35425
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.49/install job_size:35315
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.49/post_install job_size:35449
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.49/install_check job_size:36768
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.49/install_log job_size:38936
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.49/remove_write_perm job_size:35447
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.49/module_sync job_size:34287
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.49/wipe_build job_size:35867
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.53/var_summary job_size:36079
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.53/git_srcs job_size:36078
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.53/make_build_dir job_size:34721
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.53/config job_size:35550
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.53/build job_size:34617
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.53/test job_size:35425
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.53/install job_size:35315
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.53/post_install job_size:35449
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.53/install_check job_size:36768
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.53/install_log job_size:38936
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.53/remove_write_perm job_size:35447
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.53/module_sync job_size:34287
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/gnu.53/wipe_build job_size:35867
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.14/var_summary job_size:36144
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.14
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.14/git_srcs job_size:36173
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.14/make_build_dir job_size:34790
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.14/config job_size:35635
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.14/build job_size:34678
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.14/test job_size:35486
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.14/install job_size:35378
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.14/post_install job_size:35510
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.14/install_check job_size:36831
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.14/install_log job_size:39003
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.14/remove_write_perm job_size:35508
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.14/module_sync job_size:34346
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.14/wipe_build job_size:35932
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.15/var_summary job_size:36144
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.15
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.15/git_srcs job_size:36173
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.15/make_build_dir job_size:34790
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.15/config job_size:35635
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.15/build job_size:34678
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.15/test job_size:35486
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.15/install job_size:35378
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.15/post_install job_size:35510
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.15/install_check job_size:36831
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.15/install_log job_size:39003
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.15/remove_write_perm job_size:35508
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.15/module_sync job_size:34346
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.15/wipe_build job_size:35932
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.16/var_summary job_size:36120
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.16
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.16/git_srcs job_size:36149
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.16/make_build_dir job_size:34766
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.16/config job_size:35611
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.16/build job_size:34654
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.16/test job_size:35462
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.16/install job_size:35354
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.16/post_install job_size:35486
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.16/install_check job_size:36807
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.16/install_log job_size:38979
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.16/remove_write_perm job_size:35484
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.16/module_sync job_size:34322
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/intel.16/wipe_build job_size:35908
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.84/var_summary job_size:36046
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.84
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.84/git_srcs job_size:36060
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.84/make_build_dir job_size:34690
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.84/config job_size:35602
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.84/build job_size:34582
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.84/test job_size:35390
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.84/install job_size:35281
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.84/post_install job_size:35414
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.84/install_check job_size:36734
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.84/install_log job_size:38904
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.84/remove_write_perm job_size:35412
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.84/module_sync job_size:34251
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.84/wipe_build job_size:35834
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.846/var_summary job_size:36074
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.846
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.846/git_srcs job_size:36103
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.846/make_build_dir job_size:34720
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.846/config job_size:35630
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.846/build job_size:34608
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.846/test job_size:35416
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.846/install job_size:35308
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.846/post_install job_size:35440
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.846/install_check job_size:36761
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.846/install_log job_size:38933
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.846/remove_write_perm job_size:35438
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.846/module_sync job_size:34276
+LOG:[12:55:58 13.4.2017] submitted: /eccodes/ccb/cray.846/wipe_build job_size:35862
+LOG:[12:55:58 13.4.2017] submitted: /libemos/regenerate job_size:15353
+LOG:[12:55:58 13.4.2017] submitted: /libemos
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.49/var_summary job_size:15524
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.49
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.49/git_srcs job_size:15540
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.49/make_build_dir job_size:14083
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.49/config job_size:15077
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.49/build job_size:14185
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.49/test job_size:15015
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.49/add_write_perm job_size:14746
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.49/install job_size:15097
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.49/install_log job_size:18693
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.49/remove_write_perm job_size:14785
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.49/module_sync job_size:13726
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.49/wipe_build job_size:15324
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.53/var_summary job_size:15548
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.53/git_srcs job_size:15564
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.53/make_build_dir job_size:14107
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.53/config job_size:15101
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.53/build job_size:14209
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.53/test job_size:15039
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.53/add_write_perm job_size:14770
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.53/install job_size:15121
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.53/install_log job_size:18717
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.53/remove_write_perm job_size:14809
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.53/module_sync job_size:13750
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxop_dev/gnu.53/wipe_build job_size:15348
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.53/var_summary job_size:36085
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.53/git_srcs job_size:36078
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.53/make_build_dir job_size:34727
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.53/config job_size:35563
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.53/build job_size:34623
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.53/test job_size:35431
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.53/add_write_perm job_size:35354
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.53/install job_size:35553
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.53/install_log job_size:38948
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.53/remove_write_perm job_size:35459
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.53/module_sync job_size:34293
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.53/wipe_build job_size:35873
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.62/var_summary job_size:36085
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.62
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.62/git_srcs job_size:36078
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.62/make_build_dir job_size:34727
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.62/config job_size:35563
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.62/build job_size:34623
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.62/test job_size:35431
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.62/add_write_perm job_size:35354
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.62/install job_size:35553
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.62/install_log job_size:38948
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.62/remove_write_perm job_size:35459
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.62/module_sync job_size:34293
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/gnu.62/wipe_build job_size:35873
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/intel.17/var_summary job_size:36119
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/intel.17
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/intel.17/git_srcs job_size:36142
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/intel.17/make_build_dir job_size:34765
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/intel.17/config job_size:35597
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/intel.17/build job_size:34653
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/intel.17/test job_size:35461
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/intel.17/add_write_perm job_size:35384
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/intel.17/install job_size:35585
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/intel.17/install_log job_size:38984
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/intel.17/remove_write_perm job_size:35489
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/intel.17/module_sync job_size:34321
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/intel.17/wipe_build job_size:35907
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/cray.85/var_summary job_size:36052
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/cray.85
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/cray.85/git_srcs job_size:36060
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/cray.85/make_build_dir job_size:34696
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/cray.85/config job_size:35530
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/cray.85/build job_size:34588
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/cray.85/test job_size:35396
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/cray.85/add_write_perm job_size:35319
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/cray.85/install job_size:35519
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/cray.85/install_log job_size:38916
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/cray.85/remove_write_perm job_size:35424
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/cray.85/module_sync job_size:34257
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cck/cray.85/wipe_build job_size:35840
+WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.49/var_summary job_size:36126
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.49
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.49/git_srcs job_size:36119
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.49/make_build_dir job_size:34768
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.49/config job_size:35629
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.49/build job_size:34664
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.49/test job_size:35472
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.49/add_write_perm job_size:35395
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.49/install job_size:35594
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.49/install_log job_size:38989
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.49/remove_write_perm job_size:35500
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.49/module_sync job_size:34334
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.49/wipe_build job_size:35914
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.53/var_summary job_size:36126
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.53/git_srcs job_size:36119
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.53/make_build_dir job_size:34768
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.53/config job_size:35629
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.53/build job_size:34664
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.53/test job_size:35472
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.53/add_write_perm job_size:35395
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.53/install job_size:35594
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.53/install_log job_size:38989
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.53/remove_write_perm job_size:35500
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.53/module_sync job_size:34334
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/gnu.53/wipe_build job_size:35914
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.14/var_summary job_size:36191
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.14
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.14/git_srcs job_size:36214
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.14/make_build_dir job_size:34837
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.14/config job_size:35694
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.14/build job_size:34725
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.14/test job_size:35533
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.14/add_write_perm job_size:35456
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.14/install job_size:35657
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.14/install_log job_size:39056
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.14/remove_write_perm job_size:35561
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.14/module_sync job_size:34393
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.14/wipe_build job_size:35979
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.15/var_summary job_size:36191
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.15
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.15/git_srcs job_size:36214
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.15/make_build_dir job_size:34837
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.15/config job_size:35694
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.15/build job_size:34725
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.15/test job_size:35533
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.15/add_write_perm job_size:35456
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.15/install job_size:35657
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.15/install_log job_size:39056
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.15/remove_write_perm job_size:35561
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.15/module_sync job_size:34393
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.15/wipe_build job_size:35979
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.16/var_summary job_size:36191
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.16
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.16/git_srcs job_size:36214
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.16/make_build_dir job_size:34837
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.16/config job_size:35694
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.16/build job_size:34725
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.16/test job_size:35533
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.16/add_write_perm job_size:35456
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.16/install job_size:35657
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.16/install_log job_size:39056
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.16/remove_write_perm job_size:35561
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.16/module_sync job_size:34393
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/intel.16/wipe_build job_size:35979
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.84/var_summary job_size:36093
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.84
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.84/git_srcs job_size:36101
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.84/make_build_dir job_size:34737
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.84/config job_size:35624
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.84/build job_size:34629
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.84/test job_size:35437
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.84/add_write_perm job_size:35360
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.84/install job_size:35560
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.84/install_log job_size:38957
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.84/remove_write_perm job_size:35465
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.84/module_sync job_size:34298
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.84/wipe_build job_size:35881
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.85/var_summary job_size:36093
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.85
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.85/git_srcs job_size:36101
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.85/make_build_dir job_size:34737
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.85/config job_size:35624
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.85/build job_size:34629
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.85/test job_size:35437
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.85/add_write_perm job_size:35360
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.85/install job_size:35560
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.85/install_log job_size:38957
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.85/remove_write_perm job_size:35465
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.85/module_sync job_size:34298
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.85/wipe_build job_size:35881
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.846/var_summary job_size:36121
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.846
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.846/git_srcs job_size:36144
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.846/make_build_dir job_size:34767
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.846/config job_size:35652
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.846/build job_size:34655
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.846/test job_size:35463
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.846/add_write_perm job_size:35386
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.846/install job_size:35587
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.846/install_log job_size:38986
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.846/remove_write_perm job_size:35491
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.846/module_sync job_size:34323
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cct/cray.846/wipe_build job_size:35909
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappa/var_summary job_size:15405
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappa
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappa/git_srcs job_size:15163
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappa/make_build_dir job_size:13914
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappa/config job_size:14901
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappa/build job_size:14080
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappa/test job_size:14910
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappa/add_write_perm job_size:14600
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappa/install job_size:14935
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappa/install_log job_size:18107
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappa/remove_write_perm job_size:14639
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappa/module_sync job_size:13638
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappa/wipe_build job_size:15193
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.44/var_summary job_size:15483
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.44
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.44/git_srcs job_size:15385
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.44/make_build_dir job_size:14019
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.44/config job_size:15002
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.44/build job_size:14149
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.44/test job_size:14979
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.44/add_write_perm job_size:14710
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.44/install job_size:15054
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.44/install_log job_size:18645
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.44/remove_write_perm job_size:14749
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.44/module_sync job_size:13697
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.44/wipe_build job_size:15269
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.53/var_summary job_size:15459
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.53/git_srcs job_size:15361
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.53/make_build_dir job_size:13995
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.53/config job_size:14978
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.53/build job_size:14125
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.53/test job_size:14955
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.53/add_write_perm job_size:14686
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.53/install job_size:15030
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.53/install_log job_size:18621
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.53/remove_write_perm job_size:14725
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.53/module_sync job_size:13673
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ecgb/gnu.53/wipe_build job_size:15245
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/gnu.53/var_summary job_size:15445
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/gnu.53/git_srcs job_size:15278
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/gnu.53/make_build_dir job_size:13964
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/gnu.53/config job_size:14955
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/gnu.53/build job_size:14110
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/gnu.53/test job_size:14940
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/gnu.53/add_write_perm job_size:14671
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/gnu.53/install job_size:15011
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/gnu.53/install_log job_size:18603
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/gnu.53/remove_write_perm job_size:14710
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/gnu.53/module_sync job_size:13661
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/gnu.53/wipe_build job_size:15225
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/intel.16/var_summary job_size:15505
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/intel.16
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/intel.16/git_srcs job_size:15368
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/intel.16/make_build_dir job_size:14028
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/intel.16/config job_size:15015
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/intel.16/build job_size:14166
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/intel.16/test job_size:14996
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/intel.16/add_write_perm job_size:14727
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/intel.16/install job_size:15069
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/intel.16/install_log job_size:18665
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/intel.16/remove_write_perm job_size:14766
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/intel.16/module_sync job_size:13715
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/intel.16/wipe_build job_size:15285
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/pgi.16/var_summary job_size:15483
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/pgi.16
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/pgi.16/git_srcs job_size:15316
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/pgi.16/make_build_dir job_size:14002
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/pgi.16/config job_size:14993
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/pgi.16/build job_size:14148
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/pgi.16/test job_size:14978
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/pgi.16/add_write_perm job_size:14709
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/pgi.16/install job_size:15049
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/pgi.16/install_log job_size:18641
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/pgi.16/remove_write_perm job_size:14748
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/pgi.16/module_sync job_size:13699
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxg/pgi.16/wipe_build job_size:15263
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.48/var_summary job_size:15544
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.48
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.48/git_srcs job_size:15479
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.48/make_build_dir job_size:14074
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.48/config job_size:15051
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.48/build job_size:14192
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.48/test job_size:15022
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.48/add_write_perm job_size:14753
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.48/install job_size:15100
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.48/install_log job_size:18709
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.48/remove_write_perm job_size:14792
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.48/module_sync job_size:13744
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.48/wipe_build job_size:15322
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.53/var_summary job_size:15547
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.53/git_srcs job_size:15482
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.53/make_build_dir job_size:14077
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.53/config job_size:15054
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.53/build job_size:14195
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.53/test job_size:15025
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.53/add_write_perm job_size:14756
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.53/install job_size:15103
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.53/install_log job_size:18712
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.53/remove_write_perm job_size:14795
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.53/module_sync job_size:13747
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.53/wipe_build job_size:15325
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.61/var_summary job_size:15547
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.61
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.61/git_srcs job_size:15482
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.61/make_build_dir job_size:14077
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.61/config job_size:15054
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.61/build job_size:14195
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.61/test job_size:15025
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.61/add_write_perm job_size:14756
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.61/install job_size:15103
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.61/install_log job_size:18712
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.61/remove_write_perm job_size:14795
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.61/module_sync job_size:13747
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/gnu.61/wipe_build job_size:15325
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/pgi/var_summary job_size:15565
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/pgi
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/pgi/git_srcs job_size:15455
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/pgi/make_build_dir job_size:14089
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/pgi/config job_size:15130
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/pgi/build job_size:14219
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/pgi/test job_size:15049
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/pgi/add_write_perm job_size:14780
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/pgi/install job_size:15124
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/pgi/install_log job_size:18727
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/pgi/remove_write_perm job_size:14819
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/pgi/module_sync job_size:13774
+LOG:[12:55:58 13.4.2017] submitted: /libemos/opensuse131/pgi/wipe_build job_size:15343
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.49/var_summary job_size:15446
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.49
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.49/git_srcs job_size:15279
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.49/make_build_dir job_size:13965
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.49/config job_size:14956
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.49/build job_size:14111
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.49/test job_size:14941
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.49/add_write_perm job_size:14672
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.49/install job_size:15012
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.49/install_log job_size:18604
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.49/remove_write_perm job_size:14711
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.49/module_sync job_size:13662
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.49/wipe_build job_size:15226
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.53/var_summary job_size:15470
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.53/git_srcs job_size:15303
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.53/make_build_dir job_size:13989
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.53/config job_size:14980
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.53/build job_size:14135
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.53/test job_size:14965
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.53/add_write_perm job_size:14696
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.53/install job_size:15036
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.53/install_log job_size:18628
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.53/remove_write_perm job_size:14735
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.53/module_sync job_size:13686
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/gnu.53/wipe_build job_size:15250
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/pgi/var_summary job_size:15488
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/pgi
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/pgi/git_srcs job_size:15276
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/pgi/make_build_dir job_size:14001
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/pgi/config job_size:15056
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/pgi/build job_size:14159
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/pgi/test job_size:14989
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/pgi/add_write_perm job_size:14720
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/pgi/install job_size:15057
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/pgi/install_log job_size:18643
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/pgi/remove_write_perm job_size:14759
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/pgi/module_sync job_size:13713
+LOG:[12:55:58 13.4.2017] submitted: /libemos/lxc/pgi/wipe_build job_size:15268
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.53/var_summary job_size:15473
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.53/git_srcs job_size:15333
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.53/make_build_dir job_size:13993
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.53/config job_size:14980
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.53/build job_size:14131
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.53/test job_size:14961
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.53/add_write_perm job_size:14692
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.53/install job_size:15034
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.53/install_log job_size:18633
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.53/remove_write_perm job_size:14731
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.53/module_sync job_size:13683
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.53/wipe_build job_size:15251
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.61/var_summary job_size:15497
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.61
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.61/git_srcs job_size:15357
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.61/make_build_dir job_size:14017
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.61/config job_size:15004
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.61/build job_size:14155
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.61/test job_size:14985
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.61/add_write_perm job_size:14716
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.61/install job_size:15058
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.61/install_log job_size:18657
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.61/remove_write_perm job_size:14755
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.61/module_sync job_size:13707
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/gnu.61/wipe_build job_size:15275
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/pgi/var_summary job_size:15515
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/pgi
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/pgi/git_srcs job_size:15330
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/pgi/make_build_dir job_size:14029
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/pgi/config job_size:15080
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/pgi/build job_size:14179
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/pgi/test job_size:15009
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/pgi/add_write_perm job_size:14740
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/pgi/install job_size:15079
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/pgi/install_log job_size:18672
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/pgi/remove_write_perm job_size:14779
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/pgi/module_sync job_size:13734
+LOG:[12:55:58 13.4.2017] submitted: /libemos/leap42/pgi/wipe_build job_size:15293
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappb/var_summary job_size:15405
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappb
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappb/git_srcs job_size:15163
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappb/make_build_dir job_size:13914
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappb/config job_size:14901
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappb/build job_size:14080
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappb/test job_size:14910
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappb/add_write_perm job_size:14600
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappb/install job_size:14935
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappb/install_log job_size:18107
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappb/remove_write_perm job_size:14639
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappb/module_sync job_size:13638
+LOG:[12:55:58 13.4.2017] submitted: /libemos/sappb/wipe_build job_size:15193
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.49/var_summary job_size:36126
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.49
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.49/git_srcs job_size:36119
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.49/make_build_dir job_size:34768
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.49/config job_size:35629
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.49/build job_size:34664
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.49/test job_size:35472
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.49/add_write_perm job_size:35395
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.49/install job_size:35594
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.49/install_log job_size:38989
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.49/remove_write_perm job_size:35500
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.49/module_sync job_size:34334
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.49/wipe_build job_size:35914
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.53/var_summary job_size:36126
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.53/git_srcs job_size:36119
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.53/make_build_dir job_size:34768
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.53/config job_size:35629
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.53/build job_size:34664
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.53/test job_size:35472
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.53/add_write_perm job_size:35395
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.53/install job_size:35594
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.53/install_log job_size:38989
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.53/remove_write_perm job_size:35500
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.53/module_sync job_size:34334
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/gnu.53/wipe_build job_size:35914
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.14/var_summary job_size:36191
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.14
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.14/git_srcs job_size:36214
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.14/make_build_dir job_size:34837
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.14/config job_size:35694
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.14/build job_size:34725
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.14/test job_size:35533
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.14/add_write_perm job_size:35456
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.14/install job_size:35657
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.14/install_log job_size:39056
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.14/remove_write_perm job_size:35561
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.14/module_sync job_size:34393
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.14/wipe_build job_size:35979
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.15/var_summary job_size:36191
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.15
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.15/git_srcs job_size:36214
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.15/make_build_dir job_size:34837
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.15/config job_size:35694
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.15/build job_size:34725
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.15/test job_size:35533
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.15/add_write_perm job_size:35456
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.15/install job_size:35657
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.15/install_log job_size:39056
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.15/remove_write_perm job_size:35561
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.15/module_sync job_size:34393
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.15/wipe_build job_size:35979
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.16/var_summary job_size:36167
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.16
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.16/git_srcs job_size:36190
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.16/make_build_dir job_size:34813
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.16/config job_size:35670
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.16/build job_size:34701
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.16/test job_size:35509
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.16/add_write_perm job_size:35432
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.16/install job_size:35633
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.16/install_log job_size:39032
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.16/remove_write_perm job_size:35537
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.16/module_sync job_size:34369
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/intel.16/wipe_build job_size:35955
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.84/var_summary job_size:36093
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.84
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.84/git_srcs job_size:36101
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.84/make_build_dir job_size:34737
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.84/config job_size:35624
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.84/build job_size:34629
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.84/test job_size:35437
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.84/add_write_perm job_size:35360
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.84/install job_size:35560
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.84/install_log job_size:38957
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.84/remove_write_perm job_size:35465
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.84/module_sync job_size:34298
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.84/wipe_build job_size:35881
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.846/var_summary job_size:36121
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.846
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.846/git_srcs job_size:36144
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.846/make_build_dir job_size:34767
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.846/config job_size:35652
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.846/build job_size:34655
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.846/test job_size:35463
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.846/add_write_perm job_size:35386
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.846/install job_size:35587
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.846/install_log job_size:38986
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.846/remove_write_perm job_size:35491
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.846/module_sync job_size:34323
+LOG:[12:55:58 13.4.2017] submitted: /libemos/cca/cray.846/wipe_build job_size:35909
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.49/var_summary job_size:36126
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.49
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.49/git_srcs job_size:36119
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.49/make_build_dir job_size:34768
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.49/config job_size:35629
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.49/build job_size:34664
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.49/test job_size:35472
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.49/add_write_perm job_size:35395
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.49/install job_size:35594
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.49/install_log job_size:38989
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.49/remove_write_perm job_size:35500
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.49/module_sync job_size:34334
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.49/wipe_build job_size:35914
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.53/var_summary job_size:36126
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.53/git_srcs job_size:36119
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.53/make_build_dir job_size:34768
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.53/config job_size:35629
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.53/build job_size:34664
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.53/test job_size:35472
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.53/add_write_perm job_size:35395
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.53/install job_size:35594
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.53/install_log job_size:38989
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.53/remove_write_perm job_size:35500
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.53/module_sync job_size:34334
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/gnu.53/wipe_build job_size:35914
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.14/var_summary job_size:36191
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.14
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.14/git_srcs job_size:36214
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.14/make_build_dir job_size:34837
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.14/config job_size:35694
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.14/build job_size:34725
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.14/test job_size:35533
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.14/add_write_perm job_size:35456
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.14/install job_size:35657
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.14/install_log job_size:39056
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.14/remove_write_perm job_size:35561
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.14/module_sync job_size:34393
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.14/wipe_build job_size:35979
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.15/var_summary job_size:36191
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.15
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.15/git_srcs job_size:36214
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.15/make_build_dir job_size:34837
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.15/config job_size:35694
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.15/build job_size:34725
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.15/test job_size:35533
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.15/add_write_perm job_size:35456
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.15/install job_size:35657
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.15/install_log job_size:39056
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.15/remove_write_perm job_size:35561
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.15/module_sync job_size:34393
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.15/wipe_build job_size:35979
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.16/var_summary job_size:36167
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.16
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.16/git_srcs job_size:36190
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.16/make_build_dir job_size:34813
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.16/config job_size:35670
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.16/build job_size:34701
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.16/test job_size:35509
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.16/add_write_perm job_size:35432
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.16/install job_size:35633
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.16/install_log job_size:39032
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.16/remove_write_perm job_size:35537
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.16/module_sync job_size:34369
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/intel.16/wipe_build job_size:35955
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.84/var_summary job_size:36093
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.84
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.84/git_srcs job_size:36101
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.84/make_build_dir job_size:34737
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.84/config job_size:35624
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.84/build job_size:34629
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.84/test job_size:35437
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.84/add_write_perm job_size:35360
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.84/install job_size:35560
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.84/install_log job_size:38957
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.84/remove_write_perm job_size:35465
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.84/module_sync job_size:34298
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.84/wipe_build job_size:35881
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.846/var_summary job_size:36121
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.846
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.846/git_srcs job_size:36144
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.846/make_build_dir job_size:34767
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.846/config job_size:35652
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.846/build job_size:34655
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.846/test job_size:35463
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.846/add_write_perm job_size:35386
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.846/install job_size:35587
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.846/install_log job_size:38986
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.846/remove_write_perm job_size:35491
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.846/module_sync job_size:34323
+LOG:[12:55:58 13.4.2017] submitted: /libemos/ccb/cray.846/wipe_build job_size:35909
+WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/regenerate job_size:15353
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxop_dev/var_summary job_size:15389
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxop_dev
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxop_dev/git_srcs job_size:15320
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxop_dev/make_build_dir job_size:13939
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxop_dev/config job_size:14847
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxop_dev/build job_size:14065
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxop_dev/test job_size:14895
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxop_dev/add_write_perm job_size:14584
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxop_dev/install job_size:14703
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxop_dev/install_log job_size:18100
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxop_dev/remove_write_perm job_size:14623
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxop_dev/module_sync job_size:13612
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxop_dev/wipe_build job_size:15191
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cck/var_summary job_size:35714
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cck
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cck/git_srcs job_size:35622
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cck/make_build_dir job_size:34347
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cck/config job_size:35127
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cck/build job_size:34267
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cck/test job_size:35075
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cck/add_write_perm job_size:34984
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cck/install job_size:34951
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cck/install_log job_size:38427
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cck/remove_write_perm job_size:35089
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cck/module_sync job_size:33943
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cck/wipe_build job_size:35504
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cct/var_summary job_size:35771
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cct
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cct/git_srcs job_size:35679
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cct/make_build_dir job_size:34404
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cct/config job_size:35184
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cct/build job_size:34324
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cct/test job_size:35132
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cct/add_write_perm job_size:35041
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cct/install job_size:35008
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cct/install_log job_size:38484
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cct/remove_write_perm job_size:35146
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cct/module_sync job_size:34000
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cct/wipe_build job_size:35561
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappa/var_summary job_size:15349
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappa
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappa/git_srcs job_size:15109
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappa/make_build_dir job_size:13858
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappa/config job_size:14751
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappa/build job_size:14024
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappa/test job_size:14854
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappa/add_write_perm job_size:14543
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappa/install job_size:14652
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappa/install_log job_size:18050
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappa/remove_write_perm job_size:14582
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappa/module_sync job_size:13582
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappa/wipe_build job_size:15137
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ecgb/var_summary job_size:15320
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ecgb
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ecgb/git_srcs job_size:15137
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ecgb/make_build_dir job_size:13847
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ecgb/config job_size:14737
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ecgb/build job_size:14001
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ecgb/test job_size:14831
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ecgb/add_write_perm job_size:14520
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ecgb/install job_size:14632
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ecgb/install_log job_size:18024
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ecgb/remove_write_perm job_size:14559
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ecgb/module_sync job_size:13555
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ecgb/wipe_build job_size:15108
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxg/var_summary job_size:15305
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxg
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxg/git_srcs job_size:15053
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxg/make_build_dir job_size:13815
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxg/config job_size:14709
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxg/build job_size:13985
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxg/test job_size:14815
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxg/add_write_perm job_size:14504
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxg/install job_size:14612
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxg/install_log job_size:18005
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxg/remove_write_perm job_size:14543
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxg/module_sync job_size:13542
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxg/wipe_build job_size:15087
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/opensuse131/var_summary job_size:15391
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/opensuse131
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/opensuse131/git_srcs job_size:15241
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/opensuse131/make_build_dir job_size:13912
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/opensuse131/config job_size:14799
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/opensuse131/build job_size:14054
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/opensuse131/test job_size:14884
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/opensuse131/add_write_perm job_size:14573
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/opensuse131/install job_size:14688
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/opensuse131/install_log job_size:18098
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/opensuse131/remove_write_perm job_size:14612
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/opensuse131/module_sync job_size:13612
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/opensuse131/wipe_build job_size:15171
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxc/var_summary job_size:15306
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxc
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxc/git_srcs job_size:15054
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxc/make_build_dir job_size:13816
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxc/config job_size:14710
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxc/build job_size:13986
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxc/test job_size:14816
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxc/add_write_perm job_size:14505
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxc/install job_size:14613
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxc/install_log job_size:18006
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxc/remove_write_perm job_size:14544
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxc/module_sync job_size:13543
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/lxc/wipe_build job_size:15088
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/leap42/var_summary job_size:15336
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/leap42
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/leap42/git_srcs job_size:15111
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/leap42/make_build_dir job_size:13847
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/leap42/config job_size:14739
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/leap42/build job_size:14009
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/leap42/test job_size:14839
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/leap42/add_write_perm job_size:14528
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/leap42/install job_size:14638
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/leap42/install_log job_size:18038
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/leap42/remove_write_perm job_size:14567
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/leap42/module_sync job_size:13567
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/leap42/wipe_build job_size:15116
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappb/var_summary job_size:15349
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappb
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappb/git_srcs job_size:15109
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappb/make_build_dir job_size:13858
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappb/config job_size:14751
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappb/build job_size:14024
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappb/test job_size:14854
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappb/add_write_perm job_size:14543
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappb/install job_size:14652
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappb/install_log job_size:18050
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappb/remove_write_perm job_size:14582
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappb/module_sync job_size:13582
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/sappb/wipe_build job_size:15137
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cca/var_summary job_size:35771
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cca
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cca/git_srcs job_size:35679
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cca/make_build_dir job_size:34404
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cca/config job_size:35184
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cca/build job_size:34324
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cca/test job_size:35132
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cca/add_write_perm job_size:35041
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cca/install job_size:35008
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cca/install_log job_size:38484
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cca/remove_write_perm job_size:35146
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cca/module_sync job_size:34000
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/cca/wipe_build job_size:35561
+WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ccb/var_summary job_size:35771
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ccb
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ccb/git_srcs job_size:35679
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ccb/make_build_dir job_size:34404
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ccb/config job_size:35184
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ccb/build job_size:34324
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ccb/test job_size:35132
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ccb/add_write_perm job_size:35041
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ccb/install job_size:35008
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ccb/install_log job_size:38484
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ccb/remove_write_perm job_size:35146
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ccb/module_sync job_size:34000
+LOG:[12:55:58 13.4.2017] submitted: /ecbuild/ccb/wipe_build job_size:35561
+LOG:[12:55:58 13.4.2017] submitted: /fdb/regenerate job_size:15277
+LOG:[12:55:58 13.4.2017] submitted: /fdb
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.49/var_summary job_size:35830
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.49
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.49/git_srcs job_size:35751
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.49/make_build_dir job_size:34476
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.49/config job_size:35240
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.49/build job_size:34388
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.49/test job_size:35196
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.49/install job_size:35075
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.49/install_log job_size:38640
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.49/remove_write_perm job_size:35211
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.49/module_sync job_size:34058
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.49/wipe_build job_size:35626
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.53/var_summary job_size:35830
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.53/git_srcs job_size:35751
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.53/make_build_dir job_size:34476
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.53/config job_size:35240
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.53/build job_size:34388
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.53/test job_size:35196
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.53/install job_size:35075
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.53/install_log job_size:38640
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.53/remove_write_perm job_size:35211
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.53/module_sync job_size:34058
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/gnu.53/wipe_build job_size:35626
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.14/var_summary job_size:35895
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.14
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.14/git_srcs job_size:35846
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.14/make_build_dir job_size:34545
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.14/config job_size:35305
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.14/build job_size:34449
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.14/test job_size:35257
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.14/install job_size:35138
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.14/install_log job_size:38707
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.14/remove_write_perm job_size:35272
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.14/module_sync job_size:34117
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.14/wipe_build job_size:35691
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.15/var_summary job_size:35895
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.15
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.15/git_srcs job_size:35846
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.15/make_build_dir job_size:34545
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.15/config job_size:35305
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.15/build job_size:34449
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.15/test job_size:35257
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.15/install job_size:35138
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.15/install_log job_size:38707
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.15/remove_write_perm job_size:35272
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.15/module_sync job_size:34117
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.15/wipe_build job_size:35691
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.16/var_summary job_size:35871
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.16
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.16/git_srcs job_size:35822
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.16/make_build_dir job_size:34521
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.16/config job_size:35281
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.16/build job_size:34425
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.16/test job_size:35233
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.16/install job_size:35114
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.16/install_log job_size:38683
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.16/remove_write_perm job_size:35248
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.16/module_sync job_size:34093
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/intel.16/wipe_build job_size:35667
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.84/var_summary job_size:35797
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.84
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.84/git_srcs job_size:35733
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.84/make_build_dir job_size:34445
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.84/config job_size:35207
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.84/build job_size:34353
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.84/test job_size:35161
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.84/install job_size:35041
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.84/install_log job_size:38608
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.84/remove_write_perm job_size:35176
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.84/module_sync job_size:34022
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.84/wipe_build job_size:35593
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.846/var_summary job_size:35825
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.846
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.846/git_srcs job_size:35776
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.846/make_build_dir job_size:34475
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.846/config job_size:35235
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.846/build job_size:34379
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.846/test job_size:35187
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.846/install job_size:35068
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.846/install_log job_size:38637
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.846/remove_write_perm job_size:35202
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.846/module_sync job_size:34047
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cca/cray.846/wipe_build job_size:35621
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.49/var_summary job_size:35830
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.49
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.49/git_srcs job_size:35751
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.49/make_build_dir job_size:34476
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.49/config job_size:35240
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.49/build job_size:34388
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.49/test job_size:35196
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.49/install job_size:35075
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.49/install_log job_size:38640
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.49/remove_write_perm job_size:35211
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.49/module_sync job_size:34058
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.49/wipe_build job_size:35626
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.53/var_summary job_size:35830
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.53/git_srcs job_size:35751
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.53/make_build_dir job_size:34476
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.53/config job_size:35240
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.53/build job_size:34388
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.53/test job_size:35196
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.53/install job_size:35075
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.53/install_log job_size:38640
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.53/remove_write_perm job_size:35211
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.53/module_sync job_size:34058
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/gnu.53/wipe_build job_size:35626
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.14/var_summary job_size:35895
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.14
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.14/git_srcs job_size:35846
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.14/make_build_dir job_size:34545
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.14/config job_size:35305
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.14/build job_size:34449
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.14/test job_size:35257
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.14/install job_size:35138
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.14/install_log job_size:38707
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.14/remove_write_perm job_size:35272
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.14/module_sync job_size:34117
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.14/wipe_build job_size:35691
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.15/var_summary job_size:35895
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.15
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.15/git_srcs job_size:35846
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.15/make_build_dir job_size:34545
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.15/config job_size:35305
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.15/build job_size:34449
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.15/test job_size:35257
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.15/install job_size:35138
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.15/install_log job_size:38707
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.15/remove_write_perm job_size:35272
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.15/module_sync job_size:34117
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.15/wipe_build job_size:35691
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.16/var_summary job_size:35871
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.16
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.16/git_srcs job_size:35822
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.16/make_build_dir job_size:34521
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.16/config job_size:35281
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.16/build job_size:34425
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.16/test job_size:35233
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.16/install job_size:35114
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.16/install_log job_size:38683
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.16/remove_write_perm job_size:35248
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.16/module_sync job_size:34093
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/intel.16/wipe_build job_size:35667
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.84/var_summary job_size:35797
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.84
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.84/git_srcs job_size:35733
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.84/make_build_dir job_size:34445
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.84/config job_size:35207
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.84/build job_size:34353
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.84/test job_size:35161
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.84/install job_size:35041
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.84/install_log job_size:38608
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.84/remove_write_perm job_size:35176
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.84/module_sync job_size:34022
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.84/wipe_build job_size:35593
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.846/var_summary job_size:35825
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.846
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.846/git_srcs job_size:35776
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.846/make_build_dir job_size:34475
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.846/config job_size:35235
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.846/build job_size:34379
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.846/test job_size:35187
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.846/install job_size:35068
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.846/install_log job_size:38637
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.846/remove_write_perm job_size:35202
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.846/module_sync job_size:34047
+LOG:[12:55:58 13.4.2017] submitted: /fdb/ccb/cray.846/wipe_build job_size:35621
+WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.49/var_summary job_size:35830
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.49
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.49/git_srcs job_size:35751
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.49/make_build_dir job_size:34476
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.49/config job_size:35240
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.49/build job_size:34388
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.49/test job_size:35196
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.49/install job_size:35075
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.49/install_log job_size:38640
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.49/remove_write_perm job_size:35211
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.49/module_sync job_size:34058
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.49/wipe_build job_size:35626
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.53/var_summary job_size:35830
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.53/git_srcs job_size:35751
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.53/make_build_dir job_size:34476
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.53/config job_size:35240
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.53/build job_size:34388
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.53/test job_size:35196
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.53/install job_size:35075
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.53/install_log job_size:38640
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.53/remove_write_perm job_size:35211
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.53/module_sync job_size:34058
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/gnu.53/wipe_build job_size:35626
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.14/var_summary job_size:35895
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.14
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.14/git_srcs job_size:35846
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.14/make_build_dir job_size:34545
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.14/config job_size:35305
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.14/build job_size:34449
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.14/test job_size:35257
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.14/install job_size:35138
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.14/install_log job_size:38707
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.14/remove_write_perm job_size:35272
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.14/module_sync job_size:34117
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.14/wipe_build job_size:35691
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.15/var_summary job_size:35895
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.15
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.15/git_srcs job_size:35846
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.15/make_build_dir job_size:34545
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.15/config job_size:35305
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.15/build job_size:34449
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.15/test job_size:35257
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.15/install job_size:35138
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.15/install_log job_size:38707
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.15/remove_write_perm job_size:35272
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.15/module_sync job_size:34117
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.15/wipe_build job_size:35691
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.16/var_summary job_size:35895
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.16
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.16/git_srcs job_size:35846
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.16/make_build_dir job_size:34545
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.16/config job_size:35305
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.16/build job_size:34449
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.16/test job_size:35257
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.16/install job_size:35138
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.16/install_log job_size:38707
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.16/remove_write_perm job_size:35272
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.16/module_sync job_size:34117
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/intel.16/wipe_build job_size:35691
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.84/var_summary job_size:35797
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.84
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.84/git_srcs job_size:35733
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.84/make_build_dir job_size:34445
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.84/config job_size:35207
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.84/build job_size:34353
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.84/test job_size:35161
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.84/install job_size:35041
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.84/install_log job_size:38608
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.84/remove_write_perm job_size:35176
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.84/module_sync job_size:34022
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.84/wipe_build job_size:35593
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.85/var_summary job_size:35797
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.85
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.85/git_srcs job_size:35733
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.85/make_build_dir job_size:34445
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.85/config job_size:35207
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.85/build job_size:34353
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.85/test job_size:35161
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.85/install job_size:35041
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.85/install_log job_size:38608
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.85/remove_write_perm job_size:35176
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.85/module_sync job_size:34022
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.85/wipe_build job_size:35593
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.846/var_summary job_size:35825
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.846
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.846/git_srcs job_size:35776
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.846/make_build_dir job_size:34475
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.846/config job_size:35235
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.846/build job_size:34379
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.846/test job_size:35187
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.846/install job_size:35068
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.846/install_log job_size:38637
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.846/remove_write_perm job_size:35202
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.846/module_sync job_size:34047
+LOG:[12:55:58 13.4.2017] submitted: /fdb/cct/cray.846/wipe_build job_size:35621
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/regenerate job_size:15467
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxop_dev/var_summary job_size:15489
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxop_dev
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxop_dev/git_srcs job_size:15555
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxop_dev/make_build_dir job_size:14033
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxop_dev/config job_size:14898
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxop_dev/install job_size:14790
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxop_dev/install_log job_size:18081
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxop_dev/remove_write_perm job_size:14751
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cck/var_summary job_size:36048
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cck
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cck/git_srcs job_size:36091
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cck/make_build_dir job_size:34675
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cck/config job_size:35410
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cck/install job_size:35272
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cck/install_log job_size:38642
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cck/remove_write_perm job_size:35453
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cct/var_summary job_size:36068
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cct
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cct/git_srcs job_size:36111
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cct/make_build_dir job_size:34695
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cct/config job_size:35430
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cct/install job_size:35292
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cct/install_log job_size:38662
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cct/remove_write_perm job_size:35473
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/sappa/var_summary job_size:15467
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/sappa
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/sappa/git_srcs job_size:15362
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/sappa/make_build_dir job_size:13970
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/sappa/config job_size:14830
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/sappa/install job_size:14757
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/sappa/install_log job_size:18049
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/sappa/remove_write_perm job_size:14718
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/ecgb/var_summary job_size:15420
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/ecgb
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/ecgb/git_srcs job_size:15372
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/ecgb/make_build_dir job_size:13941
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/ecgb/config job_size:14795
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/ecgb/install job_size:14719
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/ecgb/install_log job_size:18005
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/ecgb/remove_write_perm job_size:14680
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxg/var_summary job_size:15405
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxg
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxg/git_srcs job_size:15288
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxg/make_build_dir job_size:13909
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxg/config job_size:14771
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxg/install job_size:14699
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxg/install_log job_size:17986
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxg/remove_write_perm job_size:14660
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/opensuse131/var_summary job_size:15491
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/opensuse131
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/opensuse131/git_srcs job_size:15476
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/opensuse131/make_build_dir job_size:14006
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/opensuse131/config job_size:14854
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/opensuse131/install job_size:14775
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/opensuse131/install_log job_size:18079
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/opensuse131/remove_write_perm job_size:14736
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxc/var_summary job_size:15406
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxc
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxc/git_srcs job_size:15289
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxc/make_build_dir job_size:13910
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxc/config job_size:14772
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxc/install job_size:14700
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxc/install_log job_size:17987
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/lxc/remove_write_perm job_size:14661
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/leap42/var_summary job_size:15436
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/leap42
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/leap42/git_srcs job_size:15346
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/leap42/make_build_dir job_size:13941
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/leap42/config job_size:14799
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/leap42/install job_size:14725
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/leap42/install_log job_size:18019
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/leap42/remove_write_perm job_size:14686
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/sappb/var_summary job_size:15467
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/sappb
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/sappb/git_srcs job_size:15362
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/sappb/make_build_dir job_size:13970
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/sappb/config job_size:14830
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/sappb/install job_size:14757
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/sappb/install_log job_size:18049
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/sappb/remove_write_perm job_size:14718
+WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cca/var_summary job_size:36068
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cca
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cca/git_srcs job_size:36111
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cca/make_build_dir job_size:34695
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cca/config job_size:35430
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cca/install job_size:35292
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cca/install_log job_size:38662
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/cca/remove_write_perm job_size:35473
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/ccb/var_summary job_size:36068
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/ccb
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/ccb/git_srcs job_size:36111
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/ccb/make_build_dir job_size:34695
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/ccb/config job_size:35430
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/ccb/install job_size:35292
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/ccb/install_log job_size:38662
+LOG:[12:55:58 13.4.2017] submitted: /bufrdc_tables/ccb/remove_write_perm job_size:35473
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/regenerate job_size:15370
+LOG:[12:55:58 13.4.2017] submitted: /grib_api
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.49/var_summary job_size:15515
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.49
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.49/git_srcs job_size:15558
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.49/make_build_dir job_size:14073
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.49/config job_size:15018
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.49/build job_size:14171
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.49/test job_size:15001
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.49/install job_size:14855
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.49/post_install job_size:14902
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.49/install_check job_size:16373
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.49/install_log job_size:18691
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.49/remove_write_perm job_size:14768
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.49/module_sync job_size:13712
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.49/wipe_build job_size:15312
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.53/var_summary job_size:15539
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.53/git_srcs job_size:15582
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.53/make_build_dir job_size:14097
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.53/config job_size:15042
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.53/build job_size:14195
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.53/test job_size:15025
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.53/install job_size:14879
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.53/post_install job_size:14926
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.53/install_check job_size:16397
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.53/install_log job_size:18715
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.53/remove_write_perm job_size:14792
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.53/module_sync job_size:13736
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxop_dev/gnu.53/wipe_build job_size:15336
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.53/var_summary job_size:36087
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.53/git_srcs job_size:36107
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.53/make_build_dir job_size:34728
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.53/config job_size:35515
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.53/build job_size:34620
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.53/test job_size:35428
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.53/install job_size:35322
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.53/post_install job_size:35474
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.53/install_check job_size:36967
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.53/install_log job_size:38957
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.53/remove_write_perm job_size:35453
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.53/module_sync job_size:34290
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.53/wipe_build job_size:35873
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.62/var_summary job_size:36087
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.62
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.62/git_srcs job_size:36107
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.62/make_build_dir job_size:34728
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.62/config job_size:35515
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.62/build job_size:34620
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.62/test job_size:35428
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.62/install job_size:35322
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.62/post_install job_size:35474
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.62/install_check job_size:36967
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.62/install_log job_size:38957
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.62/remove_write_perm job_size:35453
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.62/module_sync job_size:34290
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/gnu.62/wipe_build job_size:35873
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/intel.17/var_summary job_size:36121
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/intel.17
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/intel.17/git_srcs job_size:36171
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/intel.17/make_build_dir job_size:34766
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/intel.17/config job_size:35549
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/intel.17/build job_size:34650
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/intel.17/test job_size:35458
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/intel.17/install job_size:35354
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/intel.17/post_install job_size:35504
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/intel.17/install_check job_size:36999
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/intel.17/install_log job_size:38993
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/intel.17/remove_write_perm job_size:35483
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/intel.17/module_sync job_size:34318
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/intel.17/wipe_build job_size:35907
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/cray.85/var_summary job_size:36054
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/cray.85
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/cray.85/git_srcs job_size:36089
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/cray.85/make_build_dir job_size:34697
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/cray.85/config job_size:35482
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/cray.85/build job_size:34585
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/cray.85/test job_size:35393
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/cray.85/install job_size:35288
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/cray.85/post_install job_size:35439
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/cray.85/install_check job_size:36933
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/cray.85/install_log job_size:38925
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/cray.85/remove_write_perm job_size:35418
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/cray.85/module_sync job_size:34254
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cck/cray.85/wipe_build job_size:35840
+WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.49/var_summary job_size:36130
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.49
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.49/git_srcs job_size:36150
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.49/make_build_dir job_size:34771
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.49/config job_size:35577
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.49/build job_size:34663
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.49/test job_size:35471
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.49/install job_size:35365
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.49/post_install job_size:35517
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.49/install_check job_size:37010
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.49/install_log job_size:39000
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.49/remove_write_perm job_size:35496
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.49/module_sync job_size:34333
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.49/wipe_build job_size:35916
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.53/var_summary job_size:36130
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.53/git_srcs job_size:36150
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.53/make_build_dir job_size:34771
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.53/config job_size:35577
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.53/build job_size:34663
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.53/test job_size:35471
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.53/install job_size:35365
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.53/post_install job_size:35517
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.53/install_check job_size:37010
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.53/install_log job_size:39000
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.53/remove_write_perm job_size:35496
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.53/module_sync job_size:34333
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/gnu.53/wipe_build job_size:35916
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.14/var_summary job_size:36195
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.14
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.14/git_srcs job_size:36245
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.14/make_build_dir job_size:34840
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.14/config job_size:35662
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.14/build job_size:34724
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.14/test job_size:35532
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.14/install job_size:35428
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.14/post_install job_size:35578
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.14/install_check job_size:37073
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.14/install_log job_size:39067
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.14/remove_write_perm job_size:35557
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.14/module_sync job_size:34392
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.14/wipe_build job_size:35981
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.15/var_summary job_size:36195
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.15
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.15/git_srcs job_size:36245
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.15/make_build_dir job_size:34840
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.15/config job_size:35662
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.15/build job_size:34724
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.15/test job_size:35532
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.15/install job_size:35428
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.15/post_install job_size:35578
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.15/install_check job_size:37073
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.15/install_log job_size:39067
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.15/remove_write_perm job_size:35557
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.15/module_sync job_size:34392
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.15/wipe_build job_size:35981
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.16/var_summary job_size:36195
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.16
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.16/git_srcs job_size:36245
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.16/make_build_dir job_size:34840
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.16/config job_size:35662
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.16/build job_size:34724
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.16/test job_size:35532
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.16/install job_size:35428
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.16/post_install job_size:35578
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.16/install_check job_size:37073
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.16/install_log job_size:39067
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.16/remove_write_perm job_size:35557
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.16/module_sync job_size:34392
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/intel.16/wipe_build job_size:35981
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.84/var_summary job_size:36097
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.84
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.84/git_srcs job_size:36132
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.84/make_build_dir job_size:34740
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.84/config job_size:35632
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.84/build job_size:34628
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.84/test job_size:35436
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.84/install job_size:35331
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.84/post_install job_size:35482
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.84/install_check job_size:36976
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.84/install_log job_size:38968
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.84/remove_write_perm job_size:35461
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.84/module_sync job_size:34297
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.84/wipe_build job_size:35883
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.85/var_summary job_size:36097
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.85
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.85/git_srcs job_size:36132
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.85/make_build_dir job_size:34740
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.85/config job_size:35632
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.85/build job_size:34628
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.85/test job_size:35436
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.85/install job_size:35331
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.85/post_install job_size:35482
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.85/install_check job_size:36976
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.85/install_log job_size:38968
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.85/remove_write_perm job_size:35461
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.85/module_sync job_size:34297
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.85/wipe_build job_size:35883
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.846/var_summary job_size:36125
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.846
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.846/git_srcs job_size:36175
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.846/make_build_dir job_size:34770
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.846/config job_size:35660
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.846/build job_size:34654
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.846/test job_size:35462
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.846/install job_size:35358
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.846/post_install job_size:35508
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.846/install_check job_size:37003
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.846/install_log job_size:38997
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.846/remove_write_perm job_size:35487
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.846/module_sync job_size:34322
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cct/cray.846/wipe_build job_size:35911
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappa/var_summary job_size:15488
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappa
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappa/git_srcs job_size:15273
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappa/make_build_dir job_size:13996
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappa/config job_size:14907
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappa/build job_size:14158
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappa/test job_size:14988
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappa/install job_size:14785
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappa/post_install job_size:14851
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappa/install_check job_size:16321
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappa/install_log job_size:18197
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappa/remove_write_perm job_size:14714
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappa/module_sync job_size:13716
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappa/wipe_build job_size:15274
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.44/var_summary job_size:15474
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.44
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.44/git_srcs job_size:15403
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.44/make_build_dir job_size:14009
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.44/config job_size:14943
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.44/build job_size:14135
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.44/test job_size:14965
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.44/install job_size:14812
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.44/post_install job_size:14866
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.44/install_check job_size:16337
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.44/install_log job_size:18643
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.44/remove_write_perm job_size:14732
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.44/module_sync job_size:13683
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.44/wipe_build job_size:15257
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.53/var_summary job_size:15450
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.53/git_srcs job_size:15379
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.53/make_build_dir job_size:13985
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.53/config job_size:14919
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.53/build job_size:14111
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.53/test job_size:14941
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.53/install job_size:14788
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.53/post_install job_size:14842
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.53/install_check job_size:16313
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.53/install_log job_size:18619
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.53/remove_write_perm job_size:14708
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.53/module_sync job_size:13659
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ecgb/gnu.53/wipe_build job_size:15233
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/gnu.53/var_summary job_size:15430
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/gnu.53/git_srcs job_size:15290
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/gnu.53/make_build_dir job_size:13948
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/gnu.53/config job_size:14890
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/gnu.53/build job_size:14090
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/gnu.53/test job_size:14920
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/gnu.53/install job_size:14763
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/gnu.53/post_install job_size:14818
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/gnu.53/install_check job_size:16289
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/gnu.53/install_log job_size:18595
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/gnu.53/remove_write_perm job_size:14687
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/gnu.53/module_sync job_size:13641
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/gnu.53/wipe_build job_size:15207
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/intel.16/var_summary job_size:15490
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/intel.16
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/intel.16/git_srcs job_size:15380
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/intel.16/make_build_dir job_size:14012
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/intel.16/config job_size:14950
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/intel.16/build job_size:14146
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/intel.16/test job_size:14976
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/intel.16/install job_size:14821
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/intel.16/post_install job_size:14874
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/intel.16/install_check job_size:16347
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/intel.16/install_log job_size:18657
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/intel.16/remove_write_perm job_size:14743
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/intel.16/module_sync job_size:13695
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/intel.16/wipe_build job_size:15267
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/pgi.16/var_summary job_size:15468
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/pgi.16
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/pgi.16/git_srcs job_size:15328
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/pgi.16/make_build_dir job_size:13986
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/pgi.16/config job_size:14965
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/pgi.16/build job_size:14128
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/pgi.16/test job_size:14958
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/pgi.16/install job_size:14801
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/pgi.16/post_install job_size:14856
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/pgi.16/install_check job_size:16327
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/pgi.16/install_log job_size:18633
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/pgi.16/remove_write_perm job_size:14725
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/pgi.16/module_sync job_size:13679
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxg/pgi.16/wipe_build job_size:15245
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.48/var_summary job_size:15514
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.48
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.48/git_srcs job_size:15476
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.48/make_build_dir job_size:14043
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.48/config job_size:14987
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.48/build job_size:14157
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.48/test job_size:14987
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.48/install job_size:14837
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.48/post_install job_size:14909
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.48/install_check job_size:16380
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.48/install_log job_size:18686
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.48/remove_write_perm job_size:14754
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.48/module_sync job_size:13709
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.48/wipe_build job_size:15289
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.53/var_summary job_size:15538
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.53/git_srcs job_size:15500
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.53/make_build_dir job_size:14067
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.53/config job_size:15011
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.53/build job_size:14181
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.53/test job_size:15011
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.53/install job_size:14861
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.53/post_install job_size:14933
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.53/install_check job_size:16404
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.53/install_log job_size:18710
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.53/remove_write_perm job_size:14778
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.53/module_sync job_size:13733
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.53/wipe_build job_size:15313
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.61/var_summary job_size:15538
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.61
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.61/git_srcs job_size:15500
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.61/make_build_dir job_size:14067
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.61/config job_size:15011
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.61/build job_size:14181
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.61/test job_size:15011
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.61/install job_size:14861
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.61/post_install job_size:14933
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.61/install_check job_size:16404
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.61/install_log job_size:18710
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.61/remove_write_perm job_size:14778
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.61/module_sync job_size:13733
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/gnu.61/wipe_build job_size:15313
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/pgi/var_summary job_size:15540
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/pgi
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/pgi/git_srcs job_size:15457
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/pgi/make_build_dir job_size:14063
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/pgi/config job_size:15050
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/pgi/build job_size:14189
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/pgi/test job_size:15019
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/pgi/install job_size:14866
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/pgi/post_install job_size:14941
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/pgi/install_check job_size:16409
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/pgi/install_log job_size:18709
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/pgi/remove_write_perm job_size:14786
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/pgi/module_sync job_size:13744
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/opensuse131/pgi/wipe_build job_size:15315
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.49/var_summary job_size:15431
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.49
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.49/git_srcs job_size:15291
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.49/make_build_dir job_size:13949
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.49/config job_size:14891
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.49/build job_size:14091
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.49/test job_size:14921
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.49/install job_size:14764
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.49/post_install job_size:14819
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.49/install_check job_size:16290
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.49/install_log job_size:18596
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.49/remove_write_perm job_size:14688
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.49/module_sync job_size:13642
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.49/wipe_build job_size:15208
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.53/var_summary job_size:15455
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.53/git_srcs job_size:15315
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.53/make_build_dir job_size:13973
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.53/config job_size:14915
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.53/build job_size:14115
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.53/test job_size:14945
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.53/install job_size:14788
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.53/post_install job_size:14843
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.53/install_check job_size:16314
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.53/install_log job_size:18620
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.53/remove_write_perm job_size:14712
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.53/module_sync job_size:13666
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/gnu.53/wipe_build job_size:15232
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/pgi/var_summary job_size:15439
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/pgi
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/pgi/git_srcs job_size:15254
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/pgi/make_build_dir job_size:13951
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/pgi/config job_size:14936
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/pgi/build job_size:14105
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/pgi/test job_size:14935
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/pgi/install job_size:14775
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/pgi/post_install job_size:14833
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/pgi/install_check job_size:16301
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/pgi/install_log job_size:18601
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/pgi/remove_write_perm job_size:14702
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/pgi/module_sync job_size:13659
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/lxc/pgi/wipe_build job_size:15216
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.53/var_summary job_size:15464
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.53/git_srcs job_size:15351
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.53/make_build_dir job_size:13983
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.53/config job_size:14937
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.53/build job_size:14117
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.53/test job_size:14947
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.53/install job_size:14792
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.53/post_install job_size:14854
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.53/install_check job_size:16325
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.53/install_log job_size:18631
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.53/remove_write_perm job_size:14714
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.53/module_sync job_size:13669
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.53/wipe_build job_size:15239
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.61/var_summary job_size:15488
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.61
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.61/git_srcs job_size:15375
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.61/make_build_dir job_size:14007
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.61/config job_size:14961
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.61/build job_size:14141
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.61/test job_size:14971
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.61/install job_size:14816
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.61/post_install job_size:14878
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.61/install_check job_size:16349
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.61/install_log job_size:18655
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.61/remove_write_perm job_size:14738
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.61/module_sync job_size:13693
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/gnu.61/wipe_build job_size:15263
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/pgi/var_summary job_size:15490
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/pgi
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/pgi/git_srcs job_size:15332
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/pgi/make_build_dir job_size:14003
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/pgi/config job_size:15000
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/pgi/build job_size:14149
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/pgi/test job_size:14979
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/pgi/install job_size:14821
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/pgi/post_install job_size:14886
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/pgi/install_check job_size:16354
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/pgi/install_log job_size:18654
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/pgi/remove_write_perm job_size:14746
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/pgi/module_sync job_size:13704
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/leap42/pgi/wipe_build job_size:15265
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappb/var_summary job_size:15488
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappb
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappb/git_srcs job_size:15273
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappb/make_build_dir job_size:13996
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappb/config job_size:14907
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappb/build job_size:14158
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappb/test job_size:14988
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappb/install job_size:14785
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappb/post_install job_size:14851
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappb/install_check job_size:16321
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappb/install_log job_size:18197
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappb/remove_write_perm job_size:14714
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappb/module_sync job_size:13716
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/sappb/wipe_build job_size:15274
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.49/var_summary job_size:36130
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.49
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.49/git_srcs job_size:36150
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.49/make_build_dir job_size:34771
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.49/config job_size:35577
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.49/build job_size:34663
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.49/test job_size:35471
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.49/install job_size:35365
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.49/post_install job_size:35517
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.49/install_check job_size:37010
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.49/install_log job_size:39000
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.49/remove_write_perm job_size:35496
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.49/module_sync job_size:34333
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.49/wipe_build job_size:35916
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.53/var_summary job_size:36130
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.53/git_srcs job_size:36150
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.53/make_build_dir job_size:34771
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.53/config job_size:35577
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.53/build job_size:34663
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.53/test job_size:35471
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.53/install job_size:35365
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.53/post_install job_size:35517
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.53/install_check job_size:37010
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.53/install_log job_size:39000
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.53/remove_write_perm job_size:35496
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.53/module_sync job_size:34333
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/gnu.53/wipe_build job_size:35916
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.14/var_summary job_size:36195
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.14
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.14/git_srcs job_size:36245
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.14/make_build_dir job_size:34840
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.14/config job_size:35662
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.14/build job_size:34724
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.14/test job_size:35532
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.14/install job_size:35428
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.14/post_install job_size:35578
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.14/install_check job_size:37073
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.14/install_log job_size:39067
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.14/remove_write_perm job_size:35557
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.14/module_sync job_size:34392
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.14/wipe_build job_size:35981
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.15/var_summary job_size:36195
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.15
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.15/git_srcs job_size:36245
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.15/make_build_dir job_size:34840
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.15/config job_size:35662
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.15/build job_size:34724
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.15/test job_size:35532
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.15/install job_size:35428
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.15/post_install job_size:35578
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.15/install_check job_size:37073
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.15/install_log job_size:39067
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.15/remove_write_perm job_size:35557
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.15/module_sync job_size:34392
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.15/wipe_build job_size:35981
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.16/var_summary job_size:36171
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.16
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.16/git_srcs job_size:36221
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.16/make_build_dir job_size:34816
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.16/config job_size:35638
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.16/build job_size:34700
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.16/test job_size:35508
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.16/install job_size:35404
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.16/post_install job_size:35554
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.16/install_check job_size:37049
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.16/install_log job_size:39043
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.16/remove_write_perm job_size:35533
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.16/module_sync job_size:34368
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/intel.16/wipe_build job_size:35957
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.84/var_summary job_size:36097
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.84
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.84/git_srcs job_size:36132
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.84/make_build_dir job_size:34740
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.84/config job_size:35632
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.84/build job_size:34628
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.84/test job_size:35436
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.84/install job_size:35331
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.84/post_install job_size:35482
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.84/install_check job_size:36976
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.84/install_log job_size:38968
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.84/remove_write_perm job_size:35461
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.84/module_sync job_size:34297
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.84/wipe_build job_size:35883
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.846/var_summary job_size:36125
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.846
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.846/git_srcs job_size:36175
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.846/make_build_dir job_size:34770
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.846/config job_size:35660
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.846/build job_size:34654
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.846/test job_size:35462
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.846/install job_size:35358
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.846/post_install job_size:35508
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.846/install_check job_size:37003
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.846/install_log job_size:38997
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.846/remove_write_perm job_size:35487
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.846/module_sync job_size:34322
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/cca/cray.846/wipe_build job_size:35911
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.49/var_summary job_size:36130
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.49
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.49/git_srcs job_size:36150
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.49/make_build_dir job_size:34771
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.49/config job_size:35577
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.49/build job_size:34663
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.49/test job_size:35471
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.49/install job_size:35365
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.49/post_install job_size:35517
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.49/install_check job_size:37010
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.49/install_log job_size:39000
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.49/remove_write_perm job_size:35496
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.49/module_sync job_size:34333
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.49/wipe_build job_size:35916
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.53/var_summary job_size:36130
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.53/git_srcs job_size:36150
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.53/make_build_dir job_size:34771
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.53/config job_size:35577
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.53/build job_size:34663
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.53/test job_size:35471
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.53/install job_size:35365
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.53/post_install job_size:35517
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.53/install_check job_size:37010
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.53/install_log job_size:39000
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.53/remove_write_perm job_size:35496
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.53/module_sync job_size:34333
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/gnu.53/wipe_build job_size:35916
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.14/var_summary job_size:36195
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.14
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.14/git_srcs job_size:36245
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.14/make_build_dir job_size:34840
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.14/config job_size:35662
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.14/build job_size:34724
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.14/test job_size:35532
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.14/install job_size:35428
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.14/post_install job_size:35578
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.14/install_check job_size:37073
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.14/install_log job_size:39067
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.14/remove_write_perm job_size:35557
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.14/module_sync job_size:34392
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.14/wipe_build job_size:35981
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.15/var_summary job_size:36195
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.15
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.15/git_srcs job_size:36245
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.15/make_build_dir job_size:34840
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.15/config job_size:35662
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.15/build job_size:34724
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.15/test job_size:35532
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.15/install job_size:35428
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.15/post_install job_size:35578
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.15/install_check job_size:37073
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.15/install_log job_size:39067
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.15/remove_write_perm job_size:35557
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.15/module_sync job_size:34392
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.15/wipe_build job_size:35981
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.16/var_summary job_size:36171
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.16
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.16/git_srcs job_size:36221
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.16/make_build_dir job_size:34816
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.16/config job_size:35638
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.16/build job_size:34700
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.16/test job_size:35508
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.16/install job_size:35404
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.16/post_install job_size:35554
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.16/install_check job_size:37049
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.16/install_log job_size:39043
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.16/remove_write_perm job_size:35533
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.16/module_sync job_size:34368
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/intel.16/wipe_build job_size:35957
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.84/var_summary job_size:36097
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.84
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.84/git_srcs job_size:36132
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.84/make_build_dir job_size:34740
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.84/config job_size:35632
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.84/build job_size:34628
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.84/test job_size:35436
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.84/install job_size:35331
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.84/post_install job_size:35482
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.84/install_check job_size:36976
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.84/install_log job_size:38968
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.84/remove_write_perm job_size:35461
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.84/module_sync job_size:34297
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.84/wipe_build job_size:35883
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.846/var_summary job_size:36125
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.846
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.846/git_srcs job_size:36175
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.846/make_build_dir job_size:34770
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.846/config job_size:35660
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.846/build job_size:34654
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.846/test job_size:35462
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.846/install job_size:35358
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.846/post_install job_size:35508
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.846/install_check job_size:37003
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.846/install_log job_size:38997
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.846/remove_write_perm job_size:35487
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.846/module_sync job_size:34322
+LOG:[12:55:58 13.4.2017] submitted: /grib_api/ccb/cray.846/wipe_build job_size:35911
+WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/regenerate job_size:15649
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxop_dev/var_summary job_size:15755
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxop_dev
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxop_dev/git_srcs job_size:15896
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxop_dev/make_build_dir job_size:14297
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxop_dev/config job_size:15239
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxop_dev/build job_size:14391
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxop_dev/install job_size:15049
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxop_dev/tests/archive job_size:15760
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxop_dev/tests
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxop_dev/tests/bad_archive job_size:16429
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxop_dev/tests/environment job_size:16364
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxop_dev/install_log job_size:18499
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxop_dev/remove_write_perm job_size:14963
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxop_dev/wipe_build job_size:15533
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cck/var_summary job_size:36374
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cck
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cck/git_srcs job_size:36492
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cck/make_build_dir job_size:34999
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cck/config job_size:35741
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cck/build job_size:34887
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cck/install job_size:35591
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cck/tests/archive job_size:36404
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cck/tests
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cck/tests/bad_archive job_size:37161
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cck/tests/environment job_size:37096
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cck/install_log job_size:39120
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cck/remove_write_perm job_size:35723
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cck/wipe_build job_size:36148
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cct/var_summary job_size:36452
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cct
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cct/git_srcs job_size:36570
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cct/make_build_dir job_size:35077
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cct/config job_size:35834
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cct/build job_size:34965
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cct/install job_size:35669
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cct/tests/archive job_size:36482
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cct/tests
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cct/tests/bad_archive job_size:37239
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cct/tests/environment job_size:37174
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cct/install_log job_size:39198
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cct/remove_write_perm job_size:35801
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cct/wipe_build job_size:36226
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ecgb/var_summary job_size:15694
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ecgb
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ecgb/git_srcs job_size:15721
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ecgb/make_build_dir job_size:14213
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ecgb/config job_size:15074
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ecgb/build job_size:14335
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ecgb/install job_size:14986
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ecgb/tests/archive job_size:15704
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ecgb/tests
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ecgb/tests/bad_archive job_size:16373
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ecgb/tests/environment job_size:16308
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ecgb/install_log job_size:18431
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ecgb/remove_write_perm job_size:14907
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ecgb/wipe_build job_size:15458
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxg/var_summary job_size:15692
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxg
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxg/git_srcs job_size:15650
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxg/make_build_dir job_size:14194
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxg/config job_size:15133
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxg/build job_size:14332
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxg/install job_size:14979
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxg/tests/archive job_size:15701
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxg/tests
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxg/tests/bad_archive job_size:16370
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxg/tests/environment job_size:16305
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxg/install_log job_size:18425
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxg/remove_write_perm job_size:14904
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxg/wipe_build job_size:15450
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/opensuse131/var_summary job_size:15739
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/opensuse131
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/opensuse131/git_srcs job_size:15799
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/opensuse131/make_build_dir job_size:14252
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/opensuse131/config job_size:15107
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/opensuse131/build job_size:14362
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/opensuse131/install job_size:15016
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/opensuse131/tests/archive job_size:15731
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/opensuse131/tests
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/opensuse131/tests/bad_archive job_size:16400
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/opensuse131/tests/environment job_size:16335
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/opensuse131/install_log job_size:18479
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/opensuse131/remove_write_perm job_size:14934
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/opensuse131/wipe_build job_size:15495
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxc/var_summary job_size:15674
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxc
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxc/git_srcs job_size:15632
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxc/make_build_dir job_size:14176
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxc/config job_size:15115
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxc/build job_size:14314
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxc/install job_size:14961
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxc/tests/archive job_size:15683
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxc/tests
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxc/tests/bad_archive job_size:16352
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxc/tests/environment job_size:16287
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxc/install_log job_size:18407
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxc/remove_write_perm job_size:14886
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/lxc/wipe_build job_size:15432
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/leap42/var_summary job_size:15684
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/leap42
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/leap42/git_srcs job_size:15669
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/leap42/make_build_dir job_size:14187
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/leap42/config job_size:15052
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/leap42/build job_size:14317
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/leap42/install job_size:14966
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/leap42/tests/archive job_size:15686
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/leap42/tests
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/leap42/tests/bad_archive job_size:16355
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/leap42/tests/environment job_size:16290
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/leap42/install_log job_size:18419
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/leap42/remove_write_perm job_size:14889
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/leap42/wipe_build job_size:15440
+WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cca/var_summary job_size:36452
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cca
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cca/git_srcs job_size:36570
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cca/make_build_dir job_size:35077
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cca/config job_size:35834
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cca/build job_size:34965
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cca/install job_size:35669
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cca/tests/archive job_size:36482
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cca/tests
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cca/tests/bad_archive job_size:37239
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cca/tests/environment job_size:37174
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cca/install_log job_size:39198
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cca/remove_write_perm job_size:35801
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/cca/wipe_build job_size:36226
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ccb/var_summary job_size:36452
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ccb
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ccb/git_srcs job_size:36570
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ccb/make_build_dir job_size:35077
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ccb/config job_size:35834
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ccb/build job_size:34965
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ccb/install job_size:35669
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ccb/tests/archive job_size:36482
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ccb/tests
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ccb/tests/bad_archive job_size:37239
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ccb/tests/environment job_size:37174
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ccb/install_log job_size:39198
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ccb/remove_write_perm job_size:35801
+LOG:[12:55:58 13.4.2017] submitted: /mars_client_mir/ccb/wipe_build job_size:36226
+LOG:[12:55:58 13.4.2017] submitted: /boost/regenerate job_size:15315
+LOG:[12:55:58 13.4.2017] submitted: /boost
+LOG:[12:55:58 13.4.2017] submitted: /boost/localhost/gnu.53/var_summary job_size:15494
+LOG:[12:55:58 13.4.2017] submitted: /boost/localhost/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /boost/localhost
+LOG:[12:55:58 13.4.2017] submitted: /boost/localhost/gnu.53/download job_size:14399
+LOG:[12:55:58 13.4.2017] submitted: /boost/localhost/gnu.53/copy_and_untar job_size:14632
+LOG:[12:55:58 13.4.2017] submitted: /boost/localhost/gnu.53/clean_build_dir job_size:13900
+LOG:[12:55:58 13.4.2017] submitted: /boost/localhost/gnu.53/build job_size:19237
+LOG:[12:55:58 13.4.2017] submitted: /boost/localhost/gnu.53/remove_source_dir job_size:13844
+WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/regenerate job_size:15353
+LOG:[12:55:58 13.4.2017] submitted: /odb_api
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.49/var_summary job_size:15607
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.49
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.49/git_srcs job_size:15626
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.49/make_build_dir job_size:14166
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.49/config job_size:15259
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.49/build job_size:14268
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.49/test job_size:15067
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.49/add_write_perm job_size:14829
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.49/install job_size:14953
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.49/install_log job_size:18776
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.49/remove_write_perm job_size:14868
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.49/module_sync job_size:13809
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.49/wipe_build job_size:15407
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.53/var_summary job_size:15631
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.53/git_srcs job_size:15650
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.53/make_build_dir job_size:14190
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.53/config job_size:15283
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.53/build job_size:14292
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.53/test job_size:15091
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.53/add_write_perm job_size:14853
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.53/install job_size:14977
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.53/install_log job_size:18800
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.53/remove_write_perm job_size:14892
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.53/module_sync job_size:13833
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/lxop_dev/gnu.53/wipe_build job_size:15431
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck/gnu.53/var_summary job_size:36103
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck/gnu.53
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck/gnu.53/git_srcs job_size:36099
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck/gnu.53/make_build_dir job_size:34745
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck/gnu.53/config job_size:35570
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck/gnu.53/build job_size:34641
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck/gnu.53/test job_size:35418
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck/gnu.53/add_write_perm job_size:35372
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck/gnu.53/install job_size:35344
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck/gnu.53/install_log job_size:38966
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck/gnu.53/remove_write_perm job_size:35477
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck/gnu.53/module_sync job_size:34311
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck/gnu.53/wipe_build job_size:35891
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck/gnu.62/var_summary job_size:36103
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck/gnu.62
+LOG:[12:55:58 13.4.2017] submitted: /odb_api/cck/gnu.62/git_srcs job_size:36099
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/gnu.62/make_build_dir job_size:34745
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/gnu.62/config job_size:35570
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/gnu.62/build job_size:34641
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/gnu.62/test job_size:35418
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/gnu.62/add_write_perm job_size:35372
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/gnu.62/install job_size:35344
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/gnu.62/install_log job_size:38966
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/gnu.62/remove_write_perm job_size:35477
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/gnu.62/module_sync job_size:34311
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/gnu.62/wipe_build job_size:35891
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/intel.17/var_summary job_size:36137
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/intel.17
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/intel.17/git_srcs job_size:36163
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/intel.17/make_build_dir job_size:34783
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/intel.17/config job_size:35604
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/intel.17/build job_size:34671
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/intel.17/test job_size:35448
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/intel.17/add_write_perm job_size:35402
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/intel.17/install job_size:35376
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/intel.17/install_log job_size:39002
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/intel.17/remove_write_perm job_size:35507
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/intel.17/module_sync job_size:34339
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/intel.17/wipe_build job_size:35925
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/cray.85/var_summary job_size:36070
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/cray.85
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/cray.85/git_srcs job_size:36081
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/cray.85/make_build_dir job_size:34714
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/cray.85/config job_size:35618
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/cray.85/build job_size:34606
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/cray.85/test job_size:35383
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/cray.85/add_write_perm job_size:35337
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/cray.85/install job_size:35310
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/cray.85/install_log job_size:38934
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/cray.85/remove_write_perm job_size:35442
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/cray.85/module_sync job_size:34275
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cck/cray.85/wipe_build job_size:35858
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.49/var_summary job_size:36164
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.49/git_srcs job_size:36160
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.49/make_build_dir job_size:34806
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.49/config job_size:35698
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.49/build job_size:34702
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.49/test job_size:35479
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.49/add_write_perm job_size:35433
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.49/install job_size:35405
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.49/install_log job_size:39027
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.49/remove_write_perm job_size:35538
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.49/module_sync job_size:34372
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.49/wipe_build job_size:35952
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.53/var_summary job_size:36164
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.53/git_srcs job_size:36160
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.53/make_build_dir job_size:34806
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.53/config job_size:35698
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.53/build job_size:34702
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.53/test job_size:35479
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.53/add_write_perm job_size:35433
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.53/install job_size:35405
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.53/install_log job_size:39027
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.53/remove_write_perm job_size:35538
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.53/module_sync job_size:34372
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/gnu.53/wipe_build job_size:35952
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.14/var_summary job_size:36229
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.14
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.14/git_srcs job_size:36255
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.14/make_build_dir job_size:34875
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.14/config job_size:35736
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.14/build job_size:34763
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.14/test job_size:35540
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.14/add_write_perm job_size:35494
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.14/install job_size:35468
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.14/install_log job_size:39094
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.14/remove_write_perm job_size:35599
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.14/module_sync job_size:34431
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.14/wipe_build job_size:36017
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.15/var_summary job_size:36229
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.15
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.15/git_srcs job_size:36255
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.15/make_build_dir job_size:34875
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.15/config job_size:35736
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.15/build job_size:34763
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.15/test job_size:35540
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.15/add_write_perm job_size:35494
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.15/install job_size:35468
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.15/install_log job_size:39094
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.15/remove_write_perm job_size:35599
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.15/module_sync job_size:34431
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.15/wipe_build job_size:36017
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.16/var_summary job_size:36229
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.16/git_srcs job_size:36255
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.16/make_build_dir job_size:34875
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.16/config job_size:35736
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.16/build job_size:34763
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.16/test job_size:35540
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.16/add_write_perm job_size:35494
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.16/install job_size:35468
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.16/install_log job_size:39094
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.16/remove_write_perm job_size:35599
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.16/module_sync job_size:34431
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/intel.16/wipe_build job_size:36017
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.84/var_summary job_size:36213
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.84
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.84/git_srcs job_size:36224
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.84/make_build_dir job_size:34857
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.84/config job_size:35802
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.84/build job_size:34749
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.84/test job_size:35526
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.84/add_write_perm job_size:35480
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.84/install job_size:35453
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.84/install_log job_size:39077
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.84/remove_write_perm job_size:35585
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.84/module_sync job_size:34418
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.84/wipe_build job_size:36001
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.85/var_summary job_size:36213
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.85
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.85/git_srcs job_size:36224
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.85/make_build_dir job_size:34857
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.85/config job_size:35802
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.85/build job_size:34749
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.85/test job_size:35526
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.85/add_write_perm job_size:35480
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.85/install job_size:35453
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.85/install_log job_size:39077
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.85/remove_write_perm job_size:35585
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.85/module_sync job_size:34418
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.85/wipe_build job_size:36001
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.846/var_summary job_size:36241
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.846
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.846/git_srcs job_size:36267
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.846/make_build_dir job_size:34887
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.846/config job_size:35830
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.846/build job_size:34775
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.846/test job_size:35552
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.846/add_write_perm job_size:35506
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.846/install job_size:35480
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.846/install_log job_size:39106
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.846/remove_write_perm job_size:35611
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.846/module_sync job_size:34443
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cct/cray.846/wipe_build job_size:36029
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappa/var_summary job_size:15469
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappa
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappa/git_srcs job_size:15230
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappa/make_build_dir job_size:13978
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappa/config job_size:14968
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappa/build job_size:14144
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappa/test job_size:14943
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappa/add_write_perm job_size:14664
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappa/install job_size:14772
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappa/install_log job_size:18171
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappa/remove_write_perm job_size:14703
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappa/module_sync job_size:13702
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappa/wipe_build job_size:15257
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.44/var_summary job_size:15572
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.44
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.44/git_srcs job_size:15477
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.44/make_build_dir job_size:14108
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.44/config job_size:15122
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.44/build job_size:14238
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.44/test job_size:15037
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.44/add_write_perm job_size:14799
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.44/install job_size:14916
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.44/install_log job_size:18734
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.44/remove_write_perm job_size:14838
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.44/module_sync job_size:13786
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.44/wipe_build job_size:15358
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.53/var_summary job_size:15542
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.53/git_srcs job_size:15447
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.53/make_build_dir job_size:14078
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.53/config job_size:15092
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.53/build job_size:14208
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.53/test job_size:15007
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.53/add_write_perm job_size:14769
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.53/install job_size:14886
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.53/install_log job_size:18704
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.53/remove_write_perm job_size:14808
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.53/module_sync job_size:13756
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ecgb/gnu.53/wipe_build job_size:15328
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/gnu.53/var_summary job_size:15528
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/gnu.53/git_srcs job_size:15364
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/gnu.53/make_build_dir job_size:14047
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/gnu.53/config job_size:15067
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/gnu.53/build job_size:14193
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/gnu.53/test job_size:14992
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/gnu.53/add_write_perm job_size:14754
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/gnu.53/install job_size:14867
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/gnu.53/install_log job_size:18686
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/gnu.53/remove_write_perm job_size:14793
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/gnu.53/module_sync job_size:13744
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/gnu.53/wipe_build job_size:15308
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/intel.16/var_summary job_size:15588
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/intel.16/git_srcs job_size:15454
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/intel.16/make_build_dir job_size:14111
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/intel.16/config job_size:15128
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/intel.16/build job_size:14249
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/intel.16/test job_size:15048
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/intel.16/add_write_perm job_size:14810
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/intel.16/install job_size:14925
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/intel.16/install_log job_size:18748
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/intel.16/remove_write_perm job_size:14849
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/intel.16/module_sync job_size:13798
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxg/intel.16/wipe_build job_size:15368
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.48/var_summary job_size:15612
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.48
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.48/git_srcs job_size:15550
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.48/make_build_dir job_size:14142
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.48/config job_size:15228
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.48/build job_size:14260
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.48/test job_size:15059
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.48/add_write_perm job_size:14821
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.48/install job_size:14941
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.48/install_log job_size:18777
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.48/remove_write_perm job_size:14860
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.48/module_sync job_size:13812
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.48/wipe_build job_size:15390
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.53/var_summary job_size:15636
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.53/git_srcs job_size:15574
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.53/make_build_dir job_size:14166
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.53/config job_size:15195
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.53/build job_size:14284
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.53/test job_size:15083
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.53/add_write_perm job_size:14845
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.53/install job_size:14965
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.53/install_log job_size:18801
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.53/remove_write_perm job_size:14884
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.53/module_sync job_size:13836
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.53/wipe_build job_size:15414
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.61/var_summary job_size:15612
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.61
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.61/git_srcs job_size:15550
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.61/make_build_dir job_size:14142
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.61/config job_size:15149
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.61/build job_size:14260
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.61/test job_size:15059
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.61/add_write_perm job_size:14821
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.61/install job_size:14941
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.61/install_log job_size:18777
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.61/remove_write_perm job_size:14860
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.61/module_sync job_size:13812
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/opensuse131/gnu.61/wipe_build job_size:15390
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.49/var_summary job_size:15529
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.49/git_srcs job_size:15365
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.49/make_build_dir job_size:14048
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.49/config job_size:15138
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.49/build job_size:14194
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.49/test job_size:14993
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.49/add_write_perm job_size:14755
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.49/install job_size:14868
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.49/install_log job_size:18687
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.49/remove_write_perm job_size:14794
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.49/module_sync job_size:13745
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.49/wipe_build job_size:15309
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.53/var_summary job_size:15553
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.53/git_srcs job_size:15389
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.53/make_build_dir job_size:14072
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.53/config job_size:15162
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.53/build job_size:14218
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.53/test job_size:15017
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.53/add_write_perm job_size:14779
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.53/install job_size:14892
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.53/install_log job_size:18711
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.53/remove_write_perm job_size:14818
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.53/module_sync job_size:13769
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/lxc/gnu.53/wipe_build job_size:15333
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.53/var_summary job_size:15562
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.53/git_srcs job_size:15425
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.53/make_build_dir job_size:14082
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.53/config job_size:15121
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.53/build job_size:14220
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.53/test job_size:15019
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.53/add_write_perm job_size:14781
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.53/install job_size:14896
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.53/install_log job_size:18722
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.53/remove_write_perm job_size:14820
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.53/module_sync job_size:13772
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.53/wipe_build job_size:15340
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.61/var_summary job_size:15586
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.61
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.61/git_srcs job_size:15449
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.61/make_build_dir job_size:14106
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.61/config job_size:15145
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.61/build job_size:14244
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.61/test job_size:15043
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.61/add_write_perm job_size:14805
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.61/install job_size:14920
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.61/install_log job_size:18746
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.61/remove_write_perm job_size:14844
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.61/module_sync job_size:13796
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/leap42/gnu.61/wipe_build job_size:15364
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappb/var_summary job_size:15469
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappb
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappb/git_srcs job_size:15230
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappb/make_build_dir job_size:13978
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappb/config job_size:14968
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappb/build job_size:14144
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappb/test job_size:14943
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappb/add_write_perm job_size:14664
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappb/install job_size:14772
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappb/install_log job_size:18171
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappb/remove_write_perm job_size:14703
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappb/module_sync job_size:13702
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/sappb/wipe_build job_size:15257
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.49/var_summary job_size:36164
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.49/git_srcs job_size:36160
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.49/make_build_dir job_size:34806
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.49/config job_size:35698
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.49/build job_size:34702
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.49/test job_size:35479
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.49/add_write_perm job_size:35433
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.49/install job_size:35405
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.49/install_log job_size:39027
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.49/remove_write_perm job_size:35538
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.49/module_sync job_size:34372
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.49/wipe_build job_size:35952
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.53/var_summary job_size:36164
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.53/git_srcs job_size:36160
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.53/make_build_dir job_size:34806
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.53/config job_size:35698
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.53/build job_size:34702
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.53/test job_size:35479
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.53/add_write_perm job_size:35433
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.53/install job_size:35405
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.53/install_log job_size:39027
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.53/remove_write_perm job_size:35538
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.53/module_sync job_size:34372
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/gnu.53/wipe_build job_size:35952
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.14/var_summary job_size:36229
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.14
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.14/git_srcs job_size:36255
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.14/make_build_dir job_size:34875
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.14/config job_size:35736
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.14/build job_size:34763
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.14/test job_size:35540
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.14/add_write_perm job_size:35494
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.14/install job_size:35468
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.14/install_log job_size:39094
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.14/remove_write_perm job_size:35599
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.14/module_sync job_size:34431
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.14/wipe_build job_size:36017
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.15/var_summary job_size:36229
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.15
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.15/git_srcs job_size:36255
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.15/make_build_dir job_size:34875
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.15/config job_size:35736
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.15/build job_size:34763
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.15/test job_size:35540
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.15/add_write_perm job_size:35494
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.15/install job_size:35468
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.15/install_log job_size:39094
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.15/remove_write_perm job_size:35599
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.15/module_sync job_size:34431
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.15/wipe_build job_size:36017
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.16/var_summary job_size:36205
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.16/git_srcs job_size:36231
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.16/make_build_dir job_size:34851
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.16/config job_size:35712
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.16/build job_size:34739
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.16/test job_size:35516
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.16/add_write_perm job_size:35470
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.16/install job_size:35444
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.16/install_log job_size:39070
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.16/remove_write_perm job_size:35575
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.16/module_sync job_size:34407
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/intel.16/wipe_build job_size:35993
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.84/var_summary job_size:36213
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.84
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.84/git_srcs job_size:36224
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.84/make_build_dir job_size:34857
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.84/config job_size:35802
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.84/build job_size:34749
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.84/test job_size:35526
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.84/add_write_perm job_size:35480
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.84/install job_size:35453
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.84/install_log job_size:39077
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.84/remove_write_perm job_size:35585
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.84/module_sync job_size:34418
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.84/wipe_build job_size:36001
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.846/var_summary job_size:36241
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.846
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.846/git_srcs job_size:36267
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.846/make_build_dir job_size:34887
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.846/config job_size:35830
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.846/build job_size:34775
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.846/test job_size:35552
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.846/add_write_perm job_size:35506
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.846/install job_size:35480
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.846/install_log job_size:39106
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.846/remove_write_perm job_size:35611
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.846/module_sync job_size:34443
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/cca/cray.846/wipe_build job_size:36029
+WAR:[12:55:59 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.49/var_summary job_size:36164
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.49/git_srcs job_size:36160
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.49/make_build_dir job_size:34806
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.49/config job_size:35698
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.49/build job_size:34702
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.49/test job_size:35479
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.49/add_write_perm job_size:35433
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.49/install job_size:35405
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.49/install_log job_size:39027
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.49/remove_write_perm job_size:35538
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.49/module_sync job_size:34372
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.49/wipe_build job_size:35952
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.53/var_summary job_size:36164
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.53/git_srcs job_size:36160
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.53/make_build_dir job_size:34806
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.53/config job_size:35698
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.53/build job_size:34702
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.53/test job_size:35479
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.53/add_write_perm job_size:35433
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.53/install job_size:35405
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.53/install_log job_size:39027
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.53/remove_write_perm job_size:35538
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.53/module_sync job_size:34372
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/gnu.53/wipe_build job_size:35952
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.14/var_summary job_size:36229
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.14
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.14/git_srcs job_size:36255
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.14/make_build_dir job_size:34875
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.14/config job_size:35736
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.14/build job_size:34763
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.14/test job_size:35540
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.14/add_write_perm job_size:35494
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.14/install job_size:35468
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.14/install_log job_size:39094
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.14/remove_write_perm job_size:35599
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.14/module_sync job_size:34431
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.14/wipe_build job_size:36017
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.15/var_summary job_size:36229
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.15
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.15/git_srcs job_size:36255
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.15/make_build_dir job_size:34875
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.15/config job_size:35736
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.15/build job_size:34763
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.15/test job_size:35540
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.15/add_write_perm job_size:35494
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.15/install job_size:35468
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.15/install_log job_size:39094
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.15/remove_write_perm job_size:35599
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.15/module_sync job_size:34431
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.15/wipe_build job_size:36017
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.16/var_summary job_size:36205
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.16/git_srcs job_size:36231
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.16/make_build_dir job_size:34851
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.16/config job_size:35712
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.16/build job_size:34739
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.16/test job_size:35516
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.16/add_write_perm job_size:35470
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.16/install job_size:35444
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.16/install_log job_size:39070
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.16/remove_write_perm job_size:35575
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.16/module_sync job_size:34407
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/intel.16/wipe_build job_size:35993
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.84/var_summary job_size:36213
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.84
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.84/git_srcs job_size:36224
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.84/make_build_dir job_size:34857
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.84/config job_size:35802
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.84/build job_size:34749
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.84/test job_size:35526
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.84/add_write_perm job_size:35480
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.84/install job_size:35453
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.84/install_log job_size:39077
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.84/remove_write_perm job_size:35585
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.84/module_sync job_size:34418
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.84/wipe_build job_size:36001
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.846/var_summary job_size:36241
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.846
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.846/git_srcs job_size:36267
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.846/make_build_dir job_size:34887
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.846/config job_size:35830
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.846/build job_size:34775
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.846/test job_size:35552
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.846/add_write_perm job_size:35506
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.846/install job_size:35480
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.846/install_log job_size:39106
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.846/remove_write_perm job_size:35611
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.846/module_sync job_size:34443
+LOG:[12:55:59 13.4.2017] submitted: /odb_api/ccb/cray.846/wipe_build job_size:36029
+LOG:[12:55:59 13.4.2017] submitted: /ifs/regenerate job_size:15277
+LOG:[12:55:59 13.4.2017] submitted: /ifs
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.53/var_summary job_size:35869
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.53/git_srcs job_size:35841
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.53/make_build_dir job_size:34515
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.53/config job_size:35271
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.53/build job_size:34427
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.53/test job_size:35235
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.53/add_write_perm job_size:35146
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.53/install job_size:35114
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.53/install_log job_size:38680
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.53/remove_write_perm job_size:35251
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.53/module_sync job_size:34097
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.53/wipe_build job_size:35665
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.62/var_summary job_size:35869
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.62
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.62/git_srcs job_size:35841
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.62/make_build_dir job_size:34515
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.62/config job_size:35271
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.62/build job_size:34427
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.62/test job_size:35235
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.62/add_write_perm job_size:35146
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.62/install job_size:35114
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.62/install_log job_size:38680
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.62/remove_write_perm job_size:35251
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.62/module_sync job_size:34097
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/gnu.62/wipe_build job_size:35665
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/intel.17/var_summary job_size:35903
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/intel.17
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/intel.17/git_srcs job_size:35905
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/intel.17/make_build_dir job_size:34553
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/intel.17/config job_size:35307
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/intel.17/build job_size:34457
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/intel.17/test job_size:35265
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/intel.17/add_write_perm job_size:35176
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/intel.17/install job_size:35146
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/intel.17/install_log job_size:38716
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/intel.17/remove_write_perm job_size:35281
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/intel.17/module_sync job_size:34125
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/intel.17/wipe_build job_size:35699
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/cray.85/var_summary job_size:35836
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/cray.85
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/cray.85/git_srcs job_size:35823
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/cray.85/make_build_dir job_size:34484
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/cray.85/config job_size:35239
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/cray.85/build job_size:34392
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/cray.85/test job_size:35200
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/cray.85/add_write_perm job_size:35111
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/cray.85/install job_size:35080
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/cray.85/install_log job_size:38648
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/cray.85/remove_write_perm job_size:35216
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/cray.85/module_sync job_size:34061
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cck/cray.85/wipe_build job_size:35632
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.49/var_summary job_size:35996
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.49/git_srcs job_size:35968
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.49/make_build_dir job_size:34642
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.49/config job_size:35398
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.49/build job_size:34554
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.49/test job_size:35362
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.49/add_write_perm job_size:35273
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.49/install job_size:35241
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.49/install_log job_size:38807
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.49/remove_write_perm job_size:35378
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.49/module_sync job_size:34224
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.49/wipe_build job_size:35792
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.53/var_summary job_size:35996
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.53/git_srcs job_size:35968
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.53/make_build_dir job_size:34642
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.53/config job_size:35398
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.53/build job_size:34554
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.53/test job_size:35362
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.53/add_write_perm job_size:35273
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.53/install job_size:35241
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.53/install_log job_size:38807
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.53/remove_write_perm job_size:35378
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.53/module_sync job_size:34224
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/gnu.53/wipe_build job_size:35792
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.14/var_summary job_size:36061
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.14
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.14/git_srcs job_size:36063
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.14/make_build_dir job_size:34711
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.14/config job_size:35465
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.14/build job_size:34615
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.14/test job_size:35423
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.14/add_write_perm job_size:35334
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.14/install job_size:35304
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.14/install_log job_size:38874
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.14/remove_write_perm job_size:35439
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.14/module_sync job_size:34283
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.14/wipe_build job_size:35857
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.15/var_summary job_size:36061
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.15
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.15/git_srcs job_size:36063
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.15/make_build_dir job_size:34711
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.15/config job_size:35465
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.15/build job_size:34615
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.15/test job_size:35423
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.15/add_write_perm job_size:35334
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.15/install job_size:35304
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.15/install_log job_size:38874
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.15/remove_write_perm job_size:35439
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.15/module_sync job_size:34283
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.15/wipe_build job_size:35857
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.16/var_summary job_size:36061
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.16/git_srcs job_size:36063
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.16/make_build_dir job_size:34711
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.16/config job_size:35465
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.16/build job_size:34615
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.16/test job_size:35423
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.16/add_write_perm job_size:35334
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.16/install job_size:35304
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.16/install_log job_size:38874
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.16/remove_write_perm job_size:35439
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.16/module_sync job_size:34283
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/intel.16/wipe_build job_size:35857
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.84/var_summary job_size:35963
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.84
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.84/git_srcs job_size:35950
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.84/make_build_dir job_size:34611
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.84/config job_size:35394
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.84/build job_size:34519
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.84/test job_size:35327
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.84/add_write_perm job_size:35238
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.84/install job_size:35207
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.84/install_log job_size:38775
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.84/remove_write_perm job_size:35343
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.84/module_sync job_size:34188
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.84/wipe_build job_size:35759
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.85/var_summary job_size:35963
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.85
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.85/git_srcs job_size:35950
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.85/make_build_dir job_size:34611
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.85/config job_size:35394
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.85/build job_size:34519
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.85/test job_size:35327
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.85/add_write_perm job_size:35238
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.85/install job_size:35207
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.85/install_log job_size:38775
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.85/remove_write_perm job_size:35343
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.85/module_sync job_size:34188
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.85/wipe_build job_size:35759
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.846/var_summary job_size:35991
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.846
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.846/git_srcs job_size:35993
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.846/make_build_dir job_size:34641
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.846/config job_size:35423
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.846/build job_size:34545
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.846/test job_size:35353
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.846/add_write_perm job_size:35264
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.846/install job_size:35234
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.846/install_log job_size:38804
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.846/remove_write_perm job_size:35369
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.846/module_sync job_size:34213
+LOG:[12:55:59 13.4.2017] submitted: /ifs/cct/cray.846/wipe_build job_size:35787
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/gnu.53/var_summary job_size:15385
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/gnu.53/git_srcs job_size:15197
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/gnu.53/make_build_dir job_size:13908
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/gnu.53/config job_size:14806
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/gnu.53/build job_size:14070
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/gnu.53/test job_size:14900
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/gnu.53/add_write_perm job_size:14619
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/gnu.53/install job_size:14728
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/gnu.53/install_log job_size:18491
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/gnu.53/remove_write_perm job_size:14658
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/gnu.53/module_sync job_size:13621
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/gnu.53/wipe_build job_size:15177
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/intel.16/var_summary job_size:15445
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/intel.16/git_srcs job_size:15287
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/intel.16/make_build_dir job_size:13972
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/intel.16/config job_size:14868
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/intel.16/build job_size:14126
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/intel.16/test job_size:14956
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/intel.16/add_write_perm job_size:14675
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/intel.16/install job_size:14786
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/intel.16/install_log job_size:18553
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/intel.16/remove_write_perm job_size:14714
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/intel.16/module_sync job_size:13675
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/intel.16/wipe_build job_size:15237
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/pgi.16/var_summary job_size:15423
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/pgi.16
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/pgi.16/git_srcs job_size:15235
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/pgi.16/make_build_dir job_size:13946
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/pgi.16/config job_size:14844
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/pgi.16/build job_size:14108
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/pgi.16/test job_size:14938
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/pgi.16/add_write_perm job_size:14657
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/pgi.16/install job_size:14766
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/pgi.16/install_log job_size:18529
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/pgi.16/remove_write_perm job_size:14696
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/pgi.16/module_sync job_size:13659
+LOG:[12:55:59 13.4.2017] submitted: /ifs/lxg/pgi.16/wipe_build job_size:15215
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.53/var_summary job_size:15413
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.53/git_srcs job_size:15252
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.53/make_build_dir job_size:13937
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.53/config job_size:14833
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.53/build job_size:14091
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.53/test job_size:14921
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.53/add_write_perm job_size:14640
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.53/install job_size:14751
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.53/install_log job_size:18521
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.53/remove_write_perm job_size:14679
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.53/module_sync job_size:13643
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.53/wipe_build job_size:15203
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.61/var_summary job_size:15437
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.61
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.61/git_srcs job_size:15276
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.61/make_build_dir job_size:13961
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.61/config job_size:14857
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.61/build job_size:14115
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.61/test job_size:14945
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.61/add_write_perm job_size:14664
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.61/install job_size:14775
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.61/install_log job_size:18545
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.61/remove_write_perm job_size:14703
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.61/module_sync job_size:13667
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/gnu.61/wipe_build job_size:15227
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/pgi/var_summary job_size:15421
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/pgi
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/pgi/git_srcs job_size:15215
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/pgi/make_build_dir job_size:13939
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/pgi/config job_size:14838
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/pgi/build job_size:14105
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/pgi/test job_size:14935
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/pgi/add_write_perm job_size:14654
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/pgi/install job_size:14762
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/pgi/install_log job_size:18526
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/pgi/remove_write_perm job_size:14693
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/pgi/module_sync job_size:13660
+LOG:[12:55:59 13.4.2017] submitted: /ifs/leap42/pgi/wipe_build job_size:15211
+WAR:[12:55:59 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/regenerate job_size:15334
+LOG:[12:55:59 13.4.2017] submitted: /ecflow
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/test_local_actions/action1 job_size:13448
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/test_local_actions
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu/var_summary job_size:15598
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu/git_srcs job_size:15592
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu/make_build_dir job_size:14144
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu/config job_size:15336
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu/build job_size:14250
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu/test job_size:15956
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu/tests/cppcheck job_size:13920
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu/tests
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu/install job_size:15487
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu/install_log job_size:18497
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu/remove_write_perm job_size:14820
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu/uninstall job_size:14833
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu/wipe_build job_size:15384
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.python3/var_summary job_size:15732
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.python3
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.python3/git_srcs job_size:15838
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.python3/make_build_dir job_size:14286
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.python3/config job_size:15590
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.python3/build job_size:14360
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.python3/test job_size:16075
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.python3/tests/cppcheck job_size:14014
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.python3/tests
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.python3/install job_size:15621
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.python3/install_log job_size:18719
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.python3/remove_write_perm job_size:14938
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.python3/uninstall job_size:14951
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.python3/wipe_build job_size:15510
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.shared/var_summary job_size:15714
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.shared
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.shared/git_srcs job_size:15806
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.shared/make_build_dir job_size:14267
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.shared/config job_size:15453
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.shared/build job_size:14345
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.shared/test job_size:16058
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.shared/tests/cppcheck job_size:14001
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.shared/tests
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.shared/install job_size:15603
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.shared/install_log job_size:18690
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.shared/remove_write_perm job_size:14922
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.shared/uninstall job_size:14935
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.shared/wipe_build job_size:15493
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.ssl/var_summary job_size:15678
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.ssl
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.ssl/git_srcs job_size:15728
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.ssl/make_build_dir job_size:14228
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.ssl/config job_size:15456
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.ssl/build job_size:14318
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.ssl/test job_size:16028
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.ssl/tests/cppcheck job_size:13980
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.ssl/tests
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.ssl/install job_size:15567
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.ssl/install_log job_size:18621
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.ssl/remove_write_perm job_size:14892
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.ssl/uninstall job_size:14905
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/gnu.ssl/wipe_build job_size:15460
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang/var_summary job_size:15633
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang/git_srcs job_size:15655
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang/make_build_dir job_size:14181
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang/config job_size:15418
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang/build job_size:14279
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang/test job_size:15987
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang/tests/cppcheck job_size:13945
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang/tests
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang/install job_size:15522
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang/install_log job_size:18554
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang/remove_write_perm job_size:14851
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang/uninstall job_size:14864
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang/wipe_build job_size:15417
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/intel/var_summary job_size:15665
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/intel
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/intel/git_srcs job_size:15687
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/intel/make_build_dir job_size:14213
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/intel/config job_size:15409
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/intel/build job_size:14311
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/intel/test job_size:16019
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/intel/tests/cppcheck job_size:13977
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/intel/tests
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/intel/install job_size:15554
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/intel/install_log job_size:18586
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/intel/remove_write_perm job_size:14883
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/intel/uninstall job_size:14896
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/intel/wipe_build job_size:15449
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang_static_analsyer/git_srcs job_size:16055
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang_static_analsyer
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang_static_analsyer/make_build_dir job_size:14373
+LOG:[12:55:59 13.4.2017] submitted: /ecflow/localhost/clang_static_analsyer/static_analyser job_size:15769
+LOG:[12:55:59 13.4.2017] submitted: /atlas/regenerate job_size:15315
+LOG:[12:55:59 13.4.2017] submitted: /atlas
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.49/var_summary job_size:15480
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.49/git_srcs job_size:15494
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.49/make_build_dir job_size:14041
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.49/config job_size:14972
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.49/build job_size:14151
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.49/test job_size:14981
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.49/install job_size:14829
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.49/install_log job_size:18623
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.49/remove_write_perm job_size:14745
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.49/module_sync job_size:13692
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.49/wipe_build job_size:15286
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.53/var_summary job_size:15504
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.53/git_srcs job_size:15518
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.53/make_build_dir job_size:14065
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.53/config job_size:14996
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.53/build job_size:14175
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.53/test job_size:15005
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.53/install job_size:14853
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.53/install_log job_size:18647
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.53/remove_write_perm job_size:14769
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.53/module_sync job_size:13716
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxop_dev/gnu.53/wipe_build job_size:15310
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.53/var_summary job_size:35963
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.53/git_srcs job_size:35954
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.53/make_build_dir job_size:34607
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.53/config job_size:35380
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.53/build job_size:34511
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.53/test job_size:35319
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.53/install job_size:35207
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.53/install_log job_size:38800
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.53/remove_write_perm job_size:35341
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.53/module_sync job_size:34181
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.53/wipe_build job_size:35755
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.62/var_summary job_size:35963
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.62
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.62/git_srcs job_size:35954
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.62/make_build_dir job_size:34607
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.62/config job_size:35380
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.62/build job_size:34511
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.62/test job_size:35319
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.62/install job_size:35207
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.62/install_log job_size:38800
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.62/remove_write_perm job_size:35341
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.62/module_sync job_size:34181
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/gnu.62/wipe_build job_size:35755
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/intel.17/var_summary job_size:35997
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/intel.17
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/intel.17/git_srcs job_size:36018
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/intel.17/make_build_dir job_size:34645
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/intel.17/config job_size:35414
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/intel.17/build job_size:34541
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/intel.17/test job_size:35349
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/intel.17/install job_size:35239
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/intel.17/install_log job_size:38836
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/intel.17/remove_write_perm job_size:35371
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/intel.17/module_sync job_size:34209
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/intel.17/wipe_build job_size:35789
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/cray.85/var_summary job_size:35930
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/cray.85
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/cray.85/git_srcs job_size:35936
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/cray.85/make_build_dir job_size:34576
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/cray.85/config job_size:35347
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/cray.85/build job_size:34476
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/cray.85/test job_size:35284
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/cray.85/install job_size:35173
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/cray.85/install_log job_size:38768
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/cray.85/remove_write_perm job_size:35306
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/cray.85/module_sync job_size:34145
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cck/cray.85/wipe_build job_size:35722
+WAR:[12:55:59 13.4.2017] EcfFile::doCreateJobFile: Too many files open(errno=EMFILE), include file cache size(44) Clearing cache. Check limits with ulimit -Sn
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.49/var_summary job_size:35959
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.49/git_srcs job_size:35950
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.49/make_build_dir job_size:34603
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.49/config job_size:35376
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.49/build job_size:34507
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.49/test job_size:35315
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.49/install job_size:35203
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.49/install_log job_size:38796
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.49/remove_write_perm job_size:35337
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.49/module_sync job_size:34177
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.49/wipe_build job_size:35751
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.53/var_summary job_size:35959
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.53/git_srcs job_size:35950
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.53/make_build_dir job_size:34603
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.53/config job_size:35376
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.53/build job_size:34507
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.53/test job_size:35315
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.53/install job_size:35203
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.53/install_log job_size:38796
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.53/remove_write_perm job_size:35337
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.53/module_sync job_size:34177
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/gnu.53/wipe_build job_size:35751
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.14/var_summary job_size:36140
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.14
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.14/git_srcs job_size:36161
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.14/make_build_dir job_size:34788
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.14/config job_size:35586
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.14/build job_size:34684
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.14/test job_size:35492
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.14/install job_size:35382
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.14/install_log job_size:38979
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.14/remove_write_perm job_size:35514
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.14/module_sync job_size:34352
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.14/wipe_build job_size:35932
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.15/var_summary job_size:36140
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.15
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.15/git_srcs job_size:36161
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.15/make_build_dir job_size:34788
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.15/config job_size:35586
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.15/build job_size:34684
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.15/test job_size:35492
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.15/install job_size:35382
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.15/install_log job_size:38979
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.15/remove_write_perm job_size:35514
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.15/module_sync job_size:34352
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.15/wipe_build job_size:35932
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.16/var_summary job_size:36140
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.16/git_srcs job_size:36161
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.16/make_build_dir job_size:34788
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.16/config job_size:35586
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.16/build job_size:34684
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.16/test job_size:35492
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.16/install job_size:35382
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.16/install_log job_size:38979
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.16/remove_write_perm job_size:35514
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.16/module_sync job_size:34352
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/intel.16/wipe_build job_size:35932
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.84/var_summary job_size:35926
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.84
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.84/git_srcs job_size:35932
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.84/make_build_dir job_size:34572
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.84/config job_size:35296
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.84/build job_size:34472
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.84/test job_size:35280
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.84/install job_size:35169
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.84/install_log job_size:38764
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.84/remove_write_perm job_size:35302
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.84/module_sync job_size:34141
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.84/wipe_build job_size:35718
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.85/var_summary job_size:35926
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.85
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.85/git_srcs job_size:35932
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.85/make_build_dir job_size:34572
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.85/config job_size:35296
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.85/build job_size:34472
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.85/test job_size:35280
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.85/install job_size:35169
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.85/install_log job_size:38764
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.85/remove_write_perm job_size:35302
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.85/module_sync job_size:34141
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.85/wipe_build job_size:35718
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.846/var_summary job_size:35954
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.846
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.846/git_srcs job_size:35975
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.846/make_build_dir job_size:34602
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.846/config job_size:35324
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.846/build job_size:34498
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.846/test job_size:35306
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.846/install job_size:35196
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.846/install_log job_size:38793
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.846/remove_write_perm job_size:35328
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.846/module_sync job_size:34166
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cct/cray.846/wipe_build job_size:35746
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappa/var_summary job_size:15374
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappa
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappa/git_srcs job_size:15130
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappa/make_build_dir job_size:13885
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappa/config job_size:14782
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappa/build job_size:14059
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappa/test job_size:14889
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappa/install job_size:14680
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappa/install_log job_size:18050
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappa/remove_write_perm job_size:14612
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappa/module_sync job_size:13617
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappa/wipe_build job_size:15166
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.44/var_summary job_size:15439
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.44
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.44/git_srcs job_size:15339
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.44/make_build_dir job_size:13977
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.44/config job_size:14897
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.44/build job_size:14115
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.44/test job_size:14945
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.44/install job_size:14786
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.44/install_log job_size:18575
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.44/remove_write_perm job_size:14709
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.44/module_sync job_size:13663
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.44/wipe_build job_size:15231
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.53/var_summary job_size:15415
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.53/git_srcs job_size:15315
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.53/make_build_dir job_size:13953
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.53/config job_size:14873
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.53/build job_size:14091
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.53/test job_size:14921
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.53/install job_size:14762
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.53/install_log job_size:18551
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.53/remove_write_perm job_size:14685
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.53/module_sync job_size:13639
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ecgb/gnu.53/wipe_build job_size:15207
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/gnu.53/var_summary job_size:15401
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/gnu.53/git_srcs job_size:15232
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/gnu.53/make_build_dir job_size:13922
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/gnu.53/config job_size:14850
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/gnu.53/build job_size:14076
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/gnu.53/test job_size:14906
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/gnu.53/install job_size:14743
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/gnu.53/install_log job_size:18533
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/gnu.53/remove_write_perm job_size:14670
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/gnu.53/module_sync job_size:13627
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/gnu.53/wipe_build job_size:15187
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/intel.16/var_summary job_size:15461
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/intel.16/git_srcs job_size:15322
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/intel.16/make_build_dir job_size:13986
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/intel.16/config job_size:14910
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/intel.16/build job_size:14132
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/intel.16/test job_size:14962
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/intel.16/install job_size:14801
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/intel.16/install_log job_size:18595
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/intel.16/remove_write_perm job_size:14726
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/intel.16/module_sync job_size:13681
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/intel.16/wipe_build job_size:15247
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/pgi.16/var_summary job_size:15439
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/pgi.16
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/pgi.16/git_srcs job_size:15270
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/pgi.16/make_build_dir job_size:13960
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/pgi.16/config job_size:14888
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/pgi.16/build job_size:14114
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/pgi.16/test job_size:14944
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/pgi.16/install job_size:14781
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/pgi.16/install_log job_size:18571
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/pgi.16/remove_write_perm job_size:14708
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/pgi.16/module_sync job_size:13665
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxg/pgi.16/wipe_build job_size:15225
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.48/var_summary job_size:15479
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.48
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.48/git_srcs job_size:15412
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.48/make_build_dir job_size:14011
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.48/config job_size:14925
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.48/build job_size:14137
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.48/test job_size:14967
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.48/install job_size:14811
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.48/install_log job_size:18618
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.48/remove_write_perm job_size:14731
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.48/module_sync job_size:13689
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.48/wipe_build job_size:15263
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.53/var_summary job_size:15503
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.53/git_srcs job_size:15436
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.53/make_build_dir job_size:14035
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.53/config job_size:14949
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.53/build job_size:14161
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.53/test job_size:14991
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.53/install job_size:14835
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.53/install_log job_size:18642
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.53/remove_write_perm job_size:14755
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.53/module_sync job_size:13713
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.53/wipe_build job_size:15287
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.61/var_summary job_size:15503
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.61
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.61/git_srcs job_size:15436
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.61/make_build_dir job_size:14035
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.61/config job_size:14949
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.61/build job_size:14161
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.61/test job_size:14991
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.61/install job_size:14835
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.61/install_log job_size:18642
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.61/remove_write_perm job_size:14755
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.61/module_sync job_size:13713
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/gnu.61/wipe_build job_size:15287
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/pgi/var_summary job_size:15487
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/pgi
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/pgi/git_srcs job_size:15375
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/pgi/make_build_dir job_size:14013
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/pgi/config job_size:14933
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/pgi/build job_size:14151
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/pgi/test job_size:14981
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/pgi/install job_size:14822
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/pgi/install_log job_size:18623
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/pgi/remove_write_perm job_size:14745
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/pgi/module_sync job_size:13706
+LOG:[12:55:59 13.4.2017] submitted: /atlas/opensuse131/pgi/wipe_build job_size:15271
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.49/var_summary job_size:15424
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.49/git_srcs job_size:15255
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.49/make_build_dir job_size:13945
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.49/config job_size:14959
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.49/build job_size:14099
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.49/test job_size:14929
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.49/install job_size:14766
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.49/install_log job_size:18556
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.49/remove_write_perm job_size:14693
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.49/module_sync job_size:13650
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.49/wipe_build job_size:15210
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.53/var_summary job_size:15448
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.53/git_srcs job_size:15279
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.53/make_build_dir job_size:13969
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.53/config job_size:14983
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.53/build job_size:14123
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.53/test job_size:14953
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.53/install job_size:14790
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.53/install_log job_size:18580
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.53/remove_write_perm job_size:14717
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.53/module_sync job_size:13674
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/gnu.53/wipe_build job_size:15234
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/pgi/var_summary job_size:15432
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/pgi
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/pgi/git_srcs job_size:15218
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/pgi/make_build_dir job_size:13947
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/pgi/config job_size:14967
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/pgi/build job_size:14113
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/pgi/test job_size:14943
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/pgi/install job_size:14777
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/pgi/install_log job_size:18561
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/pgi/remove_write_perm job_size:14707
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/pgi/module_sync job_size:13667
+LOG:[12:55:59 13.4.2017] submitted: /atlas/lxc/pgi/wipe_build job_size:15218
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.53/var_summary job_size:15429
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.53/git_srcs job_size:15287
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.53/make_build_dir job_size:13951
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.53/config job_size:14875
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.53/build job_size:14097
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.53/test job_size:14927
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.53/install job_size:14766
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.53/install_log job_size:18563
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.53/remove_write_perm job_size:14691
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.53/module_sync job_size:13649
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.53/wipe_build job_size:15213
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.61/var_summary job_size:15453
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.61
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.61/git_srcs job_size:15311
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.61/make_build_dir job_size:13975
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.61/config job_size:14899
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.61/build job_size:14121
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.61/test job_size:14951
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.61/install job_size:14790
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.61/install_log job_size:18587
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.61/remove_write_perm job_size:14715
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.61/module_sync job_size:13673
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/gnu.61/wipe_build job_size:15237
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/pgi/var_summary job_size:15437
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/pgi
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/pgi/git_srcs job_size:15250
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/pgi/make_build_dir job_size:13953
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/pgi/config job_size:14883
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/pgi/build job_size:14111
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/pgi/test job_size:14941
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/pgi/install job_size:14777
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/pgi/install_log job_size:18568
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/pgi/remove_write_perm job_size:14705
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/pgi/module_sync job_size:13666
+LOG:[12:55:59 13.4.2017] submitted: /atlas/leap42/pgi/wipe_build job_size:15221
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappb/var_summary job_size:15374
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappb
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappb/git_srcs job_size:15130
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappb/make_build_dir job_size:13885
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappb/config job_size:14782
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappb/build job_size:14059
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappb/test job_size:14889
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappb/install job_size:14680
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappb/install_log job_size:18050
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappb/remove_write_perm job_size:14612
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappb/module_sync job_size:13617
+LOG:[12:55:59 13.4.2017] submitted: /atlas/sappb/wipe_build job_size:15166
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.49/var_summary job_size:35959
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.49/git_srcs job_size:35950
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.49/make_build_dir job_size:34603
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.49/config job_size:35376
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.49/build job_size:34507
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.49/test job_size:35315
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.49/install job_size:35203
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.49/install_log job_size:38796
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.49/remove_write_perm job_size:35337
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.49/module_sync job_size:34177
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.49/wipe_build job_size:35751
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.53/var_summary job_size:35959
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.53/git_srcs job_size:35950
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.53/make_build_dir job_size:34603
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.53/config job_size:35376
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.53/build job_size:34507
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.53/test job_size:35315
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.53/install job_size:35203
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.53/install_log job_size:38796
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.53/remove_write_perm job_size:35337
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.53/module_sync job_size:34177
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/gnu.53/wipe_build job_size:35751
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.14/var_summary job_size:36140
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.14
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.14/git_srcs job_size:36161
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.14/make_build_dir job_size:34788
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.14/config job_size:35586
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.14/build job_size:34684
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.14/test job_size:35492
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.14/install job_size:35382
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.14/install_log job_size:38979
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.14/remove_write_perm job_size:35514
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.14/module_sync job_size:34352
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.14/wipe_build job_size:35932
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.15/var_summary job_size:36140
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.15
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.15/git_srcs job_size:36161
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.15/make_build_dir job_size:34788
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.15/config job_size:35586
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.15/build job_size:34684
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.15/test job_size:35492
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.15/install job_size:35382
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.15/install_log job_size:38979
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.15/remove_write_perm job_size:35514
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.15/module_sync job_size:34352
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.15/wipe_build job_size:35932
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.16/var_summary job_size:36116
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.16/git_srcs job_size:36137
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.16/make_build_dir job_size:34764
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.16/config job_size:35562
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.16/build job_size:34660
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.16/test job_size:35468
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.16/install job_size:35358
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.16/install_log job_size:38955
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.16/remove_write_perm job_size:35490
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.16/module_sync job_size:34328
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/intel.16/wipe_build job_size:35908
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.84/var_summary job_size:35926
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.84
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.84/git_srcs job_size:35932
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.84/make_build_dir job_size:34572
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.84/config job_size:35296
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.84/build job_size:34472
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.84/test job_size:35280
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.84/install job_size:35169
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.84/install_log job_size:38764
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.84/remove_write_perm job_size:35302
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.84/module_sync job_size:34141
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.84/wipe_build job_size:35718
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.846/var_summary job_size:35954
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.846
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.846/git_srcs job_size:35975
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.846/make_build_dir job_size:34602
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.846/config job_size:35324
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.846/build job_size:34498
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.846/test job_size:35306
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.846/install job_size:35196
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.846/install_log job_size:38793
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.846/remove_write_perm job_size:35328
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.846/module_sync job_size:34166
+LOG:[12:55:59 13.4.2017] submitted: /atlas/cca/cray.846/wipe_build job_size:35746
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.49/var_summary job_size:35959
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.49/git_srcs job_size:35950
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.49/make_build_dir job_size:34603
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.49/config job_size:35376
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.49/build job_size:34507
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.49/test job_size:35315
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.49/install job_size:35203
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.49/install_log job_size:38796
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.49/remove_write_perm job_size:35337
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.49/module_sync job_size:34177
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.49/wipe_build job_size:35751
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.53/var_summary job_size:35959
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.53/git_srcs job_size:35950
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.53/make_build_dir job_size:34603
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.53/config job_size:35376
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.53/build job_size:34507
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.53/test job_size:35315
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.53/install job_size:35203
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.53/install_log job_size:38796
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.53/remove_write_perm job_size:35337
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.53/module_sync job_size:34177
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/gnu.53/wipe_build job_size:35751
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.14/var_summary job_size:36140
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.14
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.14/git_srcs job_size:36161
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.14/make_build_dir job_size:34788
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.14/config job_size:35586
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.14/build job_size:34684
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.14/test job_size:35492
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.14/install job_size:35382
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.14/install_log job_size:38979
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.14/remove_write_perm job_size:35514
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.14/module_sync job_size:34352
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.14/wipe_build job_size:35932
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.15/var_summary job_size:36140
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.15
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.15/git_srcs job_size:36161
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.15/make_build_dir job_size:34788
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.15/config job_size:35586
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.15/build job_size:34684
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.15/test job_size:35492
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.15/install job_size:35382
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.15/install_log job_size:38979
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.15/remove_write_perm job_size:35514
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.15/module_sync job_size:34352
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.15/wipe_build job_size:35932
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.16/var_summary job_size:36116
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.16/git_srcs job_size:36137
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.16/make_build_dir job_size:34764
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.16/config job_size:35562
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.16/build job_size:34660
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.16/test job_size:35468
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.16/install job_size:35358
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.16/install_log job_size:38955
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.16/remove_write_perm job_size:35490
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.16/module_sync job_size:34328
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/intel.16/wipe_build job_size:35908
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.84/var_summary job_size:35926
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.84
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.84/git_srcs job_size:35932
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.84/make_build_dir job_size:34572
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.84/config job_size:35296
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.84/build job_size:34472
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.84/test job_size:35280
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.84/install job_size:35169
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.84/install_log job_size:38764
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.84/remove_write_perm job_size:35302
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.84/module_sync job_size:34141
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.84/wipe_build job_size:35718
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.846/var_summary job_size:35954
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.846
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.846/git_srcs job_size:35975
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.846/make_build_dir job_size:34602
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.846/config job_size:35324
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.846/build job_size:34498
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.846/test job_size:35306
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.846/install job_size:35196
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.846/install_log job_size:38793
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.846/remove_write_perm job_size:35328
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.846/module_sync job_size:34166
+LOG:[12:55:59 13.4.2017] submitted: /atlas/ccb/cray.846/wipe_build job_size:35746
+WAR:[12:55:59 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/regenerate job_size:15486
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/gnu.53/var_summary job_size:36414
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/gnu.53/git_srcs job_size:36573
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/gnu.53/make_build_dir job_size:35049
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/gnu.53/config job_size:35767
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/gnu.53/build job_size:34917
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/gnu.53/test job_size:35725
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/gnu.53/wipe_build job_size:36188
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/gnu.62/var_summary job_size:36414
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/gnu.62
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/gnu.62/git_srcs job_size:36573
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/gnu.62/make_build_dir job_size:35049
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/gnu.62/config job_size:35767
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/gnu.62/build job_size:34917
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/gnu.62/test job_size:35725
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/gnu.62/wipe_build job_size:36188
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/intel.17/var_summary job_size:36448
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/intel.17
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/intel.17/git_srcs job_size:36637
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/intel.17/make_build_dir job_size:35087
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/intel.17/config job_size:35801
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/intel.17/build job_size:34947
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/intel.17/test job_size:35755
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/intel.17/wipe_build job_size:36222
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/cray.85/var_summary job_size:36381
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/cray.85
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/cray.85/git_srcs job_size:36555
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/cray.85/make_build_dir job_size:35018
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/cray.85/config job_size:35734
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/cray.85/build job_size:34882
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/cray.85/test job_size:35690
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cck/cray.85/wipe_build job_size:36155
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/gnu.49/var_summary job_size:36510
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/gnu.49/git_srcs job_size:36669
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/gnu.49/make_build_dir job_size:35145
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/gnu.49/config job_size:35888
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/gnu.49/build job_size:35013
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/gnu.49/test job_size:35821
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/gnu.49/wipe_build job_size:36284
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/gnu.53/var_summary job_size:36510
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/gnu.53/git_srcs job_size:36669
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/gnu.53/make_build_dir job_size:35145
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/gnu.53/config job_size:35888
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/gnu.53/build job_size:35013
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/gnu.53/test job_size:35821
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/gnu.53/wipe_build job_size:36284
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.14/var_summary job_size:36575
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.14
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.14/git_srcs job_size:36764
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.14/make_build_dir job_size:35214
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.14/config job_size:35953
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.14/build job_size:35074
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.14/test job_size:35882
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.14/wipe_build job_size:36349
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.15/var_summary job_size:36575
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.15
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.15/git_srcs job_size:36764
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.15/make_build_dir job_size:35214
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.15/config job_size:35953
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.15/build job_size:35074
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.15/test job_size:35882
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.15/wipe_build job_size:36349
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.16/var_summary job_size:36575
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.16/git_srcs job_size:36764
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.16/make_build_dir job_size:35214
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.16/config job_size:35953
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.16/build job_size:35074
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.16/test job_size:35882
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/intel.16/wipe_build job_size:36349
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.84/var_summary job_size:36477
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.84
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.84/git_srcs job_size:36651
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.84/make_build_dir job_size:35114
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.84/config job_size:35883
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.84/build job_size:34978
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.84/test job_size:35786
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.84/wipe_build job_size:36251
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.85/var_summary job_size:36477
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.85
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.85/git_srcs job_size:36651
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.85/make_build_dir job_size:35114
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.85/config job_size:35883
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.85/build job_size:34978
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.85/test job_size:35786
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.85/wipe_build job_size:36251
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.846/var_summary job_size:36505
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.846
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.846/git_srcs job_size:36694
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.846/make_build_dir job_size:35144
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.846/config job_size:35911
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.846/build job_size:35004
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.846/test job_size:35812
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/cct/cray.846/wipe_build job_size:36279
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb/gnu.44/var_summary job_size:15539
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb/gnu.44
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb/gnu.44/git_srcs job_size:15607
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb/gnu.44/make_build_dir job_size:14068
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb/gnu.44/config job_size:14933
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb/gnu.44/build job_size:14170
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb/gnu.44/test job_size:15000
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb/gnu.44/wipe_build job_size:15304
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb/gnu.53/var_summary job_size:15515
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb/gnu.53/git_srcs job_size:15583
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb/gnu.53/make_build_dir job_size:14044
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb/gnu.53/config job_size:14909
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb/gnu.53/build job_size:14146
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb/gnu.53/test job_size:14976
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/ecgb/gnu.53/wipe_build job_size:15280
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/gnu.53/var_summary job_size:15501
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/gnu.53/git_srcs job_size:15500
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/gnu.53/make_build_dir job_size:14013
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/gnu.53/config job_size:14886
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/gnu.53/build job_size:14131
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/gnu.53/test job_size:14961
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/gnu.53/wipe_build job_size:15260
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/intel.16/var_summary job_size:15561
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/intel.16/git_srcs job_size:15590
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/intel.16/make_build_dir job_size:14077
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/intel.16/config job_size:14946
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/intel.16/build job_size:14187
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/intel.16/test job_size:15017
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/intel.16/wipe_build job_size:15320
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/pgi.16/var_summary job_size:15573
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/pgi.16
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/pgi.16/git_srcs job_size:15572
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/pgi.16/make_build_dir job_size:14085
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/pgi.16/config job_size:15031
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/pgi.16/build job_size:14203
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/pgi.16/test job_size:15033
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxg/pgi.16/wipe_build job_size:15332
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.48/var_summary job_size:15600
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.48
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.48/git_srcs job_size:15701
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.48/make_build_dir job_size:14123
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.48/config job_size:14982
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.48/build job_size:14213
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.48/test job_size:15043
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.48/wipe_build job_size:15357
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.53/var_summary job_size:15603
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.53/git_srcs job_size:15704
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.53/make_build_dir job_size:14126
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.53/config job_size:14985
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.53/build job_size:14216
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.53/test job_size:15046
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.53/wipe_build job_size:15360
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.61/var_summary job_size:15603
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.61
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.61/git_srcs job_size:15704
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.61/make_build_dir job_size:14126
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.61/config job_size:14985
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.61/build job_size:14216
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.61/test job_size:15046
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/gnu.61/wipe_build job_size:15360
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/pgi/var_summary job_size:15621
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/pgi
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/pgi/git_srcs job_size:15677
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/pgi/make_build_dir job_size:14138
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/pgi/config job_size:15076
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/pgi/build job_size:14240
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/pgi/test job_size:15070
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/opensuse131/pgi/wipe_build job_size:15378
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/gnu.49/var_summary job_size:15502
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/gnu.49/git_srcs job_size:15501
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/gnu.49/make_build_dir job_size:14014
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/gnu.49/config job_size:14887
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/gnu.49/build job_size:14132
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/gnu.49/test job_size:14962
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/gnu.49/wipe_build job_size:15261
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/gnu.53/var_summary job_size:15526
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/gnu.53/git_srcs job_size:15525
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/gnu.53/make_build_dir job_size:14038
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/gnu.53/config job_size:14911
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/gnu.53/build job_size:14156
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/gnu.53/test job_size:14986
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/gnu.53/wipe_build job_size:15285
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/pgi/var_summary job_size:15544
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/pgi
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/pgi/git_srcs job_size:15498
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/pgi/make_build_dir job_size:14050
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/pgi/config job_size:15002
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/pgi/build job_size:14180
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/pgi/test job_size:15010
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/lxc/pgi/wipe_build job_size:15303
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/gnu.53/var_summary job_size:15529
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/gnu.53/git_srcs job_size:15555
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/gnu.53/make_build_dir job_size:14042
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/gnu.53/config job_size:14911
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/gnu.53/build job_size:14152
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/gnu.53/test job_size:14982
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/gnu.53/wipe_build job_size:15286
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/gnu.61/var_summary job_size:15553
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/gnu.61
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/gnu.61/git_srcs job_size:15579
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/gnu.61/make_build_dir job_size:14066
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/gnu.61/config job_size:14935
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/gnu.61/build job_size:14176
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/gnu.61/test job_size:15006
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/gnu.61/wipe_build job_size:15310
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/pgi/var_summary job_size:15571
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/pgi
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/pgi/git_srcs job_size:15552
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/pgi/make_build_dir job_size:14078
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/pgi/config job_size:15026
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/pgi/build job_size:14200
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/pgi/test job_size:15030
+LOG:[12:55:59 13.4.2017] submitted: /libemos_bundle/leap42/pgi/wipe_build job_size:15328
+WAR:[12:55:59 13.4.2017] EcfFile::doCreateJobFile: Too many files open(errno=EMFILE), include file cache size(44) Clearing cache. Check limits with ulimit -Sn
+LOG:[12:55:59 13.4.2017] submitted: /codes_ui/regenerate job_size:15372
+LOG:[12:55:59 13.4.2017] submitted: /codes_ui
+LOG:[12:55:59 13.4.2017] submitted: /codes_ui/localhost/var_summary job_size:15503
+LOG:[12:55:59 13.4.2017] submitted: /codes_ui/localhost
+LOG:[12:55:59 13.4.2017] submitted: /codes_ui/localhost/git_srcs job_size:15401
+LOG:[12:55:59 13.4.2017] submitted: /codes_ui/localhost/make_build_dir job_size:14016
+LOG:[12:55:59 13.4.2017] submitted: /codes_ui/localhost/config job_size:14904
+LOG:[12:55:59 13.4.2017] submitted: /codes_ui/localhost/build job_size:14158
+LOG:[12:55:59 13.4.2017] submitted: /codes_ui/localhost/test job_size:14988
+LOG:[12:55:59 13.4.2017] submitted: /codes_ui/localhost/install job_size:14811
+LOG:[12:55:59 13.4.2017] submitted: /codes_ui/localhost/install_log job_size:18401
+LOG:[12:55:59 13.4.2017] submitted: /codes_ui/localhost/remove_write_perm job_size:14736
+LOG:[12:55:59 13.4.2017] submitted: /codes_ui/localhost/module_sync job_size:13712
+LOG:[12:55:59 13.4.2017] submitted: /codes_ui/localhost/wipe_build job_size:15283
+LOG:[12:55:59 13.4.2017] submitted: /metabuilder/regenerate job_size:15429
+LOG:[12:55:59 13.4.2017] submitted: /metabuilder
+LOG:[12:55:59 13.4.2017] submitted: /metabuilder/clear_log job_size:16818
+LOG:[12:55:59 13.4.2017] submitted: /metabuilder/remove_build_dirs job_size:14127
+LOG:[12:55:59 13.4.2017] submitted: /metabuilder/add_new_package job_size:14638
+LOG:[12:55:59 13.4.2017] submitted: /metabuilder/generate_report job_size:19654
+LOG:[12:55:59 13.4.2017] submitted: /metabuilder/remove_lock_file job_size:13474
+LOG:[12:55:59 13.4.2017] submitted: /mars_client_configs/regenerate job_size:15581
+LOG:[12:55:59 13.4.2017] submitted: /mars_client_configs
+LOG:[12:55:59 13.4.2017] submitted: /mars_client_configs/leap42/create/odb_api job_size:14604
+LOG:[12:55:59 13.4.2017] submitted: /mars_client_configs/leap42/create
+LOG:[12:55:59 13.4.2017] submitted: /mars_client_configs/leap42
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/regenerate job_size:15592
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle
+WAR:[12:55:59 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.53/var_summary job_size:36430
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.53/git_srcs job_size:36546
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.53/make_build_dir job_size:35066
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.53/config job_size:35858
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.53/make_update job_size:34592
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.53/build job_size:34943
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.53/test job_size:35933
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.53/wipe_build job_size:36208
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.62/var_summary job_size:36430
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.62
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.62/git_srcs job_size:36546
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.62/make_build_dir job_size:35066
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.62/config job_size:35858
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.62/make_update job_size:34592
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.62/build job_size:34943
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.62/test job_size:35933
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/gnu.62/wipe_build job_size:36208
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/intel.17/var_summary job_size:36464
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/intel.17
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/intel.17/git_srcs job_size:36610
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/intel.17/make_build_dir job_size:35104
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/intel.17/config job_size:35894
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/intel.17/make_update job_size:34622
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/intel.17/build job_size:34973
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/intel.17/test job_size:35963
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/intel.17/wipe_build job_size:36242
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/cray.85/var_summary job_size:36397
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/cray.85
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/cray.85/git_srcs job_size:36528
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/cray.85/make_build_dir job_size:35035
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/cray.85/config job_size:35826
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/cray.85/make_update job_size:34557
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/cray.85/build job_size:34908
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/cray.85/test job_size:35898
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cck/cray.85/wipe_build job_size:36175
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.49/var_summary job_size:36426
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.49/git_srcs job_size:36542
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.49/make_build_dir job_size:35062
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.49/config job_size:35854
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.49/make_update job_size:34588
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.49/build job_size:34939
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.49/test job_size:35929
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.49/wipe_build job_size:36204
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.53/var_summary job_size:36426
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.53/git_srcs job_size:36542
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.53/make_build_dir job_size:35062
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.53/config job_size:35854
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.53/make_update job_size:34588
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.53/build job_size:34939
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.53/test job_size:35929
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/gnu.53/wipe_build job_size:36204
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.14/var_summary job_size:36491
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.14
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.14/git_srcs job_size:36637
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.14/make_build_dir job_size:35131
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.14/config job_size:35921
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.14/make_update job_size:34649
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.14/build job_size:35000
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.14/test job_size:35990
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.14/wipe_build job_size:36269
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.15/var_summary job_size:36491
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.15
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.15/git_srcs job_size:36637
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.15/make_build_dir job_size:35131
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.15/config job_size:35921
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.15/make_update job_size:34649
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.15/build job_size:35000
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.15/test job_size:35990
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.15/wipe_build job_size:36269
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.16/var_summary job_size:36491
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.16/git_srcs job_size:36637
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.16/make_build_dir job_size:35131
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.16/config job_size:35921
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.16/make_update job_size:34649
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.16/build job_size:35000
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.16/test job_size:35990
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/intel.16/wipe_build job_size:36269
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.84/var_summary job_size:36393
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.84
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.84/git_srcs job_size:36524
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.84/make_build_dir job_size:35031
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.84/config job_size:35822
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.84/make_update job_size:34553
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.84/build job_size:34904
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.84/test job_size:35894
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.84/wipe_build job_size:36171
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.85/var_summary job_size:36393
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.85
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.85/git_srcs job_size:36524
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.85/make_build_dir job_size:35031
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.85/config job_size:35822
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.85/make_update job_size:34553
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.85/build job_size:34904
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.85/test job_size:35894
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.85/wipe_build job_size:36171
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.846/var_summary job_size:36421
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.846
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.846/git_srcs job_size:36567
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.846/make_build_dir job_size:35061
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.846/config job_size:35851
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.846/make_update job_size:34579
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.846/build job_size:34930
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.846/test job_size:35920
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cct/cray.846/wipe_build job_size:36199
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/gnu.53/var_summary job_size:15697
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/gnu.53/git_srcs job_size:15653
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/gnu.53/make_build_dir job_size:14210
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/gnu.53/config job_size:15196
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/gnu.53/make_update job_size:13854
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/gnu.53/build job_size:14337
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/gnu.53/test job_size:15349
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/gnu.53/wipe_build job_size:15462
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/intel.16/var_summary job_size:15735
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/intel.16/git_srcs job_size:15721
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/intel.16/make_build_dir job_size:14252
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/intel.16/config job_size:15236
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/intel.16/make_update job_size:13888
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/intel.16/build job_size:14371
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/intel.16/test job_size:15383
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/intel.16/wipe_build job_size:15500
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/pgi.16/var_summary job_size:15789
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/pgi.16
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/pgi.16/git_srcs job_size:15745
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/pgi.16/make_build_dir job_size:14302
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/pgi.16/config job_size:15288
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/pgi.16/make_update job_size:13946
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/pgi.16/build job_size:14429
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/pgi.16/test job_size:15441
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxg/pgi.16/wipe_build job_size:15554
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.48/var_summary job_size:15751
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.48
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.48/git_srcs job_size:15809
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.48/make_build_dir job_size:14275
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.48/config job_size:15202
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.48/make_update job_size:13891
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.48/build job_size:14374
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.48/test job_size:15386
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.48/wipe_build job_size:15514
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.53/var_summary job_size:15775
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.53/git_srcs job_size:15833
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.53/make_build_dir job_size:14299
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.53/config job_size:15226
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.53/make_update job_size:13915
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.53/build job_size:14398
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.53/test job_size:15410
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.53/wipe_build job_size:15538
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.61/var_summary job_size:15775
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.61
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.61/git_srcs job_size:15833
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.61/make_build_dir job_size:14299
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.61/config job_size:15226
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.61/make_update job_size:13915
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.61/build job_size:14398
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.61/test job_size:15410
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/gnu.61/wipe_build job_size:15538
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/intel.16/var_summary job_size:15808
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/intel.16/git_srcs job_size:15896
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/intel.16/make_build_dir job_size:14336
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/intel.16/config job_size:15261
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/intel.16/make_update job_size:13944
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/intel.16/build job_size:14427
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/intel.16/test job_size:15439
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/opensuse131/intel.16/wipe_build job_size:15571
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.49/var_summary job_size:15596
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.49/git_srcs job_size:15552
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.49/make_build_dir job_size:14109
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.49/config job_size:15043
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.49/make_update job_size:13753
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.49/build job_size:14236
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.49/test job_size:15248
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.49/wipe_build job_size:15361
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.53/var_summary job_size:15620
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.53/git_srcs job_size:15576
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.53/make_build_dir job_size:14133
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.53/config job_size:15067
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.53/make_update job_size:13777
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.53/build job_size:14260
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.53/test job_size:15272
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/gnu.53/wipe_build job_size:15385
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/pgi/var_summary job_size:15604
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/pgi
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/pgi/git_srcs job_size:15515
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/pgi/make_build_dir job_size:14111
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/pgi/config job_size:15048
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/pgi/make_update job_size:13767
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/pgi/build job_size:14250
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/pgi/test job_size:15262
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/lxc/pgi/wipe_build job_size:15369
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.53/var_summary job_size:15623
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.53/git_srcs job_size:15606
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.53/make_build_dir job_size:14137
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.53/config job_size:15069
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.53/make_update job_size:13773
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.53/build job_size:14256
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.53/test job_size:15268
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.53/wipe_build job_size:15386
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.61/var_summary job_size:15647
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.61
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.61/git_srcs job_size:15630
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.61/make_build_dir job_size:14161
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.61/config job_size:15093
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.61/make_update job_size:13797
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.61/build job_size:14280
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.61/test job_size:15292
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/gnu.61/wipe_build job_size:15410
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/pgi/var_summary job_size:15631
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/pgi
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/pgi/git_srcs job_size:15569
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/pgi/make_build_dir job_size:14139
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/pgi/config job_size:15074
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/pgi/make_update job_size:13787
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/pgi/build job_size:14270
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/pgi/test job_size:15282
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/leap42/pgi/wipe_build job_size:15394
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.49/var_summary job_size:36426
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.49/git_srcs job_size:36542
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.49/make_build_dir job_size:35062
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.49/config job_size:35854
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.49/make_update job_size:34588
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.49/build job_size:34939
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.49/test job_size:35929
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.49/wipe_build job_size:36204
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.53/var_summary job_size:36426
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.53/git_srcs job_size:36542
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.53/make_build_dir job_size:35062
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.53/config job_size:35854
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.53/make_update job_size:34588
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.53/build job_size:34939
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.53/test job_size:35929
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/gnu.53/wipe_build job_size:36204
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.14/var_summary job_size:36491
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.14
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.14/git_srcs job_size:36637
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.14/make_build_dir job_size:35131
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.14/config job_size:35921
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.14/make_update job_size:34649
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.14/build job_size:35000
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.14/test job_size:35990
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.14/wipe_build job_size:36269
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.15/var_summary job_size:36491
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.15
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.15/git_srcs job_size:36637
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.15/make_build_dir job_size:35131
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.15/config job_size:35921
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.15/make_update job_size:34649
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.15/build job_size:35000
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.15/test job_size:35990
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.15/wipe_build job_size:36269
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.16/var_summary job_size:36467
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.16/git_srcs job_size:36613
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.16/make_build_dir job_size:35107
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.16/config job_size:35897
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.16/make_update job_size:34625
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.16/build job_size:34976
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.16/test job_size:35966
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/intel.16/wipe_build job_size:36245
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.84/var_summary job_size:36393
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.84
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.84/git_srcs job_size:36524
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.84/make_build_dir job_size:35031
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.84/config job_size:35822
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.84/make_update job_size:34553
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.84/build job_size:34904
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.84/test job_size:35894
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.84/wipe_build job_size:36171
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.846/var_summary job_size:36421
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.846
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.846/git_srcs job_size:36567
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.846/make_build_dir job_size:35061
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.846/config job_size:35851
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.846/make_update job_size:34579
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.846/build job_size:34930
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.846/test job_size:35920
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/cca/cray.846/wipe_build job_size:36199
+WAR:[12:55:59 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.49/var_summary job_size:36426
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.49/git_srcs job_size:36542
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.49/make_build_dir job_size:35062
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.49/config job_size:35854
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.49/make_update job_size:34588
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.49/build job_size:34939
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.49/test job_size:35929
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.49/wipe_build job_size:36204
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.53/var_summary job_size:36426
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.53/git_srcs job_size:36542
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.53/make_build_dir job_size:35062
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.53/config job_size:35854
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.53/make_update job_size:34588
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.53/build job_size:34939
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.53/test job_size:35929
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/gnu.53/wipe_build job_size:36204
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.14/var_summary job_size:36491
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.14
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.14/git_srcs job_size:36637
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.14/make_build_dir job_size:35131
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.14/config job_size:35921
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.14/make_update job_size:34649
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.14/build job_size:35000
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.14/test job_size:35990
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.14/wipe_build job_size:36269
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.15/var_summary job_size:36491
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.15
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.15/git_srcs job_size:36637
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.15/make_build_dir job_size:35131
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.15/config job_size:35921
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.15/make_update job_size:34649
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.15/build job_size:35000
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.15/test job_size:35990
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.15/wipe_build job_size:36269
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.16/var_summary job_size:36467
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.16/git_srcs job_size:36613
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.16/make_build_dir job_size:35107
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.16/config job_size:35897
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.16/make_update job_size:34625
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.16/build job_size:34976
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.16/test job_size:35966
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/intel.16/wipe_build job_size:36245
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.84/var_summary job_size:36393
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.84
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.84/git_srcs job_size:36524
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.84/make_build_dir job_size:35031
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.84/config job_size:35822
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.84/make_update job_size:34553
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.84/build job_size:34904
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.84/test job_size:35894
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.84/wipe_build job_size:36171
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.846/var_summary job_size:36421
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.846
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.846/git_srcs job_size:36567
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.846/make_build_dir job_size:35061
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.846/config job_size:35851
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.846/make_update job_size:34579
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.846/build job_size:34930
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.846/test job_size:35920
+LOG:[12:55:59 13.4.2017] submitted: /atlas_bundle/ccb/cray.846/wipe_build job_size:36199
+LOG:[12:55:59 13.4.2017] submitted: /mars_compare/regenerate job_size:15449
+LOG:[12:55:59 13.4.2017] submitted: /mars_compare
+LOG:[12:55:59 13.4.2017] submitted: /eigen/regenerate job_size:15459
+LOG:[12:55:59 13.4.2017] submitted: /eigen
+LOG:[12:55:59 13.4.2017] submitted: /eigen/cck/var_summary job_size:35843
+LOG:[12:55:59 13.4.2017] submitted: /eigen/cck
+LOG:[12:55:59 13.4.2017] submitted: /eigen/cck/download job_size:34233
+LOG:[12:55:59 13.4.2017] submitted: /eigen/cck/make_build_dir job_size:34478
+LOG:[12:55:59 13.4.2017] submitted: /eigen/cck/config job_size:35162
+LOG:[12:55:59 13.4.2017] submitted: /eigen/cck/build job_size:34418
+LOG:[12:55:59 13.4.2017] submitted: /eigen/cck/add_write_perm job_size:35117
+LOG:[12:55:59 13.4.2017] submitted: /eigen/cck/install job_size:35082
+LOG:[12:55:59 13.4.2017] submitted: /eigen/cck/install_log job_size:38530
+LOG:[12:55:59 13.4.2017] submitted: /eigen/cck/remove_write_perm job_size:35222
+LOG:[12:55:59 13.4.2017] submitted: /eigen/cck/module_sync job_size:34082
+LOG:[12:55:59 13.4.2017] submitted: /eigen/cck/wipe_build job_size:35637
+WAR:[12:55:59 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:55:59 13.4.2017] submitted: /eckit/regenerate job_size:15315
+LOG:[12:55:59 13.4.2017] submitted: /eckit
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.49/var_summary job_size:15505
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.49/git_srcs job_size:15484
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.49/make_build_dir job_size:14066
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.49/config job_size:14955
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.49/build job_size:14176
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.49/test job_size:15006
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.49/add_write_perm job_size:14731
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.49/install job_size:14854
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.49/install_log job_size:18648
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.49/remove_write_perm job_size:14770
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.49/module_sync job_size:13717
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.49/wipe_build job_size:15311
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.53/var_summary job_size:15529
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.53/git_srcs job_size:15508
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.53/make_build_dir job_size:14090
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.53/config job_size:14979
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.53/build job_size:14200
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.53/test job_size:15030
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.53/add_write_perm job_size:14755
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.53/install job_size:14878
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.53/install_log job_size:18672
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.53/remove_write_perm job_size:14794
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.53/module_sync job_size:13741
+LOG:[12:55:59 13.4.2017] submitted: /eckit/lxop_dev/gnu.53/wipe_build job_size:15335
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.53/var_summary job_size:35988
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.53/git_srcs job_size:35944
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.53/make_build_dir job_size:34632
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.53/config job_size:35363
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.53/build job_size:34536
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.53/test job_size:35344
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.53/add_write_perm job_size:35261
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.53/install job_size:35232
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.53/install_log job_size:38825
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.53/remove_write_perm job_size:35366
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.53/module_sync job_size:34206
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.53/wipe_build job_size:35780
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.62/var_summary job_size:35988
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.62
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.62/git_srcs job_size:35944
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.62/make_build_dir job_size:34632
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.62/config job_size:35363
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.62/build job_size:34536
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.62/test job_size:35344
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.62/add_write_perm job_size:35261
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.62/install job_size:35232
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.62/install_log job_size:38825
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.62/remove_write_perm job_size:35366
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.62/module_sync job_size:34206
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/gnu.62/wipe_build job_size:35780
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/intel.17/var_summary job_size:36022
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/intel.17
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/intel.17/git_srcs job_size:36008
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/intel.17/make_build_dir job_size:34670
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/intel.17/config job_size:35397
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/intel.17/build job_size:34566
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/intel.17/test job_size:35374
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/intel.17/add_write_perm job_size:35291
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/intel.17/install job_size:35264
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/intel.17/install_log job_size:38861
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/intel.17/remove_write_perm job_size:35396
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/intel.17/module_sync job_size:34234
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/intel.17/wipe_build job_size:35814
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/cray.85/var_summary job_size:35955
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/cray.85
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/cray.85/git_srcs job_size:35926
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/cray.85/make_build_dir job_size:34601
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/cray.85/config job_size:35330
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/cray.85/build job_size:34501
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/cray.85/test job_size:35309
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/cray.85/add_write_perm job_size:35226
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/cray.85/install job_size:35198
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/cray.85/install_log job_size:38793
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/cray.85/remove_write_perm job_size:35331
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/cray.85/module_sync job_size:34170
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cck/cray.85/wipe_build job_size:35747
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.49/var_summary job_size:35984
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.49
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.49/git_srcs job_size:35940
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.49/make_build_dir job_size:34628
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.49/config job_size:35359
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.49/build job_size:34532
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.49/test job_size:35340
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.49/add_write_perm job_size:35257
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.49/install job_size:35228
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.49/install_log job_size:38821
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.49/remove_write_perm job_size:35362
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.49/module_sync job_size:34202
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.49/wipe_build job_size:35776
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.53/var_summary job_size:35957
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.53
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.53/git_srcs job_size:35913
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.53/make_build_dir job_size:34601
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.53/config job_size:35332
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.53/build job_size:34505
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.53/test job_size:35313
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.53/add_write_perm job_size:35230
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.53/install job_size:35201
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.53/install_log job_size:38794
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.53/remove_write_perm job_size:35335
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.53/module_sync job_size:34175
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/gnu.53/wipe_build job_size:35749
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.14/var_summary job_size:36049
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.14
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.14/git_srcs job_size:36035
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.14/make_build_dir job_size:34697
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.14/config job_size:35424
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.14/build job_size:34593
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.14/test job_size:35401
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.14/add_write_perm job_size:35318
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.14/install job_size:35291
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.14/install_log job_size:38888
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.14/remove_write_perm job_size:35423
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.14/module_sync job_size:34261
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.14/wipe_build job_size:35841
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.15/var_summary job_size:36049
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.15
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.15/git_srcs job_size:36035
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.15/make_build_dir job_size:34697
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.15/config job_size:35424
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.15/build job_size:34593
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.15/test job_size:35401
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.15/add_write_perm job_size:35318
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.15/install job_size:35291
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.15/install_log job_size:38888
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.15/remove_write_perm job_size:35423
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.15/module_sync job_size:34261
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.15/wipe_build job_size:35841
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.16/var_summary job_size:36049
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.16
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.16/git_srcs job_size:36035
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.16/make_build_dir job_size:34697
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.16/config job_size:35424
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.16/build job_size:34593
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.16/test job_size:35401
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.16/add_write_perm job_size:35318
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.16/install job_size:35291
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.16/install_log job_size:38888
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.16/remove_write_perm job_size:35423
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.16/module_sync job_size:34261
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/intel.16/wipe_build job_size:35841
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/cray.84/var_summary job_size:35951
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/cray.84
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/cray.84/git_srcs job_size:35922
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/cray.84/make_build_dir job_size:34597
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/cray.84/config job_size:35326
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/cray.84/build job_size:34497
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/cray.84/test job_size:35305
+LOG:[12:55:59 13.4.2017] submitted: /eckit/cct/cray.84/add_write_perm job_size:35222
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.84/install job_size:35194
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.84/install_log job_size:38789
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.84/remove_write_perm job_size:35327
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.84/module_sync job_size:34166
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.84/wipe_build job_size:35743
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.85/var_summary job_size:35951
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.85
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.85/git_srcs job_size:35922
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.85/make_build_dir job_size:34597
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.85/config job_size:35326
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.85/build job_size:34497
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.85/test job_size:35305
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.85/add_write_perm job_size:35222
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.85/install job_size:35194
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.85/install_log job_size:38789
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.85/remove_write_perm job_size:35327
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.85/module_sync job_size:34166
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.85/wipe_build job_size:35743
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.846/var_summary job_size:35979
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.846
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.846/git_srcs job_size:35965
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.846/make_build_dir job_size:34627
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.846/config job_size:35354
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.846/build job_size:34523
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.846/test job_size:35331
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.846/add_write_perm job_size:35248
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.846/install job_size:35221
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.846/install_log job_size:38818
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.846/remove_write_perm job_size:35353
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.846/module_sync job_size:34191
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cct/cray.846/wipe_build job_size:35771
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappa/var_summary job_size:15399
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappa
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappa/git_srcs job_size:15120
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappa/make_build_dir job_size:13910
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappa/config job_size:14765
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappa/build job_size:14084
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappa/test job_size:14914
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappa/add_write_perm job_size:14598
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappa/install job_size:14705
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappa/install_log job_size:18075
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappa/remove_write_perm job_size:14637
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappa/module_sync job_size:13642
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappa/wipe_build job_size:15191
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.44/var_summary job_size:15464
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.44
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.44/git_srcs job_size:15329
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.44/make_build_dir job_size:14002
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.44/config job_size:14880
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.44/build job_size:14140
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.44/test job_size:14970
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.44/add_write_perm job_size:14695
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.44/install job_size:14811
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.44/install_log job_size:18600
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.44/remove_write_perm job_size:14734
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.44/module_sync job_size:13688
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.44/wipe_build job_size:15256
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.53/var_summary job_size:15413
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.53/git_srcs job_size:15278
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.53/make_build_dir job_size:13951
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.53/config job_size:14829
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.53/build job_size:14089
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.53/test job_size:14919
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.53/add_write_perm job_size:14644
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.53/install job_size:14760
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.53/install_log job_size:18549
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.53/remove_write_perm job_size:14683
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.53/module_sync job_size:13637
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ecgb/gnu.53/wipe_build job_size:15205
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/gnu.53/var_summary job_size:15426
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/gnu.53/git_srcs job_size:15222
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/gnu.53/make_build_dir job_size:13947
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/gnu.53/config job_size:14903
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/gnu.53/build job_size:14101
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/gnu.53/test job_size:14931
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/gnu.53/add_write_perm job_size:14656
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/gnu.53/install job_size:14768
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/gnu.53/install_log job_size:18558
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/gnu.53/remove_write_perm job_size:14695
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/gnu.53/module_sync job_size:13652
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/gnu.53/wipe_build job_size:15212
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/intel.16/var_summary job_size:15486
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/intel.16
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/intel.16/git_srcs job_size:15312
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/intel.16/make_build_dir job_size:14011
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/intel.16/config job_size:14963
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/intel.16/build job_size:14157
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/intel.16/test job_size:14987
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/intel.16/add_write_perm job_size:14712
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/intel.16/install job_size:14826
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/intel.16/install_log job_size:18620
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/intel.16/remove_write_perm job_size:14751
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/intel.16/module_sync job_size:13706
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/intel.16/wipe_build job_size:15272
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/pgi.16/var_summary job_size:15464
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/pgi.16
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/pgi.16/git_srcs job_size:15260
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/pgi.16/make_build_dir job_size:13985
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/pgi.16/config job_size:14941
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/pgi.16/build job_size:14139
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/pgi.16/test job_size:14969
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/pgi.16/add_write_perm job_size:14694
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/pgi.16/install job_size:14806
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/pgi.16/install_log job_size:18596
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/pgi.16/remove_write_perm job_size:14733
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/pgi.16/module_sync job_size:13690
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxg/pgi.16/wipe_build job_size:15250
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.48/var_summary job_size:15504
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.48
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.48/git_srcs job_size:15402
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.48/make_build_dir job_size:14036
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.48/config job_size:14908
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.48/build job_size:14162
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.48/test job_size:14992
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.48/add_write_perm job_size:14717
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.48/install job_size:14836
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.48/install_log job_size:18643
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.48/remove_write_perm job_size:14756
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.48/module_sync job_size:13714
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.48/wipe_build job_size:15288
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.53/var_summary job_size:15528
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.53/git_srcs job_size:15426
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.53/make_build_dir job_size:14060
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.53/config job_size:14932
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.53/build job_size:14186
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.53/test job_size:15016
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.53/add_write_perm job_size:14741
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.53/install job_size:14860
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.53/install_log job_size:18667
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.53/remove_write_perm job_size:14780
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.53/module_sync job_size:13738
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.53/wipe_build job_size:15312
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.61/var_summary job_size:15528
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.61
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.61/git_srcs job_size:15426
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.61/make_build_dir job_size:14060
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.61/config job_size:14932
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.61/build job_size:14186
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.61/test job_size:15016
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.61/add_write_perm job_size:14741
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.61/install job_size:14860
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.61/install_log job_size:18667
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.61/remove_write_perm job_size:14780
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.61/module_sync job_size:13738
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/gnu.61/wipe_build job_size:15312
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/pgi/var_summary job_size:15512
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/pgi
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/pgi/git_srcs job_size:15365
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/pgi/make_build_dir job_size:14038
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/pgi/config job_size:14916
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/pgi/build job_size:14176
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/pgi/test job_size:15006
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/pgi/add_write_perm job_size:14731
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/pgi/install job_size:14847
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/pgi/install_log job_size:18648
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/pgi/remove_write_perm job_size:14770
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/pgi/module_sync job_size:13731
+LOG:[12:56:00 13.4.2017] submitted: /eckit/opensuse131/pgi/wipe_build job_size:15296
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.49/var_summary job_size:15427
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.49
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.49/git_srcs job_size:15223
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.49/make_build_dir job_size:13948
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.49/config job_size:14834
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.49/build job_size:14102
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.49/test job_size:14932
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.49/add_write_perm job_size:14657
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.49/install job_size:14769
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.49/install_log job_size:18559
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.49/remove_write_perm job_size:14696
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.49/module_sync job_size:13653
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.49/wipe_build job_size:15213
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.53/var_summary job_size:15424
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.53/git_srcs job_size:15220
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.53/make_build_dir job_size:13945
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.53/config job_size:14831
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.53/build job_size:14099
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.53/test job_size:14929
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.53/add_write_perm job_size:14654
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.53/install job_size:14766
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.53/install_log job_size:18556
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.53/remove_write_perm job_size:14693
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.53/module_sync job_size:13650
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/gnu.53/wipe_build job_size:15210
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/pgi/var_summary job_size:15435
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/pgi
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/pgi/git_srcs job_size:15186
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/pgi/make_build_dir job_size:13950
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/pgi/config job_size:14842
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/pgi/build job_size:14116
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/pgi/test job_size:14946
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/pgi/add_write_perm job_size:14671
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/pgi/install job_size:14780
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/pgi/install_log job_size:18564
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/pgi/remove_write_perm job_size:14710
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/pgi/module_sync job_size:13670
+LOG:[12:56:00 13.4.2017] submitted: /eckit/lxc/pgi/wipe_build job_size:15221
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.53/var_summary job_size:15454
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.53/git_srcs job_size:15277
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.53/make_build_dir job_size:13976
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.53/config job_size:14858
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.53/build job_size:14122
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.53/test job_size:14952
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.53/add_write_perm job_size:14677
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.53/install job_size:14791
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.53/install_log job_size:18588
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.53/remove_write_perm job_size:14716
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.53/module_sync job_size:13674
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.53/wipe_build job_size:15238
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.61/var_summary job_size:15478
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.61
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.61/git_srcs job_size:15301
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.61/make_build_dir job_size:14000
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.61/config job_size:14882
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.61/build job_size:14146
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.61/test job_size:14976
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.61/add_write_perm job_size:14701
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.61/install job_size:14815
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.61/install_log job_size:18612
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.61/remove_write_perm job_size:14740
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.61/module_sync job_size:13698
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/gnu.61/wipe_build job_size:15262
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/pgi/var_summary job_size:15462
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/pgi
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/pgi/git_srcs job_size:15240
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/pgi/make_build_dir job_size:13978
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/pgi/config job_size:14866
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/pgi/build job_size:14136
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/pgi/test job_size:14966
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/pgi/add_write_perm job_size:14691
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/pgi/install job_size:14802
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/pgi/install_log job_size:18593
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/pgi/remove_write_perm job_size:14730
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/pgi/module_sync job_size:13691
+LOG:[12:56:00 13.4.2017] submitted: /eckit/leap42/pgi/wipe_build job_size:15246
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappb/var_summary job_size:15399
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappb
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappb/git_srcs job_size:15120
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappb/make_build_dir job_size:13910
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappb/config job_size:14765
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappb/build job_size:14084
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappb/test job_size:14914
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappb/add_write_perm job_size:14598
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappb/install job_size:14705
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappb/install_log job_size:18075
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappb/remove_write_perm job_size:14637
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappb/module_sync job_size:13642
+LOG:[12:56:00 13.4.2017] submitted: /eckit/sappb/wipe_build job_size:15191
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.49/var_summary job_size:35984
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.49
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.49/git_srcs job_size:35940
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.49/make_build_dir job_size:34628
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.49/config job_size:35359
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.49/build job_size:34532
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.49/test job_size:35340
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.49/add_write_perm job_size:35257
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.49/install job_size:35228
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.49/install_log job_size:38821
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.49/remove_write_perm job_size:35362
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.49/module_sync job_size:34202
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.49/wipe_build job_size:35776
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.53/var_summary job_size:35957
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.53/git_srcs job_size:35913
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.53/make_build_dir job_size:34601
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.53/config job_size:35332
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.53/build job_size:34505
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.53/test job_size:35313
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.53/add_write_perm job_size:35230
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.53/install job_size:35201
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.53/install_log job_size:38794
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.53/remove_write_perm job_size:35335
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.53/module_sync job_size:34175
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/gnu.53/wipe_build job_size:35749
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.14/var_summary job_size:36049
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.14
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.14/git_srcs job_size:36035
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.14/make_build_dir job_size:34697
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.14/config job_size:35424
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.14/build job_size:34593
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.14/test job_size:35401
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.14/add_write_perm job_size:35318
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.14/install job_size:35291
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.14/install_log job_size:38888
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.14/remove_write_perm job_size:35423
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.14/module_sync job_size:34261
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.14/wipe_build job_size:35841
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.15/var_summary job_size:36049
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.15
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.15/git_srcs job_size:36035
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.15/make_build_dir job_size:34697
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.15/config job_size:35424
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.15/build job_size:34593
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.15/test job_size:35401
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.15/add_write_perm job_size:35318
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.15/install job_size:35291
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.15/install_log job_size:38888
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.15/remove_write_perm job_size:35423
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.15/module_sync job_size:34261
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.15/wipe_build job_size:35841
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.16/var_summary job_size:36025
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.16
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.16/git_srcs job_size:36011
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.16/make_build_dir job_size:34673
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.16/config job_size:35400
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.16/build job_size:34569
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.16/test job_size:35377
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.16/add_write_perm job_size:35294
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.16/install job_size:35267
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.16/install_log job_size:38864
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.16/remove_write_perm job_size:35399
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.16/module_sync job_size:34237
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/intel.16/wipe_build job_size:35817
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.84/var_summary job_size:35951
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.84
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.84/git_srcs job_size:35922
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.84/make_build_dir job_size:34597
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.84/config job_size:35326
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.84/build job_size:34497
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.84/test job_size:35305
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.84/add_write_perm job_size:35222
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.84/install job_size:35194
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.84/install_log job_size:38789
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.84/remove_write_perm job_size:35327
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.84/module_sync job_size:34166
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.84/wipe_build job_size:35743
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.846/var_summary job_size:35979
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.846
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.846/git_srcs job_size:35965
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.846/make_build_dir job_size:34627
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.846/config job_size:35354
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.846/build job_size:34523
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.846/test job_size:35331
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.846/add_write_perm job_size:35248
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.846/install job_size:35221
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.846/install_log job_size:38818
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.846/remove_write_perm job_size:35353
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.846/module_sync job_size:34191
+LOG:[12:56:00 13.4.2017] submitted: /eckit/cca/cray.846/wipe_build job_size:35771
+WAR:[12:56:00 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.49/var_summary job_size:35984
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.49
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.49/git_srcs job_size:35940
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.49/make_build_dir job_size:34628
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.49/config job_size:35359
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.49/build job_size:34532
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.49/test job_size:35340
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.49/add_write_perm job_size:35257
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.49/install job_size:35228
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.49/install_log job_size:38821
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.49/remove_write_perm job_size:35362
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.49/module_sync job_size:34202
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.49/wipe_build job_size:35776
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.53/var_summary job_size:35957
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.53/git_srcs job_size:35913
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.53/make_build_dir job_size:34601
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.53/config job_size:35332
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.53/build job_size:34505
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.53/test job_size:35313
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.53/add_write_perm job_size:35230
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.53/install job_size:35201
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.53/install_log job_size:38794
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.53/remove_write_perm job_size:35335
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.53/module_sync job_size:34175
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/gnu.53/wipe_build job_size:35749
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.14/var_summary job_size:36049
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.14
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.14/git_srcs job_size:36035
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.14/make_build_dir job_size:34697
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.14/config job_size:35424
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.14/build job_size:34593
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.14/test job_size:35401
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.14/add_write_perm job_size:35318
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.14/install job_size:35291
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.14/install_log job_size:38888
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.14/remove_write_perm job_size:35423
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.14/module_sync job_size:34261
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.14/wipe_build job_size:35841
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.15/var_summary job_size:36049
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.15
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.15/git_srcs job_size:36035
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.15/make_build_dir job_size:34697
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.15/config job_size:35424
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.15/build job_size:34593
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.15/test job_size:35401
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.15/add_write_perm job_size:35318
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.15/install job_size:35291
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.15/install_log job_size:38888
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.15/remove_write_perm job_size:35423
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.15/module_sync job_size:34261
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.15/wipe_build job_size:35841
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.16/var_summary job_size:36025
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.16
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.16/git_srcs job_size:36011
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.16/make_build_dir job_size:34673
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.16/config job_size:35400
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.16/build job_size:34569
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.16/test job_size:35377
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.16/add_write_perm job_size:35294
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.16/install job_size:35267
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.16/install_log job_size:38864
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.16/remove_write_perm job_size:35399
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.16/module_sync job_size:34237
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/intel.16/wipe_build job_size:35817
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.84/var_summary job_size:35951
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.84
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.84/git_srcs job_size:35922
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.84/make_build_dir job_size:34597
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.84/config job_size:35326
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.84/build job_size:34497
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.84/test job_size:35305
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.84/add_write_perm job_size:35222
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.84/install job_size:35194
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.84/install_log job_size:38789
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.84/remove_write_perm job_size:35327
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.84/module_sync job_size:34166
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.84/wipe_build job_size:35743
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.846/var_summary job_size:35979
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.846
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.846/git_srcs job_size:35965
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.846/make_build_dir job_size:34627
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.846/config job_size:35354
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.846/build job_size:34523
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.846/test job_size:35331
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.846/add_write_perm job_size:35248
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.846/install job_size:35221
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.846/install_log job_size:38818
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.846/remove_write_perm job_size:35353
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.846/module_sync job_size:34191
+LOG:[12:56:00 13.4.2017] submitted: /eckit/ccb/cray.846/wipe_build job_size:35771
+LOG:[12:56:00 13.4.2017] submitted: /odb/regenerate job_size:15277
+LOG:[12:56:00 13.4.2017] submitted: /odb
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.49/var_summary job_size:15429
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.49
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.49/git_srcs job_size:15355
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.49/make_build_dir job_size:13992
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.49/config job_size:14852
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.49/build job_size:14110
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.49/test job_size:14940
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.49/add_write_perm job_size:14658
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.49/install job_size:14778
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.49/install_log job_size:18545
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.49/remove_write_perm job_size:14697
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.49/module_sync job_size:13651
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.49/wipe_build job_size:15241
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.53/var_summary job_size:15453
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.53/git_srcs job_size:15379
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.53/make_build_dir job_size:14016
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.53/config job_size:14876
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.53/build job_size:14134
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.53/test job_size:14964
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.53/add_write_perm job_size:14682
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.53/install job_size:14802
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.53/install_log job_size:18569
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.53/remove_write_perm job_size:14721
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.53/module_sync job_size:13675
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxop_dev/gnu.53/wipe_build job_size:15265
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.53/var_summary job_size:35834
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.53/git_srcs job_size:35737
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.53/make_build_dir job_size:34480
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.53/config job_size:35182
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.53/build job_size:34392
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.53/test job_size:35200
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.53/add_write_perm job_size:35110
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.53/install job_size:35078
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.53/install_log job_size:38644
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.53/remove_write_perm job_size:35215
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.53/module_sync job_size:34062
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.53/wipe_build job_size:35630
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.62/var_summary job_size:35834
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.62
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.62/git_srcs job_size:35737
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.62/make_build_dir job_size:34480
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.62/config job_size:35182
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.62/build job_size:34392
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.62/test job_size:35200
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.62/add_write_perm job_size:35110
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.62/install job_size:35078
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.62/install_log job_size:38644
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.62/remove_write_perm job_size:35215
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.62/module_sync job_size:34062
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/gnu.62/wipe_build job_size:35630
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/intel.17/var_summary job_size:35868
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/intel.17
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/intel.17/git_srcs job_size:35801
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/intel.17/make_build_dir job_size:34518
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/intel.17/config job_size:35245
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/intel.17/build job_size:34422
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/intel.17/test job_size:35230
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/intel.17/add_write_perm job_size:35140
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/intel.17/install job_size:35110
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/intel.17/install_log job_size:38680
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/intel.17/remove_write_perm job_size:35245
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/intel.17/module_sync job_size:34090
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/intel.17/wipe_build job_size:35664
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/cray.85/var_summary job_size:35801
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/cray.85
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/cray.85/git_srcs job_size:35719
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/cray.85/make_build_dir job_size:34449
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/cray.85/config job_size:35177
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/cray.85/build job_size:34357
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/cray.85/test job_size:35165
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/cray.85/add_write_perm job_size:35075
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/cray.85/install job_size:35044
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/cray.85/install_log job_size:38612
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/cray.85/remove_write_perm job_size:35180
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/cray.85/module_sync job_size:34026
+LOG:[12:56:00 13.4.2017] submitted: /odb/cck/cray.85/wipe_build job_size:35597
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.49/var_summary job_size:35830
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.49
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.49/git_srcs job_size:35733
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.49/make_build_dir job_size:34476
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.49/config job_size:35178
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.49/build job_size:34388
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.49/test job_size:35196
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.49/add_write_perm job_size:35106
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.49/install job_size:35074
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.49/install_log job_size:38640
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.49/remove_write_perm job_size:35211
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.49/module_sync job_size:34058
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.49/wipe_build job_size:35626
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.53/var_summary job_size:35830
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.53/git_srcs job_size:35733
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.53/make_build_dir job_size:34476
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.53/config job_size:35178
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.53/build job_size:34388
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.53/test job_size:35196
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.53/add_write_perm job_size:35106
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.53/install job_size:35074
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.53/install_log job_size:38640
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.53/remove_write_perm job_size:35211
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.53/module_sync job_size:34058
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/gnu.53/wipe_build job_size:35626
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.14/var_summary job_size:35895
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.14
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.14/git_srcs job_size:35828
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.14/make_build_dir job_size:34545
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.14/config job_size:35296
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.14/build job_size:34449
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.14/test job_size:35257
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.14/add_write_perm job_size:35167
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.14/install job_size:35137
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.14/install_log job_size:38707
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.14/remove_write_perm job_size:35272
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.14/module_sync job_size:34117
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.14/wipe_build job_size:35691
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.15/var_summary job_size:35895
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.15
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.15/git_srcs job_size:35828
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.15/make_build_dir job_size:34545
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.15/config job_size:35272
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.15/build job_size:34449
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.15/test job_size:35257
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.15/add_write_perm job_size:35167
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.15/install job_size:35137
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.15/install_log job_size:38707
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.15/remove_write_perm job_size:35272
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.15/module_sync job_size:34117
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.15/wipe_build job_size:35691
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.16/var_summary job_size:35895
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.16
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.16/git_srcs job_size:35828
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.16/make_build_dir job_size:34545
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.16/config job_size:35272
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.16/build job_size:34449
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.16/test job_size:35257
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.16/add_write_perm job_size:35167
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.16/install job_size:35137
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.16/install_log job_size:38707
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.16/remove_write_perm job_size:35272
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.16/module_sync job_size:34117
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/intel.16/wipe_build job_size:35691
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.84/var_summary job_size:35797
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.84
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.84/git_srcs job_size:35715
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.84/make_build_dir job_size:34445
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.84/config job_size:35173
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.84/build job_size:34353
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.84/test job_size:35161
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.84/add_write_perm job_size:35071
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.84/install job_size:35040
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.84/install_log job_size:38608
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.84/remove_write_perm job_size:35176
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.84/module_sync job_size:34022
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.84/wipe_build job_size:35593
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.85/var_summary job_size:35797
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.85
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.85/git_srcs job_size:35715
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.85/make_build_dir job_size:34445
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.85/config job_size:35173
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.85/build job_size:34353
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.85/test job_size:35161
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.85/add_write_perm job_size:35071
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.85/install job_size:35040
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.85/install_log job_size:38608
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.85/remove_write_perm job_size:35176
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.85/module_sync job_size:34022
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.85/wipe_build job_size:35593
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.846/var_summary job_size:35825
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.846
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.846/git_srcs job_size:35758
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.846/make_build_dir job_size:34475
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.846/config job_size:35201
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.846/build job_size:34379
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.846/test job_size:35187
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.846/add_write_perm job_size:35097
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.846/install job_size:35067
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.846/install_log job_size:38637
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.846/remove_write_perm job_size:35202
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.846/module_sync job_size:34047
+LOG:[12:56:00 13.4.2017] submitted: /odb/cct/cray.846/wipe_build job_size:35621
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappa/var_summary job_size:15317
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappa
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappa/git_srcs job_size:14985
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappa/make_build_dir job_size:13830
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappa/config job_size:14656
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappa/build job_size:14012
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappa/test job_size:14842
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappa/add_write_perm job_size:14519
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappa/install job_size:14623
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappa/install_log job_size:17966
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappa/remove_write_perm job_size:14558
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappa/module_sync job_size:13570
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappa/wipe_build job_size:15113
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.44/var_summary job_size:15388
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.44
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.44/git_srcs job_size:15200
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.44/make_build_dir job_size:13928
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.44/config job_size:14777
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.44/build job_size:14074
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.44/test job_size:14904
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.44/add_write_perm job_size:14622
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.44/install job_size:14735
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.44/install_log job_size:18497
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.44/remove_write_perm job_size:14661
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.44/module_sync job_size:13622
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.44/wipe_build job_size:15186
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.53/var_summary job_size:15364
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.53/git_srcs job_size:15176
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.53/make_build_dir job_size:13904
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.53/config job_size:14753
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.53/build job_size:14050
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.53/test job_size:14880
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.53/add_write_perm job_size:14598
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.53/install job_size:14711
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.53/install_log job_size:18473
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.53/remove_write_perm job_size:14637
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.53/module_sync job_size:13598
+LOG:[12:56:00 13.4.2017] submitted: /odb/ecgb/gnu.53/wipe_build job_size:15162
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/gnu.53/var_summary job_size:15350
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/gnu.53/git_srcs job_size:15093
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/gnu.53/make_build_dir job_size:13873
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/gnu.53/config job_size:14730
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/gnu.53/build job_size:14035
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/gnu.53/test job_size:14865
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/gnu.53/add_write_perm job_size:14583
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/gnu.53/install job_size:14692
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/gnu.53/install_log job_size:18455
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/gnu.53/remove_write_perm job_size:14622
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/gnu.53/module_sync job_size:13586
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/gnu.53/wipe_build job_size:15142
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/intel.16/var_summary job_size:15410
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/intel.16
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/intel.16/git_srcs job_size:15183
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/intel.16/make_build_dir job_size:13937
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/intel.16/config job_size:14790
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/intel.16/build job_size:14091
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/intel.16/test job_size:14921
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/intel.16/add_write_perm job_size:14639
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/intel.16/install job_size:14750
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/intel.16/install_log job_size:18517
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/intel.16/remove_write_perm job_size:14678
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/intel.16/module_sync job_size:13640
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/intel.16/wipe_build job_size:15202
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/pgi.16/var_summary job_size:15388
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/pgi.16
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/pgi.16/git_srcs job_size:15131
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/pgi.16/make_build_dir job_size:13911
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/pgi.16/config job_size:14768
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/pgi.16/build job_size:14073
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/pgi.16/test job_size:14903
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/pgi.16/add_write_perm job_size:14621
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/pgi.16/install job_size:14730
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/pgi.16/install_log job_size:18493
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/pgi.16/remove_write_perm job_size:14660
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/pgi.16/module_sync job_size:13624
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxg/pgi.16/wipe_build job_size:15180
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.48/var_summary job_size:15428
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.48
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.48/git_srcs job_size:15273
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.48/make_build_dir job_size:13962
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.48/config job_size:14805
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.48/build job_size:14096
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.48/test job_size:14926
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.48/add_write_perm job_size:14644
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.48/install job_size:14760
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.48/install_log job_size:18540
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.48/remove_write_perm job_size:14683
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.48/module_sync job_size:13648
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.48/wipe_build job_size:15218
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.53/var_summary job_size:15452
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.53/git_srcs job_size:15297
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.53/make_build_dir job_size:13986
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.53/config job_size:14829
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.53/build job_size:14120
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.53/test job_size:14950
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.53/add_write_perm job_size:14668
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.53/install job_size:14784
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.53/install_log job_size:18564
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.53/remove_write_perm job_size:14707
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.53/module_sync job_size:13672
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.53/wipe_build job_size:15242
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.61/var_summary job_size:15452
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.61
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.61/git_srcs job_size:15297
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.61/make_build_dir job_size:13986
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.61/config job_size:14829
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.61/build job_size:14120
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.61/test job_size:14950
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.61/add_write_perm job_size:14668
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.61/install job_size:14784
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.61/install_log job_size:18564
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.61/remove_write_perm job_size:14707
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.61/module_sync job_size:13672
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/gnu.61/wipe_build job_size:15242
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/pgi/var_summary job_size:15436
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/pgi
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/pgi/git_srcs job_size:15236
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/pgi/make_build_dir job_size:13964
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/pgi/config job_size:14813
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/pgi/build job_size:14110
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/pgi/test job_size:14940
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/pgi/add_write_perm job_size:14658
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/pgi/install job_size:14771
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/pgi/install_log job_size:18545
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/pgi/remove_write_perm job_size:14697
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/pgi/module_sync job_size:13665
+LOG:[12:56:00 13.4.2017] submitted: /odb/opensuse131/pgi/wipe_build job_size:15226
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.49/var_summary job_size:15351
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.49
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.49/git_srcs job_size:15094
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.49/make_build_dir job_size:13874
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.49/config job_size:14731
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.49/build job_size:14036
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.49/test job_size:14866
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.49/add_write_perm job_size:14584
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.49/install job_size:14693
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.49/install_log job_size:18456
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.49/remove_write_perm job_size:14623
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.49/module_sync job_size:13587
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.49/wipe_build job_size:15143
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.53/var_summary job_size:15375
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.53/git_srcs job_size:15118
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.53/make_build_dir job_size:13898
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.53/config job_size:14755
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.53/build job_size:14060
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.53/test job_size:14890
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.53/add_write_perm job_size:14608
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.53/install job_size:14717
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.53/install_log job_size:18480
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.53/remove_write_perm job_size:14647
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.53/module_sync job_size:13611
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/gnu.53/wipe_build job_size:15167
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/pgi/var_summary job_size:15359
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/pgi
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/pgi/git_srcs job_size:15057
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/pgi/make_build_dir job_size:13876
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/pgi/config job_size:14739
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/pgi/build job_size:14050
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/pgi/test job_size:14880
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/pgi/add_write_perm job_size:14598
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/pgi/install job_size:14704
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/pgi/install_log job_size:18461
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/pgi/remove_write_perm job_size:14637
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/pgi/module_sync job_size:13604
+LOG:[12:56:00 13.4.2017] submitted: /odb/lxc/pgi/wipe_build job_size:15151
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.53/var_summary job_size:15378
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.53/git_srcs job_size:15148
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.53/make_build_dir job_size:13902
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.53/config job_size:14755
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.53/build job_size:14056
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.53/test job_size:14886
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.53/add_write_perm job_size:14604
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.53/install job_size:14715
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.53/install_log job_size:18485
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.53/remove_write_perm job_size:14643
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.53/module_sync job_size:13608
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.53/wipe_build job_size:15168
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.61/var_summary job_size:15402
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.61
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.61/git_srcs job_size:15172
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.61/make_build_dir job_size:13926
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.61/config job_size:14779
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.61/build job_size:14080
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.61/test job_size:14910
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.61/add_write_perm job_size:14628
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.61/install job_size:14739
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.61/install_log job_size:18509
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.61/remove_write_perm job_size:14667
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.61/module_sync job_size:13632
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/gnu.61/wipe_build job_size:15192
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/pgi/var_summary job_size:15386
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/pgi
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/pgi/git_srcs job_size:15111
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/pgi/make_build_dir job_size:13904
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/pgi/config job_size:14763
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/pgi/build job_size:14070
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/pgi/test job_size:14900
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/pgi/add_write_perm job_size:14618
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/pgi/install job_size:14726
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/pgi/install_log job_size:18490
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/pgi/remove_write_perm job_size:14657
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/pgi/module_sync job_size:13625
+LOG:[12:56:00 13.4.2017] submitted: /odb/leap42/pgi/wipe_build job_size:15176
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappb/var_summary job_size:15317
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappb
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappb/git_srcs job_size:14985
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappb/make_build_dir job_size:13830
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappb/config job_size:14656
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappb/build job_size:14012
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappb/test job_size:14842
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappb/add_write_perm job_size:14519
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappb/install job_size:14623
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappb/install_log job_size:17966
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappb/remove_write_perm job_size:14558
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappb/module_sync job_size:13570
+LOG:[12:56:00 13.4.2017] submitted: /odb/sappb/wipe_build job_size:15113
+WAR:[12:56:00 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.49/var_summary job_size:35830
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.49
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.49/git_srcs job_size:35733
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.49/make_build_dir job_size:34476
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.49/config job_size:35178
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.49/build job_size:34388
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.49/test job_size:35196
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.49/add_write_perm job_size:35106
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.49/install job_size:35074
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.49/install_log job_size:38640
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.49/remove_write_perm job_size:35211
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.49/module_sync job_size:34058
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.49/wipe_build job_size:35626
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.53/var_summary job_size:35830
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.53/git_srcs job_size:35733
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.53/make_build_dir job_size:34476
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.53/config job_size:35178
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.53/build job_size:34388
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.53/test job_size:35196
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.53/add_write_perm job_size:35106
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.53/install job_size:35074
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.53/install_log job_size:38640
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.53/remove_write_perm job_size:35211
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.53/module_sync job_size:34058
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/gnu.53/wipe_build job_size:35626
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.14/var_summary job_size:35895
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.14
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.14/git_srcs job_size:35828
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.14/make_build_dir job_size:34545
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.14/config job_size:35296
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.14/build job_size:34449
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.14/test job_size:35257
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.14/add_write_perm job_size:35167
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.14/install job_size:35137
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.14/install_log job_size:38707
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.14/remove_write_perm job_size:35272
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.14/module_sync job_size:34117
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.14/wipe_build job_size:35691
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.15/var_summary job_size:35895
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.15
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.15/git_srcs job_size:35828
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.15/make_build_dir job_size:34545
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.15/config job_size:35272
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.15/build job_size:34449
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.15/test job_size:35257
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.15/add_write_perm job_size:35167
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.15/install job_size:35137
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.15/install_log job_size:38707
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.15/remove_write_perm job_size:35272
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.15/module_sync job_size:34117
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.15/wipe_build job_size:35691
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.16/var_summary job_size:35871
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.16
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.16/git_srcs job_size:35804
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.16/make_build_dir job_size:34521
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.16/config job_size:35248
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.16/build job_size:34425
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.16/test job_size:35233
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.16/add_write_perm job_size:35143
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.16/install job_size:35113
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.16/install_log job_size:38683
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.16/remove_write_perm job_size:35248
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.16/module_sync job_size:34093
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/intel.16/wipe_build job_size:35667
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.84/var_summary job_size:35797
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.84
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.84/git_srcs job_size:35715
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.84/make_build_dir job_size:34445
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.84/config job_size:35173
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.84/build job_size:34353
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.84/test job_size:35161
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.84/add_write_perm job_size:35071
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.84/install job_size:35040
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.84/install_log job_size:38608
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.84/remove_write_perm job_size:35176
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.84/module_sync job_size:34022
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.84/wipe_build job_size:35593
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.846/var_summary job_size:35825
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.846
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.846/git_srcs job_size:35758
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.846/make_build_dir job_size:34475
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.846/config job_size:35201
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.846/build job_size:34379
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.846/test job_size:35187
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.846/add_write_perm job_size:35097
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.846/install job_size:35067
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.846/install_log job_size:38637
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.846/remove_write_perm job_size:35202
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.846/module_sync job_size:34047
+LOG:[12:56:00 13.4.2017] submitted: /odb/cca/cray.846/wipe_build job_size:35621
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.49/var_summary job_size:35830
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.49
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.49/git_srcs job_size:35733
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.49/make_build_dir job_size:34476
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.49/config job_size:35178
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.49/build job_size:34388
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.49/test job_size:35196
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.49/add_write_perm job_size:35106
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.49/install job_size:35074
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.49/install_log job_size:38640
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.49/remove_write_perm job_size:35211
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.49/module_sync job_size:34058
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.49/wipe_build job_size:35626
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.53/var_summary job_size:35830
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.53
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.53/git_srcs job_size:35733
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.53/make_build_dir job_size:34476
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.53/config job_size:35178
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.53/build job_size:34388
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.53/test job_size:35196
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.53/add_write_perm job_size:35106
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.53/install job_size:35074
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.53/install_log job_size:38640
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.53/remove_write_perm job_size:35211
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.53/module_sync job_size:34058
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/gnu.53/wipe_build job_size:35626
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.14/var_summary job_size:35895
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.14
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.14/git_srcs job_size:35828
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.14/make_build_dir job_size:34545
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.14/config job_size:35296
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.14/build job_size:34449
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.14/test job_size:35257
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.14/add_write_perm job_size:35167
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.14/install job_size:35137
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.14/install_log job_size:38707
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.14/remove_write_perm job_size:35272
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.14/module_sync job_size:34117
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.14/wipe_build job_size:35691
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.15/var_summary job_size:35895
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.15
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.15/git_srcs job_size:35828
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.15/make_build_dir job_size:34545
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.15/config job_size:35272
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.15/build job_size:34449
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.15/test job_size:35257
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.15/add_write_perm job_size:35167
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.15/install job_size:35137
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.15/install_log job_size:38707
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.15/remove_write_perm job_size:35272
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.15/module_sync job_size:34117
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.15/wipe_build job_size:35691
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.16/var_summary job_size:35871
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.16
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.16/git_srcs job_size:35804
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.16/make_build_dir job_size:34521
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.16/config job_size:35248
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.16/build job_size:34425
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.16/test job_size:35233
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.16/add_write_perm job_size:35143
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.16/install job_size:35113
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.16/install_log job_size:38683
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.16/remove_write_perm job_size:35248
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.16/module_sync job_size:34093
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/intel.16/wipe_build job_size:35667
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.84/var_summary job_size:35797
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.84
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.84/git_srcs job_size:35715
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.84/make_build_dir job_size:34445
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.84/config job_size:35173
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.84/build job_size:34353
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.84/test job_size:35161
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.84/add_write_perm job_size:35071
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.84/install job_size:35040
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.84/install_log job_size:38608
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.84/remove_write_perm job_size:35176
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.84/module_sync job_size:34022
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.84/wipe_build job_size:35593
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.846/var_summary job_size:35825
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.846
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.846/git_srcs job_size:35758
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.846/make_build_dir job_size:34475
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.846/config job_size:35201
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.846/build job_size:34379
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.846/test job_size:35187
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.846/add_write_perm job_size:35097
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.846/install job_size:35067
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.846/install_log job_size:38637
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.846/remove_write_perm job_size:35202
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.846/module_sync job_size:34047
+LOG:[12:56:00 13.4.2017] submitted: /odb/ccb/cray.846/wipe_build job_size:35621
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/regenerate job_size:15755
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/var_summary job_size:15787
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/git_srcs job_size:16038
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/make_build_dir job_size:14325
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/config job_size:15273
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/build job_size:14403
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/install job_size:15069
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/tests/archive job_size:15769
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/tests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/tests/bad_archive job_size:16438
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/tests/environment job_size:16373
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/itests/xperm/0 job_size:16189
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/itests/xperm
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/itests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/itests/xperm/1 job_size:16189
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/itests/xperm/10 job_size:16197
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/install_log job_size:18495
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/remove_write_perm job_size:14979
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxop_dev/wipe_build job_size:15553
+WAR:[12:56:00 13.4.2017] EcfFile::doCreateJobFile: Too many files open(errno=EMFILE), include file cache size(44) Clearing cache. Check limits with ulimit -Sn
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/var_summary job_size:36580
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/git_srcs job_size:36808
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/make_build_dir job_size:35201
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/config job_size:36021
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/build job_size:35073
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/install job_size:35785
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/tests/archive job_size:36587
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/tests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/tests/bad_archive job_size:37344
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/tests/environment job_size:37279
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/itests/xperm/0 job_size:36994
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/itests/xperm
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/itests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/itests/xperm/1 job_size:36994
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/itests/xperm/10 job_size:37024
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/install_log job_size:39290
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/remove_write_perm job_size:35913
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cck/wipe_build job_size:36346
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/var_summary job_size:36658
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/git_srcs job_size:36886
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/make_build_dir job_size:35279
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/config job_size:36114
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/build job_size:35151
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/install job_size:35863
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/tests/archive job_size:36665
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/tests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/tests/bad_archive job_size:37422
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/tests/environment job_size:37357
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/itests/xperm/0 job_size:37072
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/itests/xperm
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/itests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/itests/xperm/1 job_size:37072
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/itests/xperm/10 job_size:37102
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/install_log job_size:39368
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/remove_write_perm job_size:35991
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cct/wipe_build job_size:36424
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/var_summary job_size:15718
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/git_srcs job_size:15855
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/make_build_dir job_size:14233
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/config job_size:15163
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/build job_size:14339
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/install job_size:14998
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/tests/archive job_size:15705
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/tests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/tests/bad_archive job_size:16374
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/tests/environment job_size:16309
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/itests/xperm/0 job_size:16125
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/itests/xperm
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/itests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/itests/xperm/1 job_size:16125
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/itests/xperm/10 job_size:16133
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/install_log job_size:18419
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/remove_write_perm job_size:14915
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ecgb/wipe_build job_size:15470
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/var_summary job_size:15703
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/git_srcs job_size:15771
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/make_build_dir job_size:14201
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/config job_size:15135
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/build job_size:14323
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/install job_size:14978
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/tests/archive job_size:15689
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/tests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/tests/bad_archive job_size:16358
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/tests/environment job_size:16293
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/itests/xperm/0 job_size:16109
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/itests/xperm
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/itests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/itests/xperm/1 job_size:16109
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/itests/xperm/10 job_size:16117
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/install_log job_size:18400
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/remove_write_perm job_size:14899
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxg/wipe_build job_size:15449
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/var_summary job_size:15789
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/git_srcs job_size:15959
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/make_build_dir job_size:14298
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/config job_size:15225
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/build job_size:14392
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/install job_size:15054
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/tests/archive job_size:15758
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/tests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/tests/bad_archive job_size:16427
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/tests/environment job_size:16362
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/itests/xperm/0 job_size:16178
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/itests/xperm
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/itests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/itests/xperm/1 job_size:16178
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/itests/xperm/10 job_size:16186
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/install_log job_size:18493
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/remove_write_perm job_size:14968
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/opensuse131/wipe_build job_size:15533
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/var_summary job_size:15724
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/git_srcs job_size:15792
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/make_build_dir job_size:14222
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/config job_size:15226
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/build job_size:14344
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/install job_size:14999
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/tests/archive job_size:15710
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/tests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/tests/bad_archive job_size:16379
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/tests/environment job_size:16314
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/itests/xperm/0 job_size:16130
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/itests/xperm
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/itests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/itests/xperm/1 job_size:16130
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/itests/xperm/10 job_size:16138
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/install_log job_size:18421
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/remove_write_perm job_size:14920
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/lxc/wipe_build job_size:15470
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/var_summary job_size:15734
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/git_srcs job_size:15829
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/make_build_dir job_size:14233
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/config job_size:15165
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/build job_size:14347
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/install job_size:15004
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/tests/archive job_size:15713
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/tests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/tests/bad_archive job_size:16382
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/tests/environment job_size:16317
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/itests/xperm/0 job_size:16133
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/itests/xperm
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/itests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/itests/xperm/1 job_size:16133
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/itests/xperm/10 job_size:16141
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/install_log job_size:18433
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/remove_write_perm job_size:14923
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/leap42/wipe_build job_size:15478
+WAR:[12:56:00 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/var_summary job_size:36658
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/git_srcs job_size:36886
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/make_build_dir job_size:35279
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/config job_size:36114
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/build job_size:35151
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/install job_size:35863
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/tests/archive job_size:36665
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/tests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/tests/bad_archive job_size:37422
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/tests/environment job_size:37357
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/itests/xperm/0 job_size:37072
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/itests/xperm
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/itests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/itests/xperm/1 job_size:37072
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/itests/xperm/10 job_size:37102
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/install_log job_size:39368
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/remove_write_perm job_size:35991
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/cca/wipe_build job_size:36424
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/var_summary job_size:36658
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/git_srcs job_size:36886
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/make_build_dir job_size:35279
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/config job_size:36114
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/build job_size:35151
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/install job_size:35863
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/tests/archive job_size:36665
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/tests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/tests/bad_archive job_size:37422
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/tests/environment job_size:37357
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/itests/xperm/0 job_size:37072
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/itests/xperm
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/itests
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/itests/xperm/1 job_size:37072
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/itests/xperm/10 job_size:37102
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/install_log job_size:39368
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/remove_write_perm job_size:35991
+LOG:[12:56:00 13.4.2017] submitted: /mars_client_develop/ccb/wipe_build job_size:36424
diff --git a/Base/test/TestLimit.cpp b/Base/test/TestLimit.cpp
index 4a80f99..36b4d32 100644
--- a/Base/test/TestLimit.cpp
+++ b/Base/test/TestLimit.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #32 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/TestLogCmd.cpp b/Base/test/TestLogCmd.cpp
index b9e143e..7167f64 100644
--- a/Base/test/TestLogCmd.cpp
+++ b/Base/test/TestLogCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/TestMeterCmd.cpp b/Base/test/TestMeterCmd.cpp
index 534dd07..e5c5d58 100644
--- a/Base/test/TestMeterCmd.cpp
+++ b/Base/test/TestMeterCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/TestProgramOptions.cpp b/Base/test/TestProgramOptions.cpp
index 91aa99c..f556627 100644
--- a/Base/test/TestProgramOptions.cpp
+++ b/Base/test/TestProgramOptions.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/TestRequest.cpp b/Base/test/TestRequest.cpp
index b28cf8d..3a77633 100644
--- a/Base/test/TestRequest.cpp
+++ b/Base/test/TestRequest.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #128 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/TestRequeueNodeCmd.cpp b/Base/test/TestRequeueNodeCmd.cpp
index e8540cc..fbb4558 100644
--- a/Base/test/TestRequeueNodeCmd.cpp
+++ b/Base/test/TestRequeueNodeCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #22 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/TestResolveDependencies.cpp b/Base/test/TestResolveDependencies.cpp
index f42fb9e..db4d070 100644
--- a/Base/test/TestResolveDependencies.cpp
+++ b/Base/test/TestResolveDependencies.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #37 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/TestSSyncCmd.cpp b/Base/test/TestSSyncCmd.cpp
index 6f8ebfe..b92157e 100644
--- a/Base/test/TestSSyncCmd.cpp
+++ b/Base/test/TestSSyncCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #40 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/TestSSyncCmdOrder.cpp b/Base/test/TestSSyncCmdOrder.cpp
index 8e5290e..18a1dbe 100644
--- a/Base/test/TestSSyncCmdOrder.cpp
+++ b/Base/test/TestSSyncCmdOrder.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Base/test/TestSSyncCmd_CH1.cpp b/Base/test/TestSSyncCmd_CH1.cpp
index 7bb7332..2e88fb5 100644
--- a/Base/test/TestSSyncCmd_CH1.cpp
+++ b/Base/test/TestSSyncCmd_CH1.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #18 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -135,6 +135,7 @@ void test_sync_scaffold( defs_change_cmd the_defs_change_command, const std::str
the_client_defs = server_defs->client_suite_mgr().create_defs(client_handle,server_defs);
Ecf::set_debug_equality(true);
BOOST_CHECK_MESSAGE( server_defs->server().compare(the_client_defs->server() ), test_name << ": Server state does not match");
+ BOOST_CHECK_MESSAGE( server_defs->get_flag() == the_client_defs->get_flag(), test_name << ": Server flags do not match");
Ecf::set_debug_equality(false);
}
@@ -187,6 +188,12 @@ static bool set_server_state_running(defs_ptr defs) {
return true; // expect changes
}
+static bool set_defs_flag(defs_ptr defs) {
+ defs->flag().set( ecf::Flag::BYRULE );
+ defs->flag().set( ecf::Flag::EDIT_FAILED );
+ return true; // expect changes
+}
+
static bool change_suites_s3_outside_of_handle(defs_ptr defs)
{
/// Make a state change to suites s3, in the server. This is *not* in the client handle
@@ -552,6 +559,7 @@ BOOST_AUTO_TEST_CASE( test_ssync_using_handle )
// The default server state is HALTED, hence setting to halted will not show a change
test_sync_scaffold(set_server_state_shutdown,"set_server_state_shutdown");
test_sync_scaffold(set_server_state_running,"set_server_state_running");
+ test_sync_scaffold(set_defs_flag,"set_defs_flag");
test_sync_scaffold(add_server_variable,"add_server_variable");
test_sync_scaffold(change_server_variable,"change_server_variable");
diff --git a/CMakeLists.txt b/CMakeLists.txt
index bb24556..99bc91b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -117,10 +117,10 @@ if(ENABLE_UI_BACKTRACE AND (NOT ENABLE_UI))
set(ENABLE_UI_BACKTRACE OFF)
endif()
-# sanity check - cannot set UI_BACKTRACE_EMAIL_ADDRESSES if UI and ENABLE_UI_BACKTRACE are OFF
-if(UI_BACKTRACE_EMAIL_ADDRESSES AND (NOT ENABLE_UI))
- ecbuild_warn("Cannot set UI_BACKTRACE_EMAIL_ADDRESSES if UI is not enabled")
- set(UI_BACKTRACE_EMAIL_ADDRESSES)
+# sanity check - cannot set UI_BACKTRACE_EMAIL_ADDRESS_FILE if UI and ENABLE_UI_BACKTRACE are OFF
+if(UI_BACKTRACE_EMAIL_ADDRESS_FILE AND (NOT ENABLE_UI))
+ ecbuild_warn("Cannot set UI_BACKTRACE_EMAIL_ADDRESS_FILE if UI is not enabled")
+ set(UI_BACKTRACE_EMAIL_ADDRESS_FILE)
endif()
# sanity check - cannot set UI_LOG_FILE if ENABLE_UI_USAGE_LOG is OFF
@@ -152,8 +152,8 @@ ecbuild_info( "ENABLE_SECURE_USER : ${ENABLE_SECURE_USER}" )
if (ENABLE_UI)
ecbuild_info( "ENABLE_UI_BACKTRACE : ${ENABLE_UI_BACKTRACE}" )
- if(UI_BACKTRACE_EMAIL_ADDRESSES)
- ecbuild_info( "UI_BACKTRACE_EMAIL_ADDRESSES : ${UI_BACKTRACE_EMAIL_ADDRESSES}" )
+ if(UI_BACKTRACE_EMAIL_ADDRESS_FILE)
+ ecbuild_info( "UI_BACKTRACE_EMAIL_ADDRESS_FILE : ${UI_BACKTRACE_EMAIL_ADDRESS_FILE}" )
endif()
ecbuild_info( "ENABLE_UI_USAGE_LOG : ${ENABLE_UI_USAGE_LOG}" )
@@ -309,7 +309,7 @@ endif()
# =========================================================================================
ecbuild_dont_pack( DIRS
- ACore/doc ANattr/doc ANode/doc Client/doc Pyext/doc Server/doc
+ ACore/doc ANattr/doc ANode/doc Client/doc CSim/doc Pyext/doc Server/doc
ecbuild
SCRATCH
CUSTOMER
diff --git a/CSim/jamfile.jam b/CSim/jamfile.jam
index 27e40ca..c10ab61 100644
--- a/CSim/jamfile.jam
+++ b/CSim/jamfile.jam
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/CSim/src/Analyser.cpp b/CSim/src/Analyser.cpp
index 244a565..7229ffe 100644
--- a/CSim/src/Analyser.cpp
+++ b/CSim/src/Analyser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/CSim/src/Analyser.hpp b/CSim/src/Analyser.hpp
index 4f4d02c..366989d 100644
--- a/CSim/src/Analyser.hpp
+++ b/CSim/src/Analyser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/CSim/src/AstAnalyserVisitor.cpp b/CSim/src/AstAnalyserVisitor.cpp
index 76e56da..28d6a54 100644
--- a/CSim/src/AstAnalyserVisitor.cpp
+++ b/CSim/src/AstAnalyserVisitor.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -55,4 +55,8 @@ void AstAnalyserVisitor::visitNode(AstNode* astNode)
void AstAnalyserVisitor::visitVariable(AstVariable* astVar){}
+void AstAnalyserVisitor::visitFlag(AstFlag* astVar)
+{
+}
+
}
diff --git a/CSim/src/AstAnalyserVisitor.hpp b/CSim/src/AstAnalyserVisitor.hpp
index a50c339..f16def0 100644
--- a/CSim/src/AstAnalyserVisitor.hpp
+++ b/CSim/src/AstAnalyserVisitor.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -54,7 +54,8 @@ public:
virtual void visitNodeState(AstNodeState*);
virtual void visitEventState(AstEventState*);
virtual void visitNode(AstNode*);
- virtual void visitVariable(AstVariable*);
+ virtual void visitVariable(AstVariable*);
+ virtual void visitFlag(AstFlag*);
private:
std::set<Node*> dependentNodes_;
diff --git a/CSim/src/DefsAnalyserVisitor.cpp b/CSim/src/DefsAnalyserVisitor.cpp
index 3399cb8..5e2a347 100644
--- a/CSim/src/DefsAnalyserVisitor.cpp
+++ b/CSim/src/DefsAnalyserVisitor.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/CSim/src/DefsAnalyserVisitor.hpp b/CSim/src/DefsAnalyserVisitor.hpp
index dad1c5c..b4db0a5 100644
--- a/CSim/src/DefsAnalyserVisitor.hpp
+++ b/CSim/src/DefsAnalyserVisitor.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/CSim/src/FlatAnalyserVisitor.cpp b/CSim/src/FlatAnalyserVisitor.cpp
index c366f5c..bf2b390 100644
--- a/CSim/src/FlatAnalyserVisitor.cpp
+++ b/CSim/src/FlatAnalyserVisitor.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/CSim/src/FlatAnalyserVisitor.hpp b/CSim/src/FlatAnalyserVisitor.hpp
index f35a935..72f8545 100644
--- a/CSim/src/FlatAnalyserVisitor.hpp
+++ b/CSim/src/FlatAnalyserVisitor.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/CSim/src/Simulator.cpp b/CSim/src/Simulator.cpp
index 5e7384f..411a0fe 100644
--- a/CSim/src/Simulator.cpp
+++ b/CSim/src/Simulator.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -34,6 +34,7 @@
#include "Jobs.hpp"
#include "CalendarUpdateParams.hpp"
#include "CmdContext.hpp"
+#include "Str.hpp"
using namespace boost::gregorian;
using namespace boost::posix_time;
@@ -258,8 +259,6 @@ bool Simulator::doJobSubmission(Defs& theDefs, std::string& errorMsg) const
}
#endif
- // any state change should be followed with a job submission
- t->complete(); // mark task as complete
#ifdef DEBUG_LONG_RUNNING_SUITES
@@ -267,9 +266,19 @@ bool Simulator::doJobSubmission(Defs& theDefs, std::string& errorMsg) const
#endif
// If the task has any event used in the trigger expressions, then update event.
+ std::string msg;
BOOST_FOREACH(Event& event, t->ref_events()) {
if (event.usedInTrigger()) { // event used in trigger/complete expression
event.set_value(true);
+
+ msg.clear();
+ msg += Str::CHILD_CMD();
+ msg += "event ";
+ msg += event.name_or_number();
+ msg += " ";
+ msg += t->absNodePath();
+ log(Log::MSG,msg);
+
if (!doJobSubmission(theDefs,errorMsg)) {
level_--;
return false;
@@ -286,6 +295,15 @@ bool Simulator::doJobSubmission(Defs& theDefs, std::string& errorMsg) const
if (meter.usedInTrigger()) { // meter used in trigger/complete expression
while (meter.value() < meter.max()) {
meter.set_value(meter.value()+1);
+
+ msg.clear();
+ msg += Str::CHILD_CMD();
+ msg += "meter ";
+ msg += meter.name();
+ msg += " ";
+ msg += t->absNodePath();
+ log(Log::MSG,msg);
+
if (!doJobSubmission(theDefs,errorMsg)) {
level_--;
return false;
@@ -297,6 +315,9 @@ bool Simulator::doJobSubmission(Defs& theDefs, std::string& errorMsg) const
meter.set_value(meter.max());
}
}
+
+ // any state change should be followed with a job submission
+ t->complete(); // mark task as complete
}
level_--;
diff --git a/CSim/src/Simulator.hpp b/CSim/src/Simulator.hpp
index 78cba5c..23b1816 100644
--- a/CSim/src/Simulator.hpp
+++ b/CSim/src/Simulator.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/CSim/src/SimulatorVisitor.cpp b/CSim/src/SimulatorVisitor.cpp
index e4191c8..def4a72 100644
--- a/CSim/src/SimulatorVisitor.cpp
+++ b/CSim/src/SimulatorVisitor.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -14,6 +14,8 @@
//============================================================================
#include <iostream>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
#include "SimulatorVisitor.hpp"
#include "Defs.hpp"
#include "Suite.hpp"
@@ -28,11 +30,20 @@ using namespace boost::posix_time;
namespace ecf {
+// Please note: we can speed up simulation, by using a calendar increment of 1 hour
+// However this will *ONLY* work *IF*
+// o All the time based attributes time,today,cron have no minutes, i.e only i hour resolution
+// o The calendar start time, must also have hour resolution, otherwise time/cron based attributes
+// will be missed. i.e we increment calendar start time , with calendar increment
+// If calendar start time is minutes based, and increment in hour based, time attributes will be missed
+// Note: today is different, to time/cron, as it does not require a exact match
+
///////////////////////////////////////////////////////////////////////////////
SimulatorVisitor::SimulatorVisitor(const std::string& defs_filename)
: defs_filename_(defs_filename),
foundTasks_(false),
foundCrons_(false),
+ foundTime_(false),
hasTimeDependencies_(false),
has_end_clock_(false),
max_length_(hours(24)),
@@ -56,7 +67,7 @@ void SimulatorVisitor::visitSuite( Suite* s)
if ( s->clockAttr() && s->clock_end_attr()) {
max_length_ = s->clock_end_attr()->ptime() - s->clockAttr()->ptime();
- has_end_clock_ = true; // no need to determine max_length, user specfied
+ has_end_clock_ = true; // no need to determine max_length, user specified
}
visitNodeContainer(s);
@@ -69,6 +80,19 @@ void SimulatorVisitor::visitSuite( Suite* s)
std::stringstream ss; ss << "The defs file " << defs_filename_ << " has a suite '/" << s->suite()->name() << "' which has no tasks. Ignoring \n";
log(Log::WAR,ss.str());
}
+
+ // If we have cron/time with calendar increment of 1 hour, where calendar start time is in minutes
+ // we will miss the time/cron based attributes, hence use 1 minute resolution
+ if ((foundCrons_ || foundTime_) && ci_ == hours(1)) {
+ // simulation has not started so, suiteTime same as start time.
+ boost::posix_time::time_duration start_time = s->calendar().suiteTime().time_of_day();
+ if (start_time.minutes() != 0) {
+ // cout << " start_time " << start_time << " " << defs_filename_ << "\n";
+ log(Log::WAR,"Found cron or time based attributes, with 1 hour resolution, however suite calendar start time has minute resolution, reverting to minute resolution for simulation.");
+ log(Log::WAR,"To speed up resolution use suite calendar with hour setting only, i.e where minutes is zero");
+ ci_ = minutes(1);
+ }
+ }
}
void SimulatorVisitor::visitFamily( Family* f) { visitNodeContainer(f);}
@@ -84,6 +108,10 @@ void SimulatorVisitor::visitNodeContainer(NodeContainer* nc)
log(Log::MSG,ss.str());
}
+ if (!nc->timeVec().empty()) {
+ foundTime_= true;
+ }
+
BOOST_FOREACH(node_ptr t, nc->nodeVec()) { t->acceptVisitTraversor(*this);}
}
@@ -97,6 +125,9 @@ void SimulatorVisitor::visitTask( Task* t )
if (!t->crons().empty()) {
foundCrons_ = true;
}
+ if (!t->timeVec().empty()) {
+ foundTime_= true;
+ }
}
}
diff --git a/CSim/src/SimulatorVisitor.hpp b/CSim/src/SimulatorVisitor.hpp
index 4b07cde..0eaf295 100644
--- a/CSim/src/SimulatorVisitor.hpp
+++ b/CSim/src/SimulatorVisitor.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -64,6 +64,7 @@ private:
std::string error_msg_;
bool foundTasks_;
bool foundCrons_;
+ bool foundTime_;
bool hasTimeDependencies_;
bool has_end_clock_;
boost::posix_time::time_duration max_length_;
diff --git a/CSim/test/TestAnalysis.cpp b/CSim/test/TestAnalysis.cpp
index 48f9a31..fb430cd 100644
--- a/CSim/test/TestAnalysis.cpp
+++ b/CSim/test/TestAnalysis.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/CSim/test/TestAutoCancel.cpp b/CSim/test/TestAutoCancel.cpp
index 3452273..5b5a448 100644
--- a/CSim/test/TestAutoCancel.cpp
+++ b/CSim/test/TestAutoCancel.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/CSim/test/TestMeter.cpp b/CSim/test/TestMeter.cpp
index 01a004f..586ade0 100644
--- a/CSim/test/TestMeter.cpp
+++ b/CSim/test/TestMeter.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/CSim/test/TestRepeat.cpp b/CSim/test/TestRepeat.cpp
index f6a571f..dbc2599 100644
--- a/CSim/test/TestRepeat.cpp
+++ b/CSim/test/TestRepeat.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -355,7 +355,7 @@ BOOST_AUTO_TEST_CASE( test_repeat_with_cron )
task_ptr task_finish = family_plot->add_task("finish");
task_finish->add_trigger( "1 == 0");
task_finish->add_complete( "checkdata:done or checkdata == complete" );
- task_finish->addVerify( VerifyAttr(NState::COMPLETE,8) );
+ task_finish->addVerify( VerifyAttr(NState::COMPLETE,4) );
task_ptr task_checkdata = family_plot->add_task("checkdata");
task_checkdata->addEvent( Event(1,"done"));
diff --git a/CSim/test/TestSimulator.cpp b/CSim/test/TestSimulator.cpp
index 77e6a2c..ca6b967 100644
--- a/CSim/test/TestSimulator.cpp
+++ b/CSim/test/TestSimulator.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/CSim/test/TestSingleSimulator.cpp b/CSim/test/TestSingleSimulator.cpp
index eb56d39..0523731 100644
--- a/CSim/test/TestSingleSimulator.cpp
+++ b/CSim/test/TestSingleSimulator.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/CSim/test/TestTime.cpp b/CSim/test/TestTime.cpp
index d682ebf..b64d62b 100644
--- a/CSim/test/TestTime.cpp
+++ b/CSim/test/TestTime.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/CSim/test/TestToday.cpp b/CSim/test/TestToday.cpp
index 9047147..4a1d591 100644
--- a/CSim/test/TestToday.cpp
+++ b/CSim/test/TestToday.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -20,6 +20,7 @@
#include "Family.hpp"
#include "Task.hpp"
#include "TestUtil.hpp"
+#include "PrintStyle.hpp"
#include <boost/test/unit_test.hpp>
#include "boost/filesystem/operations.hpp"
@@ -139,10 +140,12 @@ BOOST_AUTO_TEST_CASE( test_today_time_and_date )
//endsuite
Defs theDefs;
{
+ // To speed up simulation: start calendar with hour increment AND time attributes with hours only
+ //
// Task will only run if all time dependencies are satisfied
- boost::posix_time::ptime theLocalTime = Calendar::second_clock_time();
+ boost::posix_time::ptime theLocalTime = ptime(date(2010,2,10),hours(15)); ;
boost::gregorian::date todaysDate = theLocalTime.date();
- boost::posix_time::ptime time_plus_minute = theLocalTime + minutes(1);
+ boost::posix_time::ptime time_plus_hour = theLocalTime + hours(1);
suite_ptr suite = theDefs.add_suite( "test_today_time_and_date" );
ClockAttr clockAttr(theLocalTime,false/*false means use real clock*/);
@@ -151,8 +154,8 @@ BOOST_AUTO_TEST_CASE( test_today_time_and_date )
family_ptr fam = suite->add_family( "family" );
task_ptr task = fam->add_task( "t" );
task->addDate( DateAttr(todaysDate.day(),todaysDate.month(),todaysDate.year()) );
- task->addTime( ecf::TimeAttr( TimeSlot(time_plus_minute.time_of_day()) ) );
- task->addToday( ecf::TodayAttr( TimeSlot(time_plus_minute.time_of_day()) ) );
+ task->addTime( ecf::TimeAttr( TimeSlot(time_plus_hour.time_of_day()) ) );
+ task->addToday( ecf::TodayAttr( TimeSlot(time_plus_hour.time_of_day()) ) );
task->addVerify( VerifyAttr(NState::COMPLETE,1) );
// cout << theDefs << "\n";
@@ -162,6 +165,9 @@ BOOST_AUTO_TEST_CASE( test_today_time_and_date )
std::string errorMsg;
BOOST_CHECK_MESSAGE(simulator.run(theDefs,TestUtil::testDataLocation("test_today_time_and_date.def"),errorMsg),errorMsg);
+// PrintStyle::setStyle(PrintStyle::MIGRATE);
+// cout << theDefs;
+
// remove generated log file. Comment out to debug
std::string logFileName = TestUtil::testDataLocation("test_today_time_and_date.def") + ".log";
fs::remove(logFileName);
diff --git a/CSim/test/TestUtil.cpp b/CSim/test/TestUtil.cpp
index a6c22ef..507353f 100644
--- a/CSim/test/TestUtil.cpp
+++ b/CSim/test/TestUtil.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/CSim/test/TestUtil.hpp b/CSim/test/TestUtil.hpp
index a94793e..463cae9 100644
--- a/CSim/test/TestUtil.hpp
+++ b/CSim/test/TestUtil.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/CSim/test/data/good_defs/misc/defstatus.def b/CSim/test/data/good_defs/misc/defstatus.def
new file mode 100644
index 0000000..1770619
--- /dev/null
+++ b/CSim/test/data/good_defs/misc/defstatus.def
@@ -0,0 +1,14 @@
+suite test_repeat_defstatus
+ clock real 04.12.2016
+ defstatus complete # this should cause node state complete down the hierarchy
+ repeat integer VAR 0 1 1
+ edit SLEEPTIME 1
+ edit ECF_INCLUDE $ECF_HOME/includes
+ verify complete:1
+ family family
+ verify complete:1
+ repeat integer VAR 0 2 1
+ task t1
+ verify complete:1
+ endfamily
+endsuite
\ No newline at end of file
diff --git a/Client/Jamfile.jam b/Client/Jamfile.jam
index f8c98e4..d6dc810 100644
--- a/Client/Jamfile.jam
+++ b/Client/Jamfile.jam
@@ -1,141 +1,141 @@
-## Copyright 2009-2016 ECMWF.
-## This software is licensed under the terms of the Apache Licence version 2.0
-## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-## In applying this licence, ECMWF does not waive the privileges and immunities
-## granted to it by virtue of its status as an intergovernmental organisation
-## nor does it submit to any jurisdiction.
-
-#
-# Client
-#
-project theClient ;
-
-use-project theCore : ../ACore ;
-use-project theNodeAttr : ../ANattr ;
-use-project theNode : ../ANode ;
-use-project theParser : ../AParser ;
-use-project theBase : ../Base ;
-
-#
-# This should be in the site-config.jam file as a project wide requirement
-# however if this is done, it will not link since, lpthread appears twice
-# on the link line
-#
-lib pthread ;
-
-#
-# define DEBUG_CLIENT for additional debug
-#
-# Having a library avoid compile objects shared between client and test having
-# differing compilation properties
-#
-# Exclude ClientMain.cpp from the library.
-#
-# The <include> means we will automatically add this directory to the include path
-# of any other target that uses this lib
-#
-lib libclient : [ glob src/*.cpp : src/*Main.cpp ]
- : <include>../ACore/src
- <include>../ANattr/src
- <include>../ANode/src
- <include>../Base/src
- <include>../AParser/src
- <include>../Client/src
- <variant>debug:<define>DEBUG
- <link>static
- <use>/theCore//core
- <use>/theNode//node
- <use>/theParser//libparser
- <use>/theBase//base
- <use>/site-config//boost_system
- <use>/site-config//boost_serialization
- <use>/site-config//boost_filesystem
- <use>/site-config//boost_program_options
- <use>/site-config//boost_datetime
- :
- : <include>../Client/src
- ;
-
-#
-# client. This Just pulls in src/ClientMain.cpp
-#
-exe ecflow_client : [ glob src/*Main.cpp ]
- /theCore//core
- /theNodeAttr//nodeattr
- /theNode//node
- /theParser//libparser
- /theBase//base
- libclient
- /site-config//boost_system
+## Copyright 2009-2017 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
+
+#
+# Client
+#
+project theClient ;
+
+use-project theCore : ../ACore ;
+use-project theNodeAttr : ../ANattr ;
+use-project theNode : ../ANode ;
+use-project theParser : ../AParser ;
+use-project theBase : ../Base ;
+
+#
+# This should be in the site-config.jam file as a project wide requirement
+# however if this is done, it will not link since, lpthread appears twice
+# on the link line
+#
+lib pthread ;
+
+#
+# define DEBUG_CLIENT for additional debug
+#
+# Having a library avoid compile objects shared between client and test having
+# differing compilation properties
+#
+# Exclude ClientMain.cpp from the library.
+#
+# The <include> means we will automatically add this directory to the include path
+# of any other target that uses this lib
+#
+lib libclient : [ glob src/*.cpp : src/*Main.cpp ]
+ : <include>../ACore/src
+ <include>../ANattr/src
+ <include>../ANode/src
+ <include>../Base/src
+ <include>../AParser/src
+ <include>../Client/src
+ <variant>debug:<define>DEBUG
+ <link>static
+ <use>/theCore//core
+ <use>/theNode//node
+ <use>/theParser//libparser
+ <use>/theBase//base
+ <use>/site-config//boost_system
+ <use>/site-config//boost_serialization
+ <use>/site-config//boost_filesystem
+ <use>/site-config//boost_program_options
+ <use>/site-config//boost_datetime
+ :
+ : <include>../Client/src
+ ;
+
+#
+# client. This Just pulls in src/ClientMain.cpp
+#
+exe ecflow_client : [ glob src/*Main.cpp ]
+ /theCore//core
+ /theNodeAttr//nodeattr
+ /theNode//node
+ /theParser//libparser
+ /theBase//base
+ libclient
+ /site-config//boost_system
/site-config//boost_serialization
/site-config//boost_filesystem
- /site-config//boost_program_options
- /site-config//boost_datetime
- pthread
- : <variant>debug:<define>DEBUG
- [ conditional <ssl>on : <library>/ecflow_top//openssl_libs ]
- ;
-
-#
-# Tests for client. All test source code, by pulling in libclient we avoid
-# linking with ClientMain.cpp
-#
-exe s_client : [ glob test/*.cpp : test/TestSinglePerf.cpp test/TestMigration.cpp ]
- pthread
- /theCore//core
- /theNodeAttr//nodeattr
- /theNode//node
- /theParser//libparser
- /theBase//base
- libclient
- /site-config//boost_system
- /site-config//boost_serialization
- /site-config//boost_filesystem
- /site-config//boost_program_options
- /site-config//boost_datetime
- /site-config//boost_test
- : <include>../ANode/test
- <include>../Base/test
- <variant>debug:<define>DEBUG
- [ conditional <ssl>on : <library>/ecflow_top//openssl_libs ]
- ;
-
-exe perf_test_large_defs : [ glob test/TestSinglePerf.cpp ] [ glob test/SCPort.cpp ]
- /theCore//core
- /theNodeAttr//nodeattr
- /theNode//node
- /theParser//libparser
- /theBase//base
- libclient
- pthread
- /site-config//boost_system
- /site-config//boost_serialization
- /site-config//boost_filesystem
- /site-config//boost_program_options
- /site-config//boost_datetime
- /site-config//boost_test
- : <include>../ANode/test
- <include>../Base/test
- <variant>debug:<define>DEBUG
- [ conditional <ssl>on : <library>/ecflow_top//openssl_libs ]
- ;
-
-exe m_test_migration : [ glob test/TestMigration.cpp ] [ glob test/SCPort.cpp ]
- /theCore//core
- /theNodeAttr//nodeattr
- /theNode//node
- /theParser//libparser
- /theBase//base
- libclient
- pthread
- /site-config//boost_system
- /site-config//boost_serialization
- /site-config//boost_filesystem
- /site-config//boost_program_options
- /site-config//boost_datetime
- /site-config//boost_test
- : <include>../ANode/test
- <include>../Base/test
- <variant>debug:<define>DEBUG
- [ conditional <ssl>on : <library>/ecflow_top//openssl_libs ]
- ;
\ No newline at end of file
+ /site-config//boost_program_options
+ /site-config//boost_datetime
+ pthread
+ : <variant>debug:<define>DEBUG
+ [ conditional <ssl>on : <library>/ecflow_top//openssl_libs ]
+ ;
+
+#
+# Tests for client. All test source code, by pulling in libclient we avoid
+# linking with ClientMain.cpp
+#
+exe s_client : [ glob test/*.cpp : test/TestSinglePerf.cpp test/TestMigration.cpp ]
+ pthread
+ /theCore//core
+ /theNodeAttr//nodeattr
+ /theNode//node
+ /theParser//libparser
+ /theBase//base
+ libclient
+ /site-config//boost_system
+ /site-config//boost_serialization
+ /site-config//boost_filesystem
+ /site-config//boost_program_options
+ /site-config//boost_datetime
+ /site-config//boost_test
+ : <include>../ANode/test
+ <include>../Base/test
+ <variant>debug:<define>DEBUG
+ [ conditional <ssl>on : <library>/ecflow_top//openssl_libs ]
+ ;
+
+exe perf_test_large_defs : [ glob test/TestSinglePerf.cpp ] [ glob test/SCPort.cpp ]
+ /theCore//core
+ /theNodeAttr//nodeattr
+ /theNode//node
+ /theParser//libparser
+ /theBase//base
+ libclient
+ pthread
+ /site-config//boost_system
+ /site-config//boost_serialization
+ /site-config//boost_filesystem
+ /site-config//boost_program_options
+ /site-config//boost_datetime
+ /site-config//boost_test
+ : <include>../ANode/test
+ <include>../Base/test
+ <variant>debug:<define>DEBUG
+ [ conditional <ssl>on : <library>/ecflow_top//openssl_libs ]
+ ;
+
+exe m_test_migration : [ glob test/TestMigration.cpp ] [ glob test/SCPort.cpp ]
+ /theCore//core
+ /theNodeAttr//nodeattr
+ /theNode//node
+ /theParser//libparser
+ /theBase//base
+ libclient
+ pthread
+ /site-config//boost_system
+ /site-config//boost_serialization
+ /site-config//boost_filesystem
+ /site-config//boost_program_options
+ /site-config//boost_datetime
+ /site-config//boost_test
+ : <include>../ANode/test
+ <include>../Base/test
+ <variant>debug:<define>DEBUG
+ [ conditional <ssl>on : <library>/ecflow_top//openssl_libs ]
+ ;
diff --git a/Client/src/ClientEnvironment.cpp b/Client/src/ClientEnvironment.cpp
index 0335d35..e5df1b5 100644
--- a/Client/src/ClientEnvironment.cpp
+++ b/Client/src/ClientEnvironment.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/src/ClientEnvironment.hpp b/Client/src/ClientEnvironment.hpp
index f9fdd80..2ec00c6 100644
--- a/Client/src/ClientEnvironment.hpp
+++ b/Client/src/ClientEnvironment.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/src/ClientInvoker.cpp b/Client/src/ClientInvoker.cpp
index 5ccbc77..c088f20 100644
--- a/Client/src/ClientInvoker.cpp
+++ b/Client/src/ClientInvoker.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -56,14 +56,14 @@ using namespace boost::posix_time;
// ==================================================================================
// class ClientInvoker
ClientInvoker::ClientInvoker()
-: on_error_throw_exception_(true), cli_(false), test_(false),testInterface_(false),
+: on_error_throw_exception_(true), test_(false),testInterface_(false),
connection_attempts_(2),retry_connection_period_(RETRY_CONNECTION_PERIOD),child_task_try_no_(0)
{
if (clientEnv_.debug()) cout << TimeStamp::now() << "ClientInvoker::ClientInvoker(): 1=================start=================\n";
}
ClientInvoker::ClientInvoker(const std::string& host_port)
-: on_error_throw_exception_(true), cli_(false), test_(false),testInterface_(false),
+: on_error_throw_exception_(true), test_(false),testInterface_(false),
connection_attempts_(2),retry_connection_period_(RETRY_CONNECTION_PERIOD),child_task_try_no_(0)
{
if (clientEnv_.debug()) cout << TimeStamp::now() << "ClientInvoker::ClientInvoker(): 2=================start=================\n";
@@ -76,7 +76,7 @@ ClientInvoker::ClientInvoker(const std::string& host_port)
}
ClientInvoker::ClientInvoker(const std::string& host, const std::string& port)
-: on_error_throw_exception_(true), cli_(false), test_(false),testInterface_(false),
+: on_error_throw_exception_(true), test_(false),testInterface_(false),
connection_attempts_(2),retry_connection_period_(RETRY_CONNECTION_PERIOD),child_task_try_no_(0)
{
if (clientEnv_.debug()) cout << TimeStamp::now() << "ClientInvoker::ClientInvoker(): 3=================start=================\n";
@@ -84,7 +84,7 @@ ClientInvoker::ClientInvoker(const std::string& host, const std::string& port)
}
ClientInvoker::ClientInvoker(const std::string& host, int port)
-: on_error_throw_exception_(true), cli_(false), test_(false),testInterface_(false),
+: on_error_throw_exception_(true), test_(false),testInterface_(false),
connection_attempts_(2),retry_connection_period_(RETRY_CONNECTION_PERIOD),child_task_try_no_(0)
{
if (clientEnv_.debug()) cout << TimeStamp::now() << "ClientInvoker::ClientInvoker(): 4=================start=================\n";
@@ -298,7 +298,7 @@ int ClientInvoker::do_invoke_cmd(Cmd_ptr cts_cmd) const
/// *Note* server_reply_.client_handle_ is kept until the next call to register a new client_handle
/// The client invoker can be used multiple times, hence keep value of defs, and client handle in server reply
/// However this is only done, if we are not using the Command Level Interface(cli)
- server_reply_.clear_for_invoke(cli_);
+ server_reply_.clear_for_invoke(cli());
cts_cmd->setup_user_authentification( clientEnv_ );
@@ -805,7 +805,7 @@ int ClientInvoker::replace( const std::string& absNodePath, const std::string& p
/// *Note* server_reply_.client_handle_ is kept until the next call to register_client_handle
/// The client invoker can be used multiple times, hence keep value of defs, and client handle in server reply
- server_reply_.clear_for_invoke(cli_);
+ server_reply_.clear_for_invoke(cli());
/// Handle command constructors that can throw
Cmd_ptr cts_cmd;
@@ -832,7 +832,7 @@ int ClientInvoker::replace_1(const std::string& absNodePath, defs_ptr client_def
{
/// *Note* server_reply_.client_handle_ is kept until the next call to register_client_handle
/// The client invoker can be used multiple times, hence keep value of defs, and client handle in server reply
- server_reply_.clear_for_invoke(cli_);
+ server_reply_.clear_for_invoke(cli());
/// Handle command constructors that can throw
Cmd_ptr cts_cmd;
@@ -1179,7 +1179,7 @@ int ClientInvoker::load_in_memory_defs( const defs_ptr& clientDefs, bool force)
{
/// *Note* server_reply_.client_handle_ is kept until the next call to register_client_handle
/// The client invoker can be used multiple times, hence keep value of defs, and client handle in server reply
- server_reply_.clear_for_invoke(cli_);
+ server_reply_.clear_for_invoke(cli());
if ( !clientDefs.get() ) {
server_reply_.set_error_msg("The client definition is empty.");
@@ -1311,7 +1311,7 @@ RequestLogger::~RequestLogger() {
rtt(ss.str());
}
- if (ci_->cli_ && cmd_->ping_cmd() && ci_->server_reply_.error_msg().empty()) {
+ if (ci_->cli() && cmd_->ping_cmd() && ci_->server_reply_.error_msg().empty()) {
cout << "ping server(" << ci_->client_env_host_port() << ") succeeded in " << to_simple_string(ci_->rtt_) << " ~" << ci_->rtt_.total_milliseconds() << " milliseconds\n";
}
}
diff --git a/Client/src/ClientInvoker.hpp b/Client/src/ClientInvoker.hpp
index 3340636..3bb5c10 100644
--- a/Client/src/ClientInvoker.hpp
+++ b/Client/src/ClientInvoker.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -59,7 +59,9 @@ public:
/// Configure to using command line interface
/// This affect commands like ping, log & file, so that, output is written to standard out
- void set_cli(bool f) { cli_ = f; }
+ /// Can also be used to check argument arguments
+ void set_cli(bool f) { clientEnv_.set_cli(f); }
+ bool cli() const { return clientEnv_.get_cli(); }
/// This will override the environment setting.
/// In particular setting host explicitly will avoid cycling through server list,
@@ -277,6 +279,12 @@ public:
const std::string& attrType,
const std::string& name = "",
const std::string& value = "") const { return invoke(CtsApi::alter(path,alterType,attrType,name,value)); }
+ int alter_sort(const std::vector<std::string>& paths,
+ const std::string& sortable_attribute_name,
+ bool recursive = true) const { return invoke(CtsApi::alter_sort(paths,sortable_attribute_name,recursive)); }
+ int alter_sort(const std::string& path,
+ const std::string& sortable_attribute_name,
+ bool recursive = true) const { return invoke(CtsApi::alter_sort(std::vector<std::string>(1,path),sortable_attribute_name,recursive)); }
int reloadwsfile() const;
int reloadpasswdfile() const;
@@ -325,7 +333,6 @@ private:
friend class RequestLogger;
private:
bool on_error_throw_exception_;
- bool cli_; // Command Line Interface. Controls whether output written to standard out
bool test_; // used in testing only
bool testInterface_; // used in testing only
unsigned int connection_attempts_; // No of attempts to establish connection with the server
diff --git a/Client/src/ClientMain.cpp b/Client/src/ClientMain.cpp
index 4c4b286..42366d2 100644
--- a/Client/src/ClientMain.cpp
+++ b/Client/src/ClientMain.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/src/ClientOptions.cpp b/Client/src/ClientOptions.cpp
index 200189b..b73f5ee 100644
--- a/Client/src/ClientOptions.cpp
+++ b/Client/src/ClientOptions.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/src/ClientOptions.hpp b/Client/src/ClientOptions.hpp
index 2d98eb6..7f81ef6 100644
--- a/Client/src/ClientOptions.hpp
+++ b/Client/src/ClientOptions.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/src/Rtt.cpp b/Client/src/Rtt.cpp
index 2133a74..67377af 100644
--- a/Client/src/Rtt.cpp
+++ b/Client/src/Rtt.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -73,7 +73,7 @@ std::string Rtt::analyis(const std::string& filename)
{
std::vector<std::string> lines;
if (!File::splitFileIntoLines(filename,lines)) {
- std::cout << "Rtt::analyis: could not open file " << filename << "\n";
+ std::cout << "Rtt::analyis: could not open file " << filename << " (" << strerror(errno) << ")\n";
return string();
}
diff --git a/Client/src/Rtt.hpp b/Client/src/Rtt.hpp
index a9b6ead..8ae4152 100644
--- a/Client/src/Rtt.hpp
+++ b/Client/src/Rtt.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/src/UrlCmd.cpp b/Client/src/UrlCmd.cpp
index 83c4171..731b2a6 100644
--- a/Client/src/UrlCmd.cpp
+++ b/Client/src/UrlCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/src/UrlCmd.hpp b/Client/src/UrlCmd.hpp
index 35a406c..36cc183 100644
--- a/Client/src/UrlCmd.hpp
+++ b/Client/src/UrlCmd.hpp
@@ -6,7 +6,7 @@
// Version : Beta version for test use only
// Revision : $Revision$
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/InvokeServer.hpp b/Client/test/InvokeServer.hpp
index 619a13c..091c510 100644
--- a/Client/test/InvokeServer.hpp
+++ b/Client/test/InvokeServer.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #32 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/SCPort.cpp b/Client/test/SCPort.cpp
index 886b16c..193d26c 100644
--- a/Client/test/SCPort.cpp
+++ b/Client/test/SCPort.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/SCPort.hpp b/Client/test/SCPort.hpp
index ab0f160..7b3ed03 100644
--- a/Client/test/SCPort.hpp
+++ b/Client/test/SCPort.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestCheckPtDefsCmd.cpp b/Client/test/TestCheckPtDefsCmd.cpp
index 3852fea..61b96c6 100644
--- a/Client/test/TestCheckPtDefsCmd.cpp
+++ b/Client/test/TestCheckPtDefsCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #29 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestClientEnvironment.cpp b/Client/test/TestClientEnvironment.cpp
index d2be282..6323bd0 100644
--- a/Client/test/TestClientEnvironment.cpp
+++ b/Client/test/TestClientEnvironment.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -42,8 +42,11 @@ BOOST_AUTO_TEST_CASE( test_client_environment_host_file_parsing )
std::string good_host_file = File::test_data("Client/test/data/good_hostfile","Client");
// local host should be implicitly added to internal host list
+ std::string the_host = ClientEnvironment::hostSpecified();
+ if (the_host.empty()) the_host = Str::LOCALHOST();
+
std::vector<std::string> expectedHost;
- expectedHost.push_back(Str::LOCALHOST());
+ expectedHost.push_back(the_host);
expectedHost.push_back("host1");
expectedHost.push_back("host2");
expectedHost.push_back("host3");
@@ -171,31 +174,27 @@ BOOST_AUTO_TEST_CASE( test_client_environment_errors )
putenv(const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")); // remove from env, otherwise valgrind complains
}
+ std::string the_host = ClientEnvironment::hostSpecified();
+ if (the_host.empty()) the_host = Str::LOCALHOST();
+
{
// ONLY run this test if enviroment variable ECF_PORT not defined
std::string env = "ECF_ALLOW_NEW_CLIENT_OLD_SERVER=";
- env += Str::LOCALHOST(); env += ":"; env += Str::DEFAULT_PORT_NUMBER(); env += ":xx";
- BOOST_CHECK_MESSAGE(putenv(const_cast<char*>(env.c_str())) == 0,"putenv failed for " << env);
- BOOST_CHECK_THROW(ClientEnvironment client_env, std::runtime_error );
- putenv(const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")); // remove from env, otherwise valgrind complains
- }
- {
- std::string env = "ECF_ALLOW_NEW_CLIENT_OLD_SERVER=";
- env += Str::LOCALHOST(); env += ":"; env += Str::DEFAULT_PORT_NUMBER(); env += "xx";
+ env += the_host; env += ":"; env += Str::DEFAULT_PORT_NUMBER(); env += ":xx";
BOOST_CHECK_MESSAGE(putenv(const_cast<char*>(env.c_str())) == 0,"putenv failed for " << env);
BOOST_CHECK_THROW(ClientEnvironment client_env, std::runtime_error );
putenv(const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")); // remove from env, otherwise valgrind complains
}
{
std::string env = "ECF_ALLOW_NEW_CLIENT_OLD_SERVER=";
- env += Str::LOCALHOST(); env += Str::DEFAULT_PORT_NUMBER(); env += "12";
+ env += the_host; env += Str::DEFAULT_PORT_NUMBER(); env += "12";
BOOST_CHECK_MESSAGE(putenv(const_cast<char*>(env.c_str())) == 0,"putenv failed for " << env);
BOOST_CHECK_THROW(ClientEnvironment client_env, std::runtime_error );
putenv(const_cast<char*>("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")); // remove from env, otherwise valgrind complains
}
{
std::stringstream ss;
- ss << "ECF_ALLOW_NEW_CLIENT_OLD_SERVER=fred:2222:0,bill:333:2222," << Str::LOCALHOST() << ":" << Str::DEFAULT_PORT_NUMBER() << ":xx";
+ ss << "ECF_ALLOW_NEW_CLIENT_OLD_SERVER=fred:2222:0,bill:333:2222," << the_host << ":" << Str::DEFAULT_PORT_NUMBER() << ":xx";
std::string env = ss.str();
BOOST_CHECK_MESSAGE(putenv(const_cast<char*>(env.c_str())) == 0,"putenv failed for " << env);
BOOST_CHECK_THROW(ClientEnvironment client_env, std::runtime_error );
@@ -215,9 +214,13 @@ BOOST_AUTO_TEST_CASE( test_client_environment )
}
std::cout << "Client:: ...test_client_environment-ECF_ALLOW_NEW_CLIENT_OLD_SERVER" << endl;
+
+ std::string the_host = ClientEnvironment::hostSpecified();
+ if (the_host.empty()) the_host = Str::LOCALHOST();
+
{
std::string env = "ECF_ALLOW_NEW_CLIENT_OLD_SERVER=";
- env += Str::LOCALHOST(); env += ":"; env += Str::DEFAULT_PORT_NUMBER(); env += ":11";
+ env += the_host; env += ":"; env += Str::DEFAULT_PORT_NUMBER(); env += ":11";
BOOST_CHECK_MESSAGE(putenv(const_cast<char*>(env.c_str())) == 0,"putenv failed for " << env);
ClientEnvironment client_env;
BOOST_CHECK_MESSAGE(client_env.allow_new_client_old_server()==11,"Expected 11 but found " << client_env.allow_new_client_old_server() << " for env " << env);
@@ -225,7 +228,7 @@ BOOST_AUTO_TEST_CASE( test_client_environment )
}
{
std::stringstream ss;
- ss << "ECF_ALLOW_NEW_CLIENT_OLD_SERVER=fred:2222:0,bill:333:2222," << Str::LOCALHOST() << ":" << Str::DEFAULT_PORT_NUMBER() << ":" << 33;
+ ss << "ECF_ALLOW_NEW_CLIENT_OLD_SERVER=fred:2222:0,bill:333:2222," << the_host << ":" << Str::DEFAULT_PORT_NUMBER() << ":" << 33;
std::string env = ss.str();
BOOST_CHECK_MESSAGE(putenv(const_cast<char*>(env.c_str())) == 0,"putenv failed for " << env);
ClientEnvironment client_env;
@@ -252,6 +255,4 @@ BOOST_AUTO_TEST_CASE( test_client_environment )
}
}
-
BOOST_AUTO_TEST_SUITE_END()
-
diff --git a/Client/test/TestClientInterface.cpp b/Client/test/TestClientInterface.cpp
index c75797b..dd3af04 100644
--- a/Client/test/TestClientInterface.cpp
+++ b/Client/test/TestClientInterface.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #75 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -78,7 +78,7 @@ BOOST_AUTO_TEST_CASE( test_client_interface )
BOOST_REQUIRE_MESSAGE( theClient.begin_all_suites() == 0,CtsApi::begin() << " should return 0\n" << theClient.errorMsg());
- Zombie z(Child::USER,ecf::Child::INIT,ZombieAttr::get_default_attr(Child::USER),"path_to_task","DUMMY_JOBS_PASSWORD", "DUMMY_PROCESS_OR_REMOTE_ID",1);
+ Zombie z(Child::USER,ecf::Child::INIT,ZombieAttr::get_default_attr(Child::USER),"/path/to/task","DUMMY_JOBS_PASSWORD", "DUMMY_PROCESS_OR_REMOTE_ID",1);
BOOST_REQUIRE_MESSAGE( theClient.zombieGet() == 0,CtsApi::zombieGet() << " should return 0\n" << theClient.errorMsg());
BOOST_REQUIRE_MESSAGE( theClient.zombieFob(z) == 0, " should return 0\n" << theClient.errorMsg());
BOOST_REQUIRE_MESSAGE( theClient.zombieFail(z) == 0, " should return 0\n" << theClient.errorMsg());
@@ -86,12 +86,12 @@ BOOST_AUTO_TEST_CASE( test_client_interface )
BOOST_REQUIRE_MESSAGE( theClient.zombieBlock(z) == 0, " should return 0\n" << theClient.errorMsg());
BOOST_REQUIRE_MESSAGE( theClient.zombieRemove(z) == 0, " should return 0\n" << theClient.errorMsg());
BOOST_REQUIRE_MESSAGE( theClient.zombieKill(z) == 0, " should return 0\n" << theClient.errorMsg());
- BOOST_REQUIRE_MESSAGE( theClient.zombieFobCli("path_to_task") == 0, " should return 0\n" << theClient.errorMsg());
- BOOST_REQUIRE_MESSAGE( theClient.zombieFailCli("path_to_task") == 0, " should return 0\n" << theClient.errorMsg());
- BOOST_REQUIRE_MESSAGE( theClient.zombieAdoptCli("path_to_task") == 0, " should return 0\n" << theClient.errorMsg());
- BOOST_REQUIRE_MESSAGE( theClient.zombieBlockCli("path_to_task") == 0, " should return 0\n" << theClient.errorMsg());
- BOOST_REQUIRE_MESSAGE( theClient.zombieRemoveCli("path_to_task") == 0, " should return 0\n" << theClient.errorMsg());
- BOOST_REQUIRE_MESSAGE( theClient.zombieKillCli("path_to_task") == 0, " should return 0\n" << theClient.errorMsg());
+ BOOST_REQUIRE_MESSAGE( theClient.zombieFobCli("/path/to/task") == 0, " should return 0\n" << theClient.errorMsg());
+ BOOST_REQUIRE_MESSAGE( theClient.zombieFailCli("/path/to/task") == 0, " should return 0\n" << theClient.errorMsg());
+ BOOST_REQUIRE_MESSAGE( theClient.zombieAdoptCli("/path/to/task") == 0, " should return 0\n" << theClient.errorMsg());
+ BOOST_REQUIRE_MESSAGE( theClient.zombieBlockCli("/path/to/task") == 0, " should return 0\n" << theClient.errorMsg());
+ BOOST_REQUIRE_MESSAGE( theClient.zombieRemoveCli("/path/to/task") == 0, " should return 0\n" << theClient.errorMsg());
+ BOOST_REQUIRE_MESSAGE( theClient.zombieKillCli("/path/to/task") == 0, " should return 0\n" << theClient.errorMsg());
BOOST_REQUIRE_MESSAGE( theClient.job_gen("") == 0,CtsApi::job_gen("") << " should return 0\n" << theClient.errorMsg());
BOOST_REQUIRE_MESSAGE( theClient.job_gen("/s") == 0,CtsApi::job_gen("/s") << " should return 0\n" << theClient.errorMsg());
@@ -302,6 +302,12 @@ BOOST_AUTO_TEST_CASE( test_client_interface )
BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","late","-c +02:00 -a 20:00 -s +00:15") == 0,"--alter should return 0\n" << theClient.errorMsg());
BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","late","-s 00:02 -c +00:05") == 0,"--alter should return 0\n" << theClient.errorMsg());
BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","late","-s 00:01 -a 14:30 -c +00:01") == 0,"--alter should return 0\n" << theClient.errorMsg());
+ BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","limit","limit_name","10") == 0,"--alter should return 0\n" << theClient.errorMsg());
+ BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","inlimit","limit_name") == 0,"--alter should return 0\n" << theClient.errorMsg());
+ BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","inlimit","limit_name","10") == 0,"--alter should return 0\n" << theClient.errorMsg());
+ BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","inlimit","/path/to/limit:limit_name2") == 0,"--alter should return 0\n" << theClient.errorMsg());
+ BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","add","inlimit","/path/to/limit:limit_name2","10") == 0,"--alter should return 0\n" << theClient.errorMsg());
+
std::vector<std::string> validDays = DayAttr::allDays(); // HPUX barfs if use DayAttr::allDays() directly in BOOST_FOREACH
BOOST_FOREACH(const string& day, validDays) {
@@ -395,6 +401,14 @@ BOOST_AUTO_TEST_CASE( test_client_interface )
BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","set_flag",flag_types[i]) == 0,"--alter should return 0\n" << theClient.errorMsg());
BOOST_REQUIRE_MESSAGE( theClient.alter("/s1","clear_flag",flag_types[i]) == 0,"--alter should return 0\n" << theClient.errorMsg());
}
+
+ // sort
+ std::vector<std::string> sortable_attributes = Attr::all_attrs();
+ BOOST_REQUIRE_MESSAGE(!sortable_attributes.empty(),"Expected to find attributes");
+ for(size_t i = 0; i < sortable_attributes.size(); i++) {
+ BOOST_REQUIRE_MESSAGE( theClient.alter_sort("/s1",sortable_attributes[i],true) == 0,"--alter should return 0\n" << theClient.errorMsg());
+ BOOST_REQUIRE_MESSAGE( theClient.alter_sort("/s1",sortable_attributes[i],false) == 0,"--alter should return 0\n" << theClient.errorMsg());
+ }
}
BOOST_AUTO_TEST_CASE( test_client_interface_for_fail )
diff --git a/Client/test/TestClientInvoker.cpp b/Client/test/TestClientInvoker.cpp
index feb9e8f..27b1c85 100644
--- a/Client/test/TestClientInvoker.cpp
+++ b/Client/test/TestClientInvoker.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestClientTimeout.cpp b/Client/test/TestClientTimeout.cpp
index e9838de..518189e 100644
--- a/Client/test/TestClientTimeout.cpp
+++ b/Client/test/TestClientTimeout.cpp
@@ -3,7 +3,7 @@
//// Author : Avi
//// Revision : $Revision: #5 $
////
-//// Copyright 2009-2016 ECMWF.
+//// Copyright 2009-2017 ECMWF.
//// This software is licensed under the terms of the Apache Licence version 2.0
//// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
//// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestFlagMigrate.cpp b/Client/test/TestFlagMigrate.cpp
index c920046..0037c87 100644
--- a/Client/test/TestFlagMigrate.cpp
+++ b/Client/test/TestFlagMigrate.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #42 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestGroupCmd.cpp b/Client/test/TestGroupCmd.cpp
index 6e47e31..bab116e 100644
--- a/Client/test/TestGroupCmd.cpp
+++ b/Client/test/TestGroupCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #37 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestJobGenOnly.cpp b/Client/test/TestJobGenOnly.cpp
index 0db9827..10ab34d 100644
--- a/Client/test/TestJobGenOnly.cpp
+++ b/Client/test/TestJobGenOnly.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #40 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestLifeCycle.cpp b/Client/test/TestLifeCycle.cpp
index 817f1fc..1dd17a6 100644
--- a/Client/test/TestLifeCycle.cpp
+++ b/Client/test/TestLifeCycle.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #50 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestLoadDefsCmd.cpp b/Client/test/TestLoadDefsCmd.cpp
index 420b62e..884dd7c 100644
--- a/Client/test/TestLoadDefsCmd.cpp
+++ b/Client/test/TestLoadDefsCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #42 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestMigration.cpp b/Client/test/TestMigration.cpp
index 31b62e3..80d115b 100644
--- a/Client/test/TestMigration.cpp
+++ b/Client/test/TestMigration.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestPasswdFile.cpp b/Client/test/TestPasswdFile.cpp
index 5bdd294..0813513 100644
--- a/Client/test/TestPasswdFile.cpp
+++ b/Client/test/TestPasswdFile.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestPlugCmd.cpp b/Client/test/TestPlugCmd.cpp
index b1523f0..1cb5b60 100644
--- a/Client/test/TestPlugCmd.cpp
+++ b/Client/test/TestPlugCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #34 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestRtt.cpp b/Client/test/TestRtt.cpp
index 7cca3de..c4f181e 100644
--- a/Client/test/TestRtt.cpp
+++ b/Client/test/TestRtt.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestServer.cpp b/Client/test/TestServer.cpp
index a688ad9..a2b8b6b 100644
--- a/Client/test/TestServer.cpp
+++ b/Client/test/TestServer.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #45 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestServerAndLifeCycle.cpp b/Client/test/TestServerAndLifeCycle.cpp
index 32a2ee2..f90261e 100644
--- a/Client/test/TestServerAndLifeCycle.cpp
+++ b/Client/test/TestServerAndLifeCycle.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #54 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestServerLoad.cpp b/Client/test/TestServerLoad.cpp
index 2ce9d75..49eea7a 100644
--- a/Client/test/TestServerLoad.cpp
+++ b/Client/test/TestServerLoad.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #29 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestSignalSIGTERM.cpp b/Client/test/TestSignalSIGTERM.cpp
index 453c40a..44816d7 100644
--- a/Client/test/TestSignalSIGTERM.cpp
+++ b/Client/test/TestSignalSIGTERM.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestSinglePerf.cpp b/Client/test/TestSinglePerf.cpp
index 0d1fc9b..5be1ddb 100644
--- a/Client/test/TestSinglePerf.cpp
+++ b/Client/test/TestSinglePerf.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestUrlCmd.cpp b/Client/test/TestUrlCmd.cpp
index 7c19efc..96cf536 100644
--- a/Client/test/TestUrlCmd.cpp
+++ b/Client/test/TestUrlCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Client/test/TestWhiteListFile.cpp b/Client/test/TestWhiteListFile.cpp
index 0ec3885..f0dcca5 100644
--- a/Client/test/TestWhiteListFile.cpp
+++ b/Client/test/TestWhiteListFile.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Jamroot.jam b/Jamroot.jam
index ac1f64b..d6d7823 100644
--- a/Jamroot.jam
+++ b/Jamroot.jam
@@ -1,9 +1,9 @@
-## Copyright 2009-2016 ECMWF.
-## This software is licensed under the terms of the Apache Licence version 2.0
-## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-## In applying this licence, ECMWF does not waive the privileges and immunities
-## granted to it by virtue of its status as an intergovernmental organisation
-## nor does it submit to any jurisdiction.
+## Copyright 2009-2017 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
project ecflow_top ;
@@ -29,7 +29,7 @@ feature.compose <ssl>on : <define>ECF_OPENSSL ;
# ===============================================================================
# To clean all the sub projects just use: bjam --clean
#
-path-constant TOP : . ; # After that, the TOP variable can be used in every Jamfile.
+path-constant TOP : . ; # After that, the TOP variable can be used in every Jamfile.
build-project ACore ;
build-project ANattr ;
@@ -54,11 +54,11 @@ if $(ARCH) in $(build_gui) {
# Some user do no want python: They must define ECF_NO_PYTHON
NO_PYTHON = [ os.environ ECF_NO_PYTHON ] ;
#echo "NO_PYTHON = $(NO_PYTHON)" ;
-if ! $(NO_PYTHON) {
- # echo "building python" ;
- build-project Pyext ;
+if ! $(NO_PYTHON) {
+ # echo "building python" ;
+ build-project Pyext ;
}
-
+
# ==================== INSTALL ==========================================================
local dest_dir = [ os.environ ECFLOW_DESTDIR ] ;
@@ -67,11 +67,11 @@ constant ECFLOW_DESTDIR : $(dest_dir) ;
local ECFLOW_VERSION = [ SHELL "cd $(TOP); ./version.sh" ] ;
local install_dir = [ os.environ ECFLOW_INSTALL_DIR ] ;
-install_dir default = "/usr/local/apps/ecflow/$(ECFLOW_VERSION)" ;
+install_dir default = "/usr/local/apps/ecflow/$(ECFLOW_VERSION)" ;
constant ECFLOW_INSTALL_DIR : $(install_dir) ;
local python_install_dir = [ os.environ ECFLOW_PYTHON_INSTALL_DIR ] ;
-python_install_dir default = $(install_dir)/lib/python2.7/site-packages/ecflow ;
+python_install_dir default = $(install_dir)/lib/python2.7/site-packages/ecflow ;
constant ECFLOW_PYTHON_INSTALL_DIR : $(python_install_dir) ;
# Used for ecflowview files
@@ -86,7 +86,7 @@ constant ECFLOW_SHARED_DIR : $(ECFLOW_DESTDIR)$(ECFLOW_INSTALL_DIR)/share/ecflow
#
# Allow the installation directory be be defined externally, by the environment variable ECFLOW_INSTALL_DIR
#
-# However we want this to be explicit, as we dont need it on a day to day basis.
+# However we want this to be explicit, as we dont need it on a day to day basis.
# Usage:
# bjam install variant=release
#
@@ -98,7 +98,7 @@ constant ECFLOW_SHARED_DIR : $(ECFLOW_DESTDIR)$(ECFLOW_INSTALL_DIR)/share/ecflow
#
# Note: if you find that the install has started to create directories
# of name install-server,install-client,,install-py
-# Then *ensure* you have set the environment variables ECFLOW_INSTALL_DIR,
+# Then *ensure* you have set the environment variables ECFLOW_INSTALL_DIR,
#
# Note: Not all system have XLib, hence install ecFlowview manually by using:
# bjam -d2 install-viewer
@@ -106,7 +106,7 @@ constant ECFLOW_SHARED_DIR : $(ECFLOW_DESTDIR)$(ECFLOW_INSTALL_DIR)/share/ecflow
# Make sure for ECMWF that ECFLOW_INSTALL_DIR leaf directory encompasses version number
# that ties up with $WK/VERSION.cmake
#
-
+
# Do no call this on the command line, prefer bjam install-all || install-viewer
# If this is called in isolation ldd will show the referenced shared lib as missing
install install-view
@@ -123,16 +123,16 @@ install install-view64
: view//ecflowview
: <location>$(ECFLOW_DESTDIR)/$(ECFLOW_INSTALL_DIR)/bin
<dll-path>$(ECFLOW_INSTALL_DIR)/lib64
- ;
+ ;
install install-view-files
: [ glob view/servers ]
[ glob view/src/ecflowview.menu ]
: <location>$(ECFLOW_SHARED_DIR)
;
-
+
install install-server
- : Server//ecflow_server
+ : Server//ecflow_server
: <location>$(ECFLOW_DESTDIR)/$(ECFLOW_INSTALL_DIR)/bin
;
@@ -148,10 +148,10 @@ install install-tools
;
install install-doc
- : [ glob Doc/user-manual/client_*.docx ]
+ : [ glob Doc/user-manual/client_*.docx ]
: <location>$(ECFLOW_DESTDIR)/$(ECFLOW_INSTALL_DIR)/doc/ecflow
;
-
+
# Fix bugs associated with the output of old version of ecflow_client --migrate
install install-migrate
: [ glob Pyext/migrate/ecflow_migrate.py ]
@@ -162,15 +162,15 @@ install install-migrate
# Use this for a non-python install
alias install-base :
- install-server
- install-client
- install-tools
+ install-server
+ install-client
+ install-tools
install-doc
install-migrate
;
-alias install :
+alias install :
install-base
- Pyext//install-py
+ Pyext//install-py
Pyext//install-py1
;
alias install-viewer :
diff --git a/Pyext/CMakeLists.txt b/Pyext/CMakeLists.txt
index caa17fe..10649ee 100644
--- a/Pyext/CMakeLists.txt
+++ b/Pyext/CMakeLists.txt
@@ -78,6 +78,7 @@ list( APPEND u_tests
py_u_TestAddDelete
py_u_TestAddDeleteFunc
py_u_TestAddNodeFunc
+ py_u_TestAutoAddExtern
py_u_TestCopy
py_u_TestDefs
py_u_TestDefsCheck
diff --git a/Pyext/ecflow/__init__.py b/Pyext/ecflow/__init__.py
index 41f1e4a..c21b843 100644
--- a/Pyext/ecflow/__init__.py
+++ b/Pyext/ecflow/__init__.py
@@ -4,7 +4,7 @@ from ecflow import *
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
@@ -15,6 +15,6 @@ from ecflow import *
The ecFlow python module
"""
-__version__ = '4.5.0'
+__version__ = '4.6.0'
# http://stackoverflow.com/questions/13040646/how-do-i-create-documentation-with-pydoc
diff --git a/Pyext/ecflow/__init__.py.in b/Pyext/ecflow/__init__.py.in
index cec9f90..a213157 100644
--- a/Pyext/ecflow/__init__.py.in
+++ b/Pyext/ecflow/__init__.py.in
@@ -4,7 +4,7 @@ from ecflow import *
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/jamfile.jam b/Pyext/jamfile.jam
index 6a3293e..1656e2e 100755
--- a/Pyext/jamfile.jam
+++ b/Pyext/jamfile.jam
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
@@ -18,13 +18,38 @@
# next alternative: required properties: <python>2.7 <target-os>linux
# matched
#
+# Note: ./bootstrap.sh will create a project-config.jam
+#
# Please check if you have more than one 'using python' in configuration files.
# Please check site-config.jam, user-config.jam and project-config.jam and
-# remove duplicated 'using python'
+# remove duplicated 'using python'.
#
# When installing BOOST-python libs, make sure to call module load python *FIRST*
# Otherwise it will pick the python specified in project-config.jam, which make not be correct
#
+# ==========================================================================================
+# PYTHON3:
+# Build:
+# 1/ module load python3, this update the $PATH
+# 2/ ./bootstrap.sh --with-python=/usr/local/apps/python3/3.5.1-01/bin/python3
+# 3/ Need to manually edit $BOOST_ROOT/project-config.jam, make sure file '$BOOST_ROOT/project-config.jam' has:
+#
+# using python
+# : 3.5
+# : /usr/local/apps/python3/3.5.1-01/bin/python3 # ***** If this is left as python3, includes get messed up, have mix of python2 & 3
+# : /usr/local/apps/python3/3.5.1-01/include/python3.5m # include directory
+# ;
+# ...
+# option.set includedir : /usr/local/apps/python3/3.5.1-01/include/python3.5m ; # ***MAKE*** sure this is set
+#
+# ***** cmd/prefix must be path to python3, otherwise compilation include files has a mixture of
+# python 2.7 and 3.5, YUK, took ages to debug
+#
+# Check:
+# To check the build make sure we don't have symbol pulled in from python2 libs
+# cd $BOOST_ROOT/stage/lib
+# nm -D *python* | grep PyClass_Type # PyClass_Type is a symbol *ONLY* used in python2.x
+# nm -D /tmp/ma0/workspace/bdir/release/ecflow/Pyext/ecflow.so | grep PyClass_Type # check ecflow.so
# ===============================================================================
#
@@ -54,13 +79,12 @@ use-project theSimulator : ../CSim ;
# Make the definition of the python-extension rule available
import python ;
-# using python : 3.5.1 : /usr/local/apps/python3/3.5.1-01/ ;
if ! [ python.configured ]
{
ECHO "notice: no Python configured in *user-config.jam*" ;
ECHO "notice: will use default configuration" ;
- # We will typically place this in user-config/site-config.jam
+ # We will typically place this in user-config || site-config.jam || $BOOST_ROOT/project-config.jam
#using python
# : # version
# : # cmd-or-prefix
@@ -69,7 +93,7 @@ if ! [ python.configured ]
# : # condition
# ;
#using python ;
- #using python : 3.5 : python3 : /usr/local/apps/python3/3.5.1-01/include/python3.5m ;
+ #using python : 3.5 : /usr/local/apps/python3/3.5.1-01/bin/python3 : /usr/local/apps/python3/3.5.1-01/include/python3.5m ;
}
# Specify the path to the Boost project. If you move this project,
@@ -79,7 +103,6 @@ local BOOST_ROOT = [ os.environ BOOST_ROOT ] ;
use-project boost
: $(BOOST_ROOT) ;
-
# ======================== libs ============================================
# HPUX: ADD standard libs. They don't get added by default ?
# Also on HPUX the shared libs appears reversed, and don't appear
@@ -88,7 +111,6 @@ use-project boost
# but only for HPUX/acc toolset
# <ALL>: It appears the pthread lib is automatically added. i.e >lib pthread ;
#
-
lib std_v2 ;
lib stream ;
lib Csup ;
@@ -128,7 +150,6 @@ python-extension ecflow : [ glob src/*.cpp ]
# - Picks up latest changes
install ecflow/ : ecflow ;
-
# ========================================================================
# INSTALLATION:
# ========================================================================
@@ -153,7 +174,6 @@ install install-py
explicit install-py1 ;
explicit install-py ;
-
# ========================================================================
# TESTING: unit-tests and test for python fragments in online tutorial
# ========================================================================
@@ -195,6 +215,7 @@ run-test TestRemove : ecflow [ glob test/py_u_TestRemove.py ] ;
run-test TestGeneratedVariable : ecflow [ glob test/py_u_TestGeneratedVariable.py ] ;
run-test TestEcf : ecflow [ glob test/py_u_TestEcf.py ] ;
run-test TestFlag : ecflow [ glob test/py_u_TestFlag.py ] ;
+run-test TestAutoAddExtern : ecflow [ glob test/py_u_TestAutoAddExtern.py ] ;
# A target that runs all the tests.
# Note test_embed & test_embed_ecf commented out since we dont use this functionality
@@ -202,7 +223,7 @@ alias test-all
: TestUserManual TestJobGeneration TestDefs TestError TestTraversal TestDefsCheck
TestSimulator TestAddDelete TestAddDeleteError TestAddDeleteFunc TestAddNodeFunc TestParent TestGetAllTasks
TestDerivable TestMigrate TestRemove TestRepeatArithmetic TestWith TestFind TestGeneratedVariable TestEcf
- TestClientApi TestPythonChildApi TestFlag TestCopy
+ TestClientApi TestPythonChildApi TestFlag TestCopy TestAutoAddExtern
# test_embed test_embed_ecf
;
@@ -211,7 +232,7 @@ explicit test-all
TestUserManual TestJobGeneration TestDefs TestError TestTraversal TestDefsCheck
TestSimulator TestAddDelete TestAddDeleteError TestAddDeleteFunc TestAddNodeFunc TestParent TestGetAllTasks
TestDerivable TestMigrate TestRemove TestRepeatArithmetic TestWith TestFind TestGeneratedVariable TestEcf
- TestClientApi TestPythonChildApi TestFlag TestCopy
+ TestClientApi TestPythonChildApi TestFlag TestCopy TestAutoAddExtern
# test_embed test_embed_ecf
;
\ No newline at end of file
diff --git a/Pyext/migrate/ecflow_migrate.py b/Pyext/migrate/ecflow_migrate.py
index abdc0f3..cbe6bbb 100644
--- a/Pyext/migrate/ecflow_migrate.py
+++ b/Pyext/migrate/ecflow_migrate.py
@@ -4,7 +4,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
@@ -12,6 +12,11 @@
# nor does it submit to any jurisdiction.
#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+#
+# Handle bugs, produced by old versions of ecflow_client --migrate
+# - Mostly to do with handling newlines
+#
+
import os # for getenv
import shutil # used to remove directory tree
#import argparse # requires python 2.7
diff --git a/Pyext/samples/ListVariables.py b/Pyext/samples/ListVariables.py
index 53b0efa..848e6aa 100755
--- a/Pyext/samples/ListVariables.py
+++ b/Pyext/samples/ListVariables.py
@@ -4,7 +4,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/samples/TestBench.py b/Pyext/samples/TestBench.py
index fc04b1c..1427c49 100644
--- a/Pyext/samples/TestBench.py
+++ b/Pyext/samples/TestBench.py
@@ -4,7 +4,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
@@ -24,9 +24,46 @@
# =============================================================================
import ecflow
import os # for getenv
+import sys
import shutil # used to remove directory tree
import argparse # for argument parsing
+def get_root_source_dir():
+ cwd = os.getcwd()
+ #print "get_root_source_dir from: " + cwd
+ while (1):
+ # Get to directory that has ecflow
+ head, tail = os.path.split(cwd)
+ #print " head:" + head
+ #print " tail:" + tail
+ if tail.find("ecflow") != -1 :
+
+ # bjam, already at the source directory
+ if os.path.exists(cwd + "/VERSION.cmake"):
+ print(" Found VERSION.cmake in " + cwd)
+ return cwd
+
+ if tail != "Pyext" and tail != "migrate":
+ # in cmake, we may be in the build directory, hence we need to determine source directory
+ file = cwd + "/CTestTestfile.cmake"
+ #print " searching for " + file
+ if os.path.exists(file):
+ # determine path by looking into this file:
+ for line in open(file):
+ ## Source directory: /tmp/ma0/workspace/ecflow/Acore
+ if line.find("Source directory"):
+ tokens = line.split()
+ if len(tokens) == 4:
+ #print " returning root_source_dir:", tokens[3]
+ return tokens[3]
+ raise RuntimeError("ERROR could not find Source directory in CTestTestfile.cmake")
+ else:
+ raise RuntimeError("ERROR could not find file CTestTestfile.cmake in " + cwd)
+
+ cwd = head
+ return cwd
+
+
def delete_variables_affecting_job_generation(node):
"""delete customer related ECF variables, these will point to directories
that don't exist. Its ok we will regenerate our own local ones"""
@@ -77,8 +114,18 @@ if __name__ == "__main__":
a test server **
o All suites are put into a suspended state. This allows the GUI to resume them
o The server is restarted and suites are begun
- This programs assumes that ecflow module is accessible.
+ This programs assumes that ecflow module is accessible
+
+ example:
+ python Pyext/samples/TestBench.py --port=3141 --verbose=True AParser/test/data/good_defs/trigger/late.def
"""
+
+ print("####################################################################")
+ print("Running ecflow version " + ecflow.Client().version() + " debug build(" + str(ecflow.debug_build()) +")")
+ print("PYTHONPATH: " + str(os.environ['PYTHONPATH'].split(os.pathsep)))
+ print("sys.path: " + str(sys.path))
+ print("####################################################################")
+
PARSER = argparse.ArgumentParser(description=DESC,
formatter_class=argparse.RawDescriptionHelpFormatter)
PARSER.add_argument('defs_file',
@@ -98,21 +145,23 @@ if __name__ == "__main__":
print ARGS
# If running on local work space, use /Pyext/test/data/CUSTOMER/ECF_HOME as ecf_home
- if not ARGS.ecf_home:
- if os.getenv("WK") == None:
- print "No ecf_home specified. Please specify a writable directory"
- exit(1)
- ARGS.ecf_home = os.getenv("WK") + "/Pyext/test/data/CUSTOMER/ECF_HOME"
+ using_workspace = False;
+ ecflow_source_dir = ""
+ try:
+ ecflow_source_dir = get_root_source_dir();
+ ARGS.ecf_home = ecflow_source_dir + "/Pyext/test/data/CUSTOMER/ECF_HOME"
+ using_workspace = True
if ARGS.verbose:
- print "Workspace is defined"
- print "using /Client/bin/gcc\-4.8/debug/ecflow_client"
-
+ print "Workspace is defined ecflow_source_dir: ",ecflow_source_dir
+ except:
+ pass
+
if ARGS.verbose:
print "Using ECF_HOME=" + ARGS.ecf_home
- if ARGS.verbose:
- print "\nloading the definition from the input arguments(" + ARGS.defs_file + ")\n"
try:
+ if ARGS.verbose:
+ print "\nloading the definition from the input arguments(" + ARGS.defs_file + ")\n"
DEFS = ecflow.Defs(ARGS.defs_file)
except RuntimeError, ex:
print " ecflow.Defs(" + ARGS.defs_file + ") failed:\n" + str(ex)
@@ -131,29 +180,22 @@ if __name__ == "__main__":
for suite in DEFS.suites:
traverse_container(suite)
- if ARGS.verbose:
- print "add variables required for script generation, for all suites\n"
DEFS.add_variable("ECF_HOME", ARGS.ecf_home)
- if os.getenv("WK") != None:
- debug_path = os.getenv("WK") + "/Client/bin/gcc-4.8/debug/ecflow_client"
- release_path = os.getenv("WK") + "/Client/bin/gcc-4.8/debug/ecflow_client"
- if os.path.exists( debug_path ):
- DEFS.add_variable("ECF_CLIENT_EXE_PATH", debug_path )
- else:
- if os.path.exists( release_path ):
- DEFS.add_variable("ECF_CLIENT_EXE_PATH", release_path )
-
+
+ if using_workspace:
+ path_to_ecflow_client = ecflow.File.find_client()
+ if os.path.exists( path_to_ecflow_client ):
+ DEFS.add_variable("ECF_CLIENT_EXE_PATH", path_to_ecflow_client )
+ if ARGS.verbose: print "Adding ECF_CLIENT_EXE_PATH:",path_to_ecflow_client
+
DEFS.add_variable("SLEEP", "10") # not strictly required since default is 1 second
DEFS.add_variable("ECF_INCLUDE", ARGS.ecf_home + "/includes")
-
- if ARGS.verbose:
- print "Place all suites into suspended state, so they can be started by the GUI\n"
for suite in DEFS.suites:
suite.add_defstatus(ecflow.DState.suspended)
- # ecflow.PrintStyle.set_style(ecflow.Style.STATE)
if ARGS.verbose:
+ #ecflow.PrintStyle.set_style(ecflow.Style.STATE)
print DEFS
if ARGS.verbose:
diff --git a/Pyext/samples/TestGui.py b/Pyext/samples/TestGui.py
index a5d35ba..615a980 100755
--- a/Pyext/samples/TestGui.py
+++ b/Pyext/samples/TestGui.py
@@ -4,7 +4,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
@@ -58,7 +58,7 @@ class Tester(object) :
return os.getcwd() + "/test_gui/data/ecf_home_debug_" + str(self.port_)
return os.getcwd() + "/test_gui/data/ecf_home_release_" + str(self.port_)
- def ecf_includes(self) : return os.getcwd() + "Pyext/test/data/includes"
+ def ecf_includes(self) : return os.getcwd() + "/Pyext/test/data/includes"
def log_file_path(self): return "./" + gethostname() + "." + self.port_ + ".ecf.log"
def checkpt_file_path(self): return "./" + gethostname() + "." + self.port_ + ".ecf.check"
def backup_checkpt_file_path(self): return "./" + gethostname() + "." + self.port_ + ".ecf.check.b"
diff --git a/Pyext/samples/TestJobGenPerf.py b/Pyext/samples/TestJobGenPerf.py
index 412eaba..db64547 100644
--- a/Pyext/samples/TestJobGenPerf.py
+++ b/Pyext/samples/TestJobGenPerf.py
@@ -4,7 +4,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/samples/TestServerGetDefs.py b/Pyext/samples/TestServerGetDefs.py
index d92ea70..ba8d8fe 100644
--- a/Pyext/samples/TestServerGetDefs.py
+++ b/Pyext/samples/TestServerGetDefs.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/samples/TestSyncLocalPerf.py b/Pyext/samples/TestSyncLocalPerf.py
index 71eccd0..f79d2bf 100644
--- a/Pyext/samples/TestSyncLocalPerf.py
+++ b/Pyext/samples/TestSyncLocalPerf.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/samples/printdefs.py b/Pyext/samples/printdefs.py
index ace3608..1160698 100644
--- a/Pyext/samples/printdefs.py
+++ b/Pyext/samples/printdefs.py
@@ -4,7 +4,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/samples/resume.py b/Pyext/samples/resume.py
index 987e659..6812267 100644
--- a/Pyext/samples/resume.py
+++ b/Pyext/samples/resume.py
@@ -4,7 +4,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/script.py b/Pyext/script.py
index b7b5591..de3469d 100644
--- a/Pyext/script.py
+++ b/Pyext/script.py
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/setup.py b/Pyext/setup.py
new file mode 100755
index 0000000..782e2ec
--- /dev/null
+++ b/Pyext/setup.py
@@ -0,0 +1,136 @@
+#!/usr/bin/env python
+from distutils.core import setup, Extension
+import os
+import sys
+import glob
+
+# ========================================================================
+# Usage:
+# cd $WK; cd ecbuild/release/; sh -x ../../cmake.sh release; make ; make install
+# calling 'sh -x ../../cmake.sh release' will generate steup.py from setup.py.in
+# Issues:
+# Can not test cmake install, since it will always install to
+# /usr/local/apps/python/current/lib/python2.7/site-packages/ecflow
+#
+# To test install manually, we can:
+# cd $WK/Pyext
+# rm -rf build/ # for a clean build
+# python setup.py build_ext
+# python setup.py install --home=~
+#
+# See: http://docs.python.org/2/distutils/apiref.html?highlight=extension#distutils.core.Extension
+#
+# ========================================================================
+# AIX: On AIX we need custom compile and link flags:
+# The final link line is wrong: xlC_r xlc_r ,
+# /usr/local/lpp/vacpp11109/usr/vacpp/bin/.orig/xlC_r: 1501-228 (W) input file xlc_r not found
+#
+# Removing the duplicated xlc_r, We then get a little further,
+# ld: 0711-317 ERROR: Undefined symbol: .main
+# Using -bnoquiet
+# .main [12] ER PR crt0_64.s(/lib/crt0_64.o)
+# 00000070 .text R_RBR [34] .__start
+# This is because it is missing -G (generate dynamic library)
+# When we manually add -G, we sucessfully link(ecflow.so)
+#
+# Both of these can be fixed, by overriding the Link line with:
+# export LDSHARED="xlC_r -G -Wl,-bI:/usr/local/apps/python/2.7.2-01/lib/python2.7/config/python.exp"
+#
+# To find out what python is going to use:
+# python -c "from distutils import sysconfig; print sysconfig.get_config_vars('LDSHARED')[0]"
+# On AIX, it does not use this value ?
+#
+# See python issue 18235 _sysconfigdata.py wrong on AIX installations
+# ==========================================================================
+
+# ==========================================================================
+# Permissions: The permission of congfigured file are wrong: 2 choices
+# o Make sure origin file, has the right permissions
+# o Copy file to different directory, and change the permissions
+# since file(COPY) does rename files
+# configure_file(setup.py.in /tmp/ma0/workspace/ecflow/build/CMakeFiles/setup.py)
+# now copy the temporary into the final destination, setting the permissions
+# file(COPY /tmp/ma0/workspace/ecflow/build/CMakeFiles/setup.py
+# DESTINATION /tmp/ma0/workspace/ecflow/build
+# FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ
+# GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
+# ============================================================================
+
+#=============================================================================
+# define the directories to search for include files
+# to get this to work, you will need to include the path
+# to your boost installation and ecflow includes
+boost_root=os.getenv("BOOST_ROOT")
+include_dirs = [ "/tmp/ma0/workspace/ecflow/Pyext/../ACore/src",
+ "/tmp/ma0/workspace/ecflow/Pyext/../ANattr/src",
+ "/tmp/ma0/workspace/ecflow/Pyext/../ANode/src",
+ "/tmp/ma0/workspace/ecflow/Pyext/../AParser/src",
+ "/tmp/ma0/workspace/ecflow/Pyext/../Base/src",
+ "/tmp/ma0/workspace/ecflow/Pyext/../Base/src/cts",
+ "/tmp/ma0/workspace/ecflow/Pyext/../Base/src/stc",
+ "/tmp/ma0/workspace/ecflow/Pyext/../CSim/src",
+ "/tmp/ma0/workspace/ecflow/Pyext/../Client/src",
+ "/tmp/ma0/workspace/ecflow/Pyext/src",
+ boost_root,
+ ]
+
+# define the library directories to include any extra libraries that may be needed.
+# Give preference to release libs
+boost_lib_dir = boost_root + "/stage/lib/"
+library_dirs = ['/tmp/ma0/workspace/ecflow/build/ACore',
+ '/tmp/ma0/workspace/ecflow/build/ANattr/',
+ '/tmp/ma0/workspace/ecflow/build/ANode/',
+ '/tmp/ma0/workspace/ecflow/build/AParser/',
+ '/tmp/ma0/workspace/ecflow/build/Base/',
+ '/tmp/ma0/workspace/ecflow/build/CSim/',
+ '/tmp/ma0/workspace/ecflow/build/Client/',
+ boost_lib_dir
+ ]
+
+# define the libraries to link with this includes the boost lib
+libraries = [ 'core' , 'nodeattr', 'node', 'libparser', 'base', 'libsimu', 'libclient',
+ 'boost_system-mt',
+ 'boost_serialization-mt',
+ 'boost_filesystem-mt',
+ 'boost_program_options-mt',
+ 'boost_date_time-mt',
+ 'boost_python-mt' ]
+
+
+# extra compile flags needed for AIX only
+# Note setup.py will add -q64 -qcpluscmt -DNDEBUG automatically
+# Note: two extra_compile_args, debug and release, use the debug for testing and faster compiles
+extra_compile_args = ['-ftemplate-depth-512', '-Wno-unused-local-typedefs' ]
+extra_link_args = []
+if sys.platform.startswith("aix"):
+ extra_compile_args = [ '-qsuppress=1540-0198', '-O3', '-qstrict', '-qfuncsect', '-qeh', '-qrtti' ]
+ #extra_compile_args = [ '-qsuppress=1540-0198', '-qNOOPTimize', '-qnoinline', '-qfullpath', '-qfuncsect', '-qeh', '-qrtti' ]
+ extra_link_args= [ '-lpthread', '-ldl', '-bbigtoc' ] # '-G', '-noipath',
+
+
+# create the extension and add it to the python distribution
+# o glob.glob(os.path.join('src', '*.cpp'))
+# This expand the list of cpp files that need to be compiled
+#
+# The configuation below installs to:
+# o /usr/local/apps/python/current/lib/python2.7/site-packages/ecflow
+# when, "python setup.py install" is used:
+# lib/python2.7/site-packages/ecflow/ecflow.so
+# __init__.py
+setup( name='ecflow',
+ version='4.0.8',
+ author = 'ECMWF',
+ description = """ecflow Python interface""",
+ packages = [ 'ecflow' ],
+ package_dir={'ecflow': '/tmp/ma0/workspace/ecflow/Pyext/ecflow'},
+ ext_modules=[ Extension(
+ 'ecflow.ecflow',
+ glob.glob(os.path.join('/tmp/ma0/workspace/ecflow/Pyext/src', '*.cpp')),
+ include_dirs=include_dirs,
+ library_dirs=library_dirs,
+ libraries=libraries,
+ extra_compile_args=extra_compile_args,
+ extra_link_args=extra_link_args
+ )
+ ],
+ )
diff --git a/Pyext/src/BoostPythonUtil.cpp b/Pyext/src/BoostPythonUtil.cpp
index 43d891e..567694f 100644
--- a/Pyext/src/BoostPythonUtil.cpp
+++ b/Pyext/src/BoostPythonUtil.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/src/BoostPythonUtil.hpp b/Pyext/src/BoostPythonUtil.hpp
index ad606cf..30badab 100644
--- a/Pyext/src/BoostPythonUtil.hpp
+++ b/Pyext/src/BoostPythonUtil.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/src/ClientDoc.cpp b/Pyext/src/ClientDoc.cpp
index 723f965..461afa2 100644
--- a/Pyext/src/ClientDoc.cpp
+++ b/Pyext/src/ClientDoc.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #89 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/src/ClientDoc.hpp b/Pyext/src/ClientDoc.hpp
index 724f58e..f9618db 100644
--- a/Pyext/src/ClientDoc.hpp
+++ b/Pyext/src/ClientDoc.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #32 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/src/DefsDoc.cpp b/Pyext/src/DefsDoc.cpp
index d19c7fe..bcc5c21 100644
--- a/Pyext/src/DefsDoc.cpp
+++ b/Pyext/src/DefsDoc.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #73 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/src/DefsDoc.hpp b/Pyext/src/DefsDoc.hpp
index 56dc881..d22a5b1 100644
--- a/Pyext/src/DefsDoc.hpp
+++ b/Pyext/src/DefsDoc.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #18 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/src/EcfExt.cpp b/Pyext/src/EcfExt.cpp
index 263710b..1bb5509 100644
--- a/Pyext/src/EcfExt.cpp
+++ b/Pyext/src/EcfExt.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #17 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/src/ExportClient.cpp b/Pyext/src/ExportClient.cpp
index d062107..e28e5f3 100644
--- a/Pyext/src/ExportClient.cpp
+++ b/Pyext/src/ExportClient.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #85 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -146,6 +146,15 @@ void alter(ClientInvoker* self,
const std::string& name = "",
const std::string& value = "") { self->alter(path,alterType,attrType,name,value); }
+void alter_sorts(ClientInvoker* self,
+ const boost::python::list& list,
+ const std::string& attribute_name,
+ bool recursive = true) {std::vector<std::string> paths;BoostPythonUtil::list_to_str_vec(list,paths);self->check(paths);self->alter_sort(paths,attribute_name,recursive); }
+void alter_sort(ClientInvoker* self,
+ const std::string& path,
+ const std::string& attribute_name,
+ bool recursive = true) {self->alter_sort(std::vector<std::string>(1,path),attribute_name,recursive ); }
+
void set_child_pid(ClientInvoker* self,int pid) { self->set_child_pid( boost::lexical_cast<std::string>(pid)); }
@@ -219,6 +228,8 @@ void export_Client()
.def("plug" , &ClientInvoker::plug, ClientDoc::plug())
.def("alter" , &alters,(bp::arg("paths"),bp::arg("alter_type"),bp::arg("attribute_type"),bp::arg("name")="",bp::arg("value")=""), ClientDoc::alter())
.def("alter" , &alter,(bp::arg("abs_node_path"),bp::arg("alter_type"),bp::arg("attribute_type"),bp::arg("name")="",bp::arg("value")=""))
+ .def("sort_attributes" , &alter_sort,(bp::arg("abs_node_path"),bp::arg("attribute_name"),bp::arg("recursive")=true))
+ .def("sort_attributes" , &alter_sorts,(bp::arg("paths"),bp::arg("attribute_name"),bp::arg("recursive")=true))
.def("force_event" , &force_event, ClientDoc::force_event())
.def("force_event" , &force_events)
.def("force_state" , &force_state, ClientDoc::force_state())
diff --git a/Pyext/src/ExportCore.cpp b/Pyext/src/ExportCore.cpp
index 5e8bf9e..bdecdf3 100644
--- a/Pyext/src/ExportCore.cpp
+++ b/Pyext/src/ExportCore.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #33 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/src/ExportDefs.cpp b/Pyext/src/ExportDefs.cpp
index 3384245..cbe0af6 100644
--- a/Pyext/src/ExportDefs.cpp
+++ b/Pyext/src/ExportDefs.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #93 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -148,6 +148,17 @@ defs_ptr add_variable_dict(defs_ptr self,const boost::python::dict& dict) {
void delete_variable(defs_ptr self,const std::string& name) { self->set_server().delete_user_variable(name);}
+void sort_attributes(defs_ptr self,const std::string& attribute_name, bool recursive){
+ std::string attribute = attribute_name; boost::algorithm::to_lower(attribute);
+ ecf::Attr::Type attr = Attr::to_attr(attribute_name);
+ if (attr == ecf::Attr::UNKNOWN) {
+ std::stringstream ss; ss << "sort_attributes: the attribute " << attribute_name << " is not valid";
+ throw std::runtime_error(ss.str());
+ }
+ self->sort_attributes(attr,recursive);
+}
+
+
void export_Defs()
{
class_<Defs,defs_ptr >( "Defs", DefsDoc::add_definition_doc() ,init<>("Create a empty Defs"))
@@ -165,6 +176,8 @@ void export_Defs()
.def("add_variable", &add_variable_int)
.def("add_variable", &add_variable_var)
.def("add_variable", &add_variable_dict)
+ .def("sort_attributes", &sort_attributes,(bp::arg("attribute_type"),bp::arg("recursive")=true))
+ .def("sort_attributes", &Defs::sort_attributes,(bp::arg("attribute_type"),bp::arg("recursive")=true))
.def("delete_variable", &delete_variable,"An empty string will delete all user variables")
.def("find_suite", &Defs::findSuite,"Given a name, find the corresponding :term:`suite`")
.def("find_abs_node", &Defs::findAbsNode,"Given a path, find the the :term:`node`")
diff --git a/Pyext/src/ExportNode.cpp b/Pyext/src/ExportNode.cpp
index f9cfdd2..c14e784 100644
--- a/Pyext/src/ExportNode.cpp
+++ b/Pyext/src/ExportNode.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #85 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -115,6 +115,16 @@ node_ptr add_part_complete_2(node_ptr self,const std::string& expression, bool a
bool evaluate_trigger(node_ptr self) { Ast* t = self->triggerAst(); if (t) return t->evaluate();return false;}
bool evaluate_complete(node_ptr self) { Ast* t = self->completeAst(); if (t) return t->evaluate();return false;}
+void sort_attributes(node_ptr self,const std::string& attribute_name, bool recursive){
+ std::string attribute = attribute_name; boost::algorithm::to_lower(attribute);
+ ecf::Attr::Type attr = Attr::to_attr(attribute_name);
+ if (attr == ecf::Attr::UNKNOWN) {
+ std::stringstream ss; ss << "sort_attributes: the attribute " << attribute_name << " is not valid";
+ throw std::runtime_error(ss.str());
+ }
+ self->sort_attributes(attr,recursive);
+}
+
static job_creation_ctrl_ptr makeJobCreationCtrl() { return boost::make_shared<JobCreationCtrl>();}
std::vector<node_ptr> get_all_nodes(node_ptr self){ std::vector<node_ptr> nodes; self->get_all_nodes(nodes); return nodes; }
@@ -300,6 +310,8 @@ void export_Node()
.def("delete_zombie", &Node::delete_zombie )
.def("change_trigger", &Node::changeTrigger )
.def("change_complete", &Node::changeComplete )
+ .def("sort_attributes", &Node::sort_attributes,(bp::arg("attribute_type"),bp::arg("recursive")=true))
+ .def("sort_attributes", &sort_attributes,(bp::arg("attribute_type"),bp::arg("recursive")=true))
.def("get_abs_node_path", &Node::absNodePath, DefsDoc::abs_node_path_doc())
.def("has_time_dependencies", &Node::hasTimeDependencies)
.def("update_generated_variables", &Node::update_generated_variables)
diff --git a/Pyext/src/ExportNodeAttr.cpp b/Pyext/src/ExportNodeAttr.cpp
index 16a7a41..a2ac07d 100644
--- a/Pyext/src/ExportNodeAttr.cpp
+++ b/Pyext/src/ExportNodeAttr.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #53 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -33,6 +33,7 @@
#include "ZombieAttr.hpp"
#include "NodeAttrDoc.hpp"
#include "BoostPythonUtil.hpp"
+#include "Attr.hpp"
using namespace ecf;
using namespace boost::python;
@@ -143,6 +144,14 @@ void export_NodeAttr()
.value("complete",Child::COMPLETE)
;
+ enum_<Attr::Type>("AttrType", "Sortable attribute type, currently [event | meter | label | limit | variable ]")
+ .value("event", Attr::EVENT)
+ .value("meter", Attr::METER)
+ .value("label", Attr::LABEL)
+ .value("limit", Attr::LIMIT)
+ .value("variable",Attr::VARIABLE)
+ ;
+
// ZombieAttr(ecf::Child::ZombieType t, const std::vector<ecf::Child::CmdType>& c, ecf::User::Action a, int zombie_lifetime);
class_<ZombieAttr>("ZombieAttr",NodeAttrDoc::zombie_doc())
.def("__init__",make_constructor(&create_ZombieAttr) )
@@ -214,7 +223,8 @@ void export_NodeAttr()
.def("__copy__", copyObject<Event>) // __copy__ uses copy constructor
.def("name", &Event::name, return_value_policy<copy_const_reference>(), "Return the Events name as string. If number supplied name may be empty.")
.def("number", &Event::number, "Return events number as a integer. if not specified return max integer value")
- .def("value", &Event::value, "Return events current value")
+ .def("name_or_number",&Event::name_or_number,"returns name or number as an integer")
+ .def("value", &Event::value, "Return events current value")
.def("empty", &Event::empty, "Return true if the Event is empty. Used when returning a NULL Event, from a find")
;
diff --git a/Pyext/src/ExportSuiteAndFamily.cpp b/Pyext/src/ExportSuiteAndFamily.cpp
index eff5ff4..b3b940f 100644
--- a/Pyext/src/ExportSuiteAndFamily.cpp
+++ b/Pyext/src/ExportSuiteAndFamily.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #85 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/src/ExportTask.cpp b/Pyext/src/ExportTask.cpp
index ab612d0..0f1510d 100644
--- a/Pyext/src/ExportTask.cpp
+++ b/Pyext/src/ExportTask.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #85 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/src/NodeAttrDoc.cpp b/Pyext/src/NodeAttrDoc.cpp
index 717430e..88c1717 100644
--- a/Pyext/src/NodeAttrDoc.cpp
+++ b/Pyext/src/NodeAttrDoc.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #36 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/src/NodeAttrDoc.hpp b/Pyext/src/NodeAttrDoc.hpp
index d4e7e69..ea11c3a 100644
--- a/Pyext/src/NodeAttrDoc.hpp
+++ b/Pyext/src/NodeAttrDoc.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/CleanupOnlineTutorial.py b/Pyext/test/CleanupOnlineTutorial.py
index bfa1f4e..197e0c2 100644
--- a/Pyext/test/CleanupOnlineTutorial.py
+++ b/Pyext/test/CleanupOnlineTutorial.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/TestEmbeddedEcf.cpp b/Pyext/test/TestEmbeddedEcf.cpp
index ab71940..270ff88 100644
--- a/Pyext/test/TestEmbeddedEcf.cpp
+++ b/Pyext/test/TestEmbeddedEcf.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/data/CUSTOMER/ECF_HOME/includes/head.h b/Pyext/test/data/CUSTOMER/ECF_HOME/includes/head.h
new file mode 100644
index 0000000..04aa932
--- /dev/null
+++ b/Pyext/test/data/CUSTOMER/ECF_HOME/includes/head.h
@@ -0,0 +1,29 @@
+#!/bin/ksh
+set -e # stop the shell on first error
+set -u # fail when using an undefined variable
+set -x # echo script lines as they are executed
+
+# Defines the variables that are needed for any communication with ECF
+export ECF_PORT=%ECF_PORT% # The server port number
+export ECF_HOST=%ECF_HOST% # The name of ecf host that issued this task
+export ECF_NAME=%ECF_NAME% # The name of this current task
+export ECF_PASS=%ECF_PASS% # A unique password
+export ECF_TRYNO=%ECF_TRYNO% # Current try number of the task
+export ECF_RID=$$
+
+# Tell ecFlow we have started
+%ECF_CLIENT_EXE_PATH:ecflow_client% --init=$$
+
+# Defined a error handler
+ERROR() {
+ set +e # Clear -e flag, so we don't fail
+ %ECF_CLIENT_EXE_PATH:ecflow_client% --abort=trap # Notify ecFlow that something went wrong, using 'trap' as the reason
+ trap 0 # Remove the trap
+ exit 0 # End the script
+}
+
+# Trap any calls to exit and errors caught by the -e flag
+trap ERROR 0
+
+# Trap any signal that may cause the script to fail
+trap '{ echo "Killed by a signal"; ERROR ; }' 1 2 3 4 5 6 7 8 10 12 13 15
diff --git a/Pyext/test/data/CUSTOMER/ECF_HOME/includes/tail.h b/Pyext/test/data/CUSTOMER/ECF_HOME/includes/tail.h
new file mode 100644
index 0000000..ca0f8da
--- /dev/null
+++ b/Pyext/test/data/CUSTOMER/ECF_HOME/includes/tail.h
@@ -0,0 +1,3 @@
+%ECF_CLIENT_EXE_PATH:ecflow_client% --complete # Notify ecFlow of a normal end
+trap 0 # Remove all traps
+exit 0 # End the shell
diff --git a/Pyext/test/data/CUSTOMER/ECF_HOME/obs/anon/t1.ecf b/Pyext/test/data/CUSTOMER/ECF_HOME/obs/anon/t1.ecf
new file mode 100644
index 0000000..93b95c8
--- /dev/null
+++ b/Pyext/test/data/CUSTOMER/ECF_HOME/obs/anon/t1.ecf
@@ -0,0 +1,25 @@
+%include <head.h>
+%manual
+This is the default **generated** ecf script file
+If the task has events, meters or labels then the associated client
+to server commands are automatically generated.
+Will default to sleep for one second in between calls to the events, meters & labels,
+this can be overridden by adding a variable SLEEP
+%end
+
+%comment
+#============================================================
+# Using angle brackets means we look in directory ECF_INCLUDE
+# and then ECF_HOME
+#============================================================
+%end
+
+echo do some work
+
+
+
+sleep %SLEEP%
+
+echo end of job
+
+%include <tail.h>
diff --git a/Pyext/test/data/CUSTOMER/ECF_HOME/obs/anon/t2.ecf b/Pyext/test/data/CUSTOMER/ECF_HOME/obs/anon/t2.ecf
new file mode 100644
index 0000000..93b95c8
--- /dev/null
+++ b/Pyext/test/data/CUSTOMER/ECF_HOME/obs/anon/t2.ecf
@@ -0,0 +1,25 @@
+%include <head.h>
+%manual
+This is the default **generated** ecf script file
+If the task has events, meters or labels then the associated client
+to server commands are automatically generated.
+Will default to sleep for one second in between calls to the events, meters & labels,
+this can be overridden by adding a variable SLEEP
+%end
+
+%comment
+#============================================================
+# Using angle brackets means we look in directory ECF_INCLUDE
+# and then ECF_HOME
+#============================================================
+%end
+
+echo do some work
+
+
+
+sleep %SLEEP%
+
+echo end of job
+
+%include <tail.h>
diff --git a/Pyext/test/data/CUSTOMER/ECF_HOME/obs/f1/t.ecf b/Pyext/test/data/CUSTOMER/ECF_HOME/obs/f1/t.ecf
new file mode 100644
index 0000000..93b95c8
--- /dev/null
+++ b/Pyext/test/data/CUSTOMER/ECF_HOME/obs/f1/t.ecf
@@ -0,0 +1,25 @@
+%include <head.h>
+%manual
+This is the default **generated** ecf script file
+If the task has events, meters or labels then the associated client
+to server commands are automatically generated.
+Will default to sleep for one second in between calls to the events, meters & labels,
+this can be overridden by adding a variable SLEEP
+%end
+
+%comment
+#============================================================
+# Using angle brackets means we look in directory ECF_INCLUDE
+# and then ECF_HOME
+#============================================================
+%end
+
+echo do some work
+
+
+
+sleep %SLEEP%
+
+echo end of job
+
+%include <tail.h>
diff --git a/Pyext/test/data/CUSTOMER/ECF_HOME/obs/f1/t1.ecf b/Pyext/test/data/CUSTOMER/ECF_HOME/obs/f1/t1.ecf
new file mode 100644
index 0000000..b8d8a0f
--- /dev/null
+++ b/Pyext/test/data/CUSTOMER/ECF_HOME/obs/f1/t1.ecf
@@ -0,0 +1,26 @@
+%include <head.h>
+%manual
+This is the default **generated** ecf script file
+If the task has events, meters or labels then the associated client
+to server commands are automatically generated.
+Will default to sleep for one second in between calls to the events, meters & labels,
+this can be overridden by adding a variable SLEEP
+%end
+
+%comment
+#============================================================
+# Using angle brackets means we look in directory ECF_INCLUDE
+# and then ECF_HOME
+#============================================================
+%end
+
+echo do some work
+%ECF_CLIENT_EXE_PATH:ecflow_client% --event=event
+sleep %SLEEP%
+
+
+
+
+echo end of job
+
+%include <tail.h>
diff --git a/Pyext/test/data/includes/head.h b/Pyext/test/data/includes/head.h
index 34e6a0a..e517d43 100755
--- a/Pyext/test/data/includes/head.h
+++ b/Pyext/test/data/includes/head.h
@@ -4,7 +4,7 @@ set -e # stop the shell on first error
set -u # fail when using an undefined variable
set -x # echo script lines as they are executed
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/ecflow_test_util.py b/Pyext/test/ecflow_test_util.py
index 3328ddc..947c839 100644
--- a/Pyext/test/ecflow_test_util.py
+++ b/Pyext/test/ecflow_test_util.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_s_TestClientApi.py b/Pyext/test/py_s_TestClientApi.py
index b3a4358..4ac8f39 100644
--- a/Pyext/test/py_s_TestClientApi.py
+++ b/Pyext/test/py_s_TestClientApi.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
@@ -773,6 +773,87 @@ def test_client_get_file(ci):
def test_client_plug(ci):
pass
+def test_client_alter_sort(ci):
+ print("test_client_alter_sort")
+ ci.delete_all()
+
+ defs = create_defs("test_client_alter_sort")
+ t1 = "/test_client_alter_sort/f1/t1"
+ task_t1 = defs.find_abs_node(t1)
+ task_t1.add_variable("z","value").add_variable("y","value").add_variable("x","value")
+ task_t1.add_event("z").add_event("y").add_event("x")
+ task_t1.add_meter("z",0,100,100).add_meter("y",0,100,100).add_meter("x",0,100,100)
+ task_t1.add_label("z","name").add_label("y","name").add_label("x","name")
+ task_t1.add_limit("z",10).add_limit("y",10).add_limit("x",10)
+
+ ci.load(defs)
+
+ ci.sort_attributes(t1,"variable")
+ ci.sort_attributes(t1,"event")
+ ci.sort_attributes(t1,"meter")
+ ci.sort_attributes(t1,"label")
+ ci.sort_attributes(t1,"limit")
+
+ ci.sync_local()
+ task_t1 = ci.get_defs().find_abs_node(t1)
+ assert( len(list(task_t1.variables))) == 3 ,"Expected 3 variable :\n" + str(ci.get_defs())
+ assert( len(list(task_t1.events))) == 3 ,"Expected 3 events :\n" + str(ci.get_defs())
+ assert( len(list(task_t1.meters))) == 3 ,"Expected 3 meters :\n" + str(ci.get_defs())
+ assert( len(list(task_t1.labels))) == 3 ,"Expected 3 labels :\n" + str(ci.get_defs())
+ assert( len(list(task_t1.limits))) == 3 ,"Expected 3 limits :\n" + str(ci.get_defs())
+ expected = ['x','y','z']; vactual = []; eactual = []; mactual = []; lactual = []; liactual = [];
+ for v in task_t1.variables: vactual.append(v.name())
+ for v in task_t1.events: eactual.append(v.name())
+ for v in task_t1.meters: mactual.append(v.name())
+ for v in task_t1.labels: lactual.append(v.name())
+ for v in task_t1.limits: liactual.append(v.name())
+ assert expected == vactual, "variable Attributes not sorted, expected:" + str(expected) + " but found:" + str(vactual)
+ assert expected == eactual, "event Attributes not sorted, expected:" + str(expected) + " but found:" + str(eactual)
+ assert expected == mactual, "meter Attributes not sorted, expected:" + str(expected) + " but found:" + str(mactual)
+ assert expected == lactual, "label Attributes not sorted, expected:" + str(expected) + " but found:" + str(lactual)
+ assert expected == liactual,"limit Attributes not sorted, expected:" + str(expected) + " but found:" + str(liactual)
+
+def test_client_alter_sort_defs(ci):
+ print("test_client_alter_sort_defs")
+ ci.delete_all()
+
+ defs = create_defs("test_client_alter_sort_defs")
+ t1 = "/test_client_alter_sort_defs/f1/t1"
+ task_t1 = defs.find_abs_node(t1)
+ task_t1.add_variable("z","value").add_variable("y","value").add_variable("x","value")
+ task_t1.add_event("z").add_event("y").add_event("x")
+ task_t1.add_meter("z",0,100,100).add_meter("y",0,100,100).add_meter("x",0,100,100)
+ task_t1.add_label("z","name").add_label("y","name").add_label("x","name")
+ task_t1.add_limit("z",10).add_limit("y",10).add_limit("x",10)
+
+ ci.load(defs)
+
+ ci.sort_attributes("/","variable",True)
+ ci.sort_attributes("/","event",True)
+ ci.sort_attributes("/","meter",True)
+ ci.sort_attributes("/","label",True)
+ ci.sort_attributes("/","limit",True)
+
+ ci.sync_local()
+ task_t1 = ci.get_defs().find_abs_node(t1)
+ assert( len(list(task_t1.variables))) == 3 ,"Expected 3 variable :\n" + str(ci.get_defs())
+ assert( len(list(task_t1.events))) == 3 ,"Expected 3 events :\n" + str(ci.get_defs())
+ assert( len(list(task_t1.meters))) == 3 ,"Expected 3 meters :\n" + str(ci.get_defs())
+ assert( len(list(task_t1.labels))) == 3 ,"Expected 3 labels :\n" + str(ci.get_defs())
+ assert( len(list(task_t1.limits))) == 3 ,"Expected 3 limits :\n" + str(ci.get_defs())
+ expected = ['x','y','z']; vactual = []; eactual = []; mactual = []; lactual = []; liactual = [];
+ for v in task_t1.variables: vactual.append(v.name())
+ for v in task_t1.events: eactual.append(v.name())
+ for v in task_t1.meters: mactual.append(v.name())
+ for v in task_t1.labels: lactual.append(v.name())
+ for v in task_t1.limits: liactual.append(v.name())
+ assert expected == vactual, "variable Attributes not sorted, expected:" + str(expected) + " but found:" + str(vactual)
+ assert expected == eactual, "event Attributes not sorted, expected:" + str(expected) + " but found:" + str(eactual)
+ assert expected == mactual, "meter Attributes not sorted, expected:" + str(expected) + " but found:" + str(mactual)
+ assert expected == lactual, "label Attributes not sorted, expected:" + str(expected) + " but found:" + str(lactual)
+ assert expected == liactual,"limit Attributes not sorted, expected:" + str(expected) + " but found:" + str(liactual)
+
+
def test_client_alter_add(ci):
print("test_client_alter_add")
ci.delete_all()
@@ -1630,6 +1711,8 @@ if __name__ == "__main__":
test_client_get_file(ci)
#test_client_plug(ci)
+ test_client_alter_sort(ci)
+ test_client_alter_sort_defs(ci)
test_client_alter_add(ci)
test_client_alter_delete(ci)
test_client_alter_change(ci)
diff --git a/Pyext/test/py_s_TestPythonChildApi.py b/Pyext/test/py_s_TestPythonChildApi.py
index 3682a15..a6e4a61 100644
--- a/Pyext/test/py_s_TestPythonChildApi.py
+++ b/Pyext/test/py_s_TestPythonChildApi.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestAddDelete.py b/Pyext/test/py_u_TestAddDelete.py
index 32e26ff..7b984ea 100644
--- a/Pyext/test/py_u_TestAddDelete.py
+++ b/Pyext/test/py_u_TestAddDelete.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
@@ -16,6 +16,8 @@
import ecflow
import sys
import os
+import copy
+import unittest # for assertItemsEqual
if __name__ == "__main__":
@@ -26,16 +28,26 @@ if __name__ == "__main__":
print("####################################################################")
#===========================================================================
- # Defs: add and delete *USER* variables
+ # Defs: add, delete and sort *USER* variables, use set(a).intersection(b) to compare lists
#===========================================================================
defs = ecflow.Defs()
- defs.add_variable("FRED", "/tmp/")
- defs.add_variable("ECF_URL_CMD", "${BROWSER:=firefox} -remote 'openURL(%ECF_URL_BASE%/%ECF_URL%)'")
- defs.add_variable("ECF_URL_BASE", "http://www.ecmwf.int")
- defs.add_variable("ECF_URL", "publications/manuals/sms")
+ defs.add_variable("ZFRED", "/tmp/")
+ defs.add_variable("YECF_URL_CMD", "${BROWSER:=firefox} -remote 'openURL(%ECF_URL_BASE%/%ECF_URL%)'")
+ defs.add_variable("XECF_URL_BASE", "http://www.ecmwf.int")
+ defs.add_variable("AECF_URL", "publications/manuals/sms")
assert len(list(defs.user_variables)) == 4, "Expected *user* 4 variable"
- defs.delete_variable("FRED"); assert len(list(defs.user_variables)) == 3, "Expected 3 variables since we just delete FRED"
- defs.delete_variable(""); assert len(list(defs.user_variables)) == 0, "Expected 0 variables since we should have deleted all"
+
+ # sort
+ expected = ['AECF_URL','XECF_URL_BASE','YECF_URL_CMD','ZFRED']
+ actual = []
+ defs.sort_attributes("variable");
+ defs.sort_attributes(ecflow.AttrType.variable);
+ for v in defs.user_variables: actual.append(v.name())
+ assert actual == expected,"Attributes not sorted, expected:" + str(expected) + " but found:" + str(actual)
+
+
+ defs.delete_variable("ZFRED");assert len(list(defs.user_variables)) == 3, "Expected 3 variables since we just delete FRED"
+ defs.delete_variable(""); assert len(list(defs.user_variables)) == 0, "Expected 0 variables since we should have deleted all"
a_dict = { "name":"value", "name2":"value2", "name3":"value3", "name4":"value4" }
defs.add_variable(a_dict)
@@ -48,14 +60,23 @@ if __name__ == "__main__":
assert len(list(defs.user_variables)) == 0, "Expected zero variables"
#===========================================================================
- # Suite: add and delete variables
+ # Suite: add,delete and sort variables
#===========================================================================
suite = ecflow.Suite("s1")
suite.add_variable(ecflow.Variable("ECF_HOME", "/tmp/"))
- suite.add_variable("ECF_URL_CMD", "${BROWSER:=firefox} -remote 'openURL(%ECF_URL_BASE%/%ECF_URL%)'")
- suite.add_variable("ECF_URL_BASE", "http://www.ecmwf.int")
- suite.add_variable("ECF_URL", "publications/manuals/sms")
+ suite.add_variable("ZZZZZZ", "${BROWSER:=firefox} -remote 'openURL(%ECF_URL_BASE%/%ECF_URL%)'")
+ suite.add_variable("YYYYY", "http://www.ecmwf.int")
+ suite.add_variable("aaaa", "publications/manuals/sms")
assert len(list(suite.variables)) == 4, "Expected 4 variable"
+
+ # sort
+ expected = ['aaaa','ECF_HOME','YYYYY','ZZZZZZ']
+ actual = []
+ suite.sort_attributes("variable");
+ suite.sort_attributes(ecflow.AttrType.variable);
+ for v in suite.variables: actual.append(v.name())
+ assert set(expected).intersection(actual), "Attributes not sorted, expected:" + str(expected) + " but found:" + str(actual)
+
suite.delete_variable("ECF_HOME"); assert len(list(suite.variables)) == 3, "Expected 3 variable since we just delete ECF_HOME"
suite.delete_variable(""); assert len(list(suite.variables)) == 0, "Expected 0 variable since we should have deleted all"
@@ -85,15 +106,39 @@ if __name__ == "__main__":
#===========================================================================
- # add and delete limits
+ # add,delete and sort limits
#===========================================================================
+ suite.add_limit(ecflow.Limit("zlimitName1", 10))
+ suite.add_limit(ecflow.Limit("ylimitName2", 10))
+ suite.add_limit("xlimitName3", 10)
+ suite.add_limit("alimitName4", 10)
+ assert len(list(suite.limits)) == 4, "Expected 4 Limits"
+
+ # sort
+ expected = ['alimitName4','xlimitName3','ylimitName2','zlimitName1']
+ actual = []
+ suite.sort_attributes(ecflow.AttrType.limit);
+ suite.sort_attributes("limit");
+ for v in suite.limits: actual.append(v.name())
+ assert expected == actual, "Attributes not sorted, expected:" + str(expected) + " but found:" + str(actual)
+
+ suite.delete_limit("zlimitName1"); assert len(list(suite.limits)) == 3, "Expected 3 limits since we just deleted one limitName1"
+ suite.delete_limit(""); assert len(list(suite.limits)) == 0, "Expected 0 limits since we just deleted all of them"
+
+ # The following will fail, since the iterators are essentially read only,
+ # This is because we are using C++ vector iterators, hence we can't delete the vectors items, whilst traversing
+ # for limit in suite.limits: suite.delete_limit(limit.name())
+ # We can get round this by copy the limits first
suite.add_limit(ecflow.Limit("limitName1", 10))
suite.add_limit(ecflow.Limit("limitName2", 10))
suite.add_limit("limitName3", 10)
suite.add_limit("limitName4", 10)
- assert len(list(suite.limits)) == 4, "Expected 4 Limits"
- suite.delete_limit("limitName1"); assert len(list(suite.limits)) == 3, "Expected 3 limits since we just deleted one limitName1"
- suite.delete_limit(""); assert len(list(suite.limits)) == 0, "Expected 0 limits since we just deleted all of them"
+ limit_names = []
+ for limit in suite.limits:
+ limit_names.append(limit.name())
+ for limit in limit_names:
+ suite.delete_limit(limit)
+ assert len(list(suite.limits)) == 0, "Expected 0 Limits,since we just deleted all of them, via iteration"
#===========================================================================
# Test Limit and node paths, ECFLOW-518
@@ -182,6 +227,14 @@ if __name__ == "__main__":
task.add_event(10, "Eventname2")
task.add_event("fred")
+ # sort
+ expected = ['1','2','Eventname','Eventname2','fred']
+ actual = []
+ task.sort_attributes("event");
+ task.sort_attributes(ecflow.AttrType.event);
+ for v in task.events: actual.append(v.name_or_number())
+ assert expected == actual, "Attributes not sorted, expected:" + str(expected) + " but found:" + str(actual)
+
# test find
event = task.find_event("EVENT")
assert(event.empty()),"Expected to not to find event"
@@ -227,28 +280,44 @@ if __name__ == "__main__":
#===========================================================================
# add and delete meter
#===========================================================================
- task.add_meter(ecflow.Meter("metername1", 0, 100, 50))
- task.add_meter(ecflow.Meter("metername2", 0, 100))
- task.add_meter("metername3", 0, 100, 50)
- task.add_meter("metername4", 0, 100)
+ task.add_meter(ecflow.Meter("zzzz", 0, 100, 50))
+ task.add_meter(ecflow.Meter("yyyy", 0, 100))
+ task.add_meter("bbbb", 0, 100, 50)
+ task.add_meter("aaaa", 0, 100)
assert len(list(task.meters)) == 4, "Expected 4 Meters"
- task.delete_meter("metername1"); assert len(list(task.meters)) == 3, "Expected 3 Meters"
- task.delete_meter("metername4"); assert len(list(task.meters)) == 2, "Expected 2 Meters"
- task.delete_meter(""); assert len(list(task.meters)) == 0, "Expected 0 Meters"
-
+
+ # sort
+ expected = ['aaaa','bbbb','yyyy','zzzz']
+ actual = []
+ task.sort_attributes(ecflow.AttrType.meter);
+ task.sort_attributes("meter");
+ for v in task.meters: actual.append(v.name())
+ assert expected == actual, "Attributes not sorted, expected:" + str(expected) + " but found:" + str(actual)
+
+ task.delete_meter("zzzz"); assert len(list(task.meters)) == 3, "Expected 3 Meters"
+ task.delete_meter("yyyy"); assert len(list(task.meters)) == 2, "Expected 2 Meters"
+ task.delete_meter(""); assert len(list(task.meters)) == 0, "Expected 0 Meters"
#===========================================================================
# add and delete label
#===========================================================================
- task.add_label(ecflow.Label("label_name1", "value"))
- task.add_label(ecflow.Label("label_name2", "value"))
- task.add_label("label_name3", "value")
- task.add_label("label_name4", "value")
+ task.add_label(ecflow.Label("labela", "value"))
+ task.add_label(ecflow.Label("labelb", "value"))
+ task.add_label("labelc", "value")
+ task.add_label("labeld", "value")
assert len(list(task.labels)) == 4, "Expected 4 labels"
- task.delete_label("label_name1"); assert len(list(task.labels)) == 3, "Expected 3 Labels"
- task.delete_label("label_name4"); assert len(list(task.labels)) == 2, "Expected 2 Labels"
- task.delete_label(""); assert len(list(task.labels)) == 0, "Expected 0 Labels"
-
+
+ # sort
+ expected = ['labela','labelb','labelc','labeld']
+ actual = []
+ task.sort_attributes("label");
+ task.sort_attributes(ecflow.AttrType.label);
+ for v in task.labels: actual.append(v.name())
+ assert expected == actual, "Attributes not sorted, expected:" + str(expected) + " but found:" + str(actual)
+
+ task.delete_label("labela"); assert len(list(task.labels)) == 3, "Expected 3 Labels"
+ task.delete_label("labelb"); assert len(list(task.labels)) == 2, "Expected 2 Labels"
+ task.delete_label(""); assert len(list(task.labels)) == 0, "Expected 0 Labels"
#===========================================================================
# add delete Repeat
diff --git a/Pyext/test/py_u_TestAddDeleteError.py b/Pyext/test/py_u_TestAddDeleteError.py
index 596817e..0acf980 100644
--- a/Pyext/test/py_u_TestAddDeleteError.py
+++ b/Pyext/test/py_u_TestAddDeleteError.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestAddDeleteFunc.py b/Pyext/test/py_u_TestAddDeleteFunc.py
index bfd10f8..ea3e2ad 100644
--- a/Pyext/test/py_u_TestAddDeleteFunc.py
+++ b/Pyext/test/py_u_TestAddDeleteFunc.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestAddNodeFunc.py b/Pyext/test/py_u_TestAddNodeFunc.py
index b2910ca..ff9ba1c 100644
--- a/Pyext/test/py_u_TestAddNodeFunc.py
+++ b/Pyext/test/py_u_TestAddNodeFunc.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
@@ -16,7 +16,6 @@ def create_defs_sequentially():
local_defs = Defs()
suite = local_defs.add_suite("s1")
suite.add_variable("Var","value")
- suite.add_trigger("t1 == complete")
suite.add_meter( "metername3", 0, 100, 50 )
suite.add_event( 2 )
suite.add_event( 3 )
@@ -41,7 +40,7 @@ def create_defs_functionally():
f_defs = Defs()
suite = f_defs.add_suite("s1")
suite.add_variable("Var","value").add_family("f1").add_family("f1").add_task("t1").add_variable("fred","jones")
- suite.add_trigger("t1 == complete").add_family("f2").add_family("f1").add_task("t1").add_variable("fred","jones")
+ suite.add_family("f2").add_family("f1").add_task("t1").add_variable("fred","jones")
suite.add_meter( "metername3", 0, 100, 50 ).add_family("f3").add_task("t1").add_variable("fred","jones")
suite.add_event( 2 ).add_event( 3 ).add_task("t1").add_variable("fred","jones")
return f_defs
diff --git a/Pyext/test/py_u_TestAutoAddExtern.py b/Pyext/test/py_u_TestAutoAddExtern.py
new file mode 100644
index 0000000..1694f32
--- /dev/null
+++ b/Pyext/test/py_u_TestAutoAddExtern.py
@@ -0,0 +1,49 @@
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+# Name :
+# Author : Avi
+# Revision : $Revision: #10 $
+#
+# Copyright 2009-2017 ECMWF.
+# This software is licensed under the terms of the Apache Licence version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+# code for testing pointers and hierarchy in python
+
+from ecflow import Suite, Family, Task, Defs, Client, debug_build
+
+def check_then_auto_add_extern(defs):
+ error_msg = defs.check()
+ print error_msg
+ assert len(error_msg) !=0,"Expect error in checks\n" + str(defs)
+
+ defs.auto_add_externs(True)
+ error_msg = defs.check()
+ assert len(error_msg) == 0,"Expect check to pass after auto add extern\n" + error_msg + "\n" + str(defs)
+
+if __name__ == "__main__":
+ print("####################################################################")
+ print("Running ecflow version " + Client().version() + " debug build(" + str(debug_build()) +")")
+ print("####################################################################")
+
+ defs = Defs()
+ error_msg = defs.check(); assert len(error_msg) == 0,"Expect empty defs to pass check"
+ suite = defs.add_suite("ext");
+
+ f1 = suite.add_family("f1")
+ f1.add_task("t").add_trigger("/a/b/c/d == complete"); check_then_auto_add_extern(defs)
+ f1.add_task("t1").add_trigger("/a/b/c/d/e:event == set"); check_then_auto_add_extern(defs)
+ f1.add_task("t2").add_trigger("/a/b/c/d/x:event"); check_then_auto_add_extern(defs)
+ f1.add_task("t3").add_trigger("/a/b/c/d/y:meter le 30"); check_then_auto_add_extern(defs)
+ f1.add_task("t4").add_trigger("/a/b/c/d/z<flag>late"); check_then_auto_add_extern(defs)
+
+ f2 = suite.add_family("f2")
+ f2.add_inlimit("hpcd","limits"); check_then_auto_add_extern(defs)
+ f2.add_task("t").add_inlimit("sg1","/suiteName"); check_then_auto_add_extern(defs)
+ f2.add_task("t1").add_inlimit("hpcd","/obs/limits"); check_then_auto_add_extern(defs)
+ f2.add_task("t2").add_inlimit("c1a","/limits"); check_then_auto_add_extern(defs)
+ print defs
+ print("All Tests pass")
diff --git a/Pyext/test/py_u_TestCopy.py b/Pyext/test/py_u_TestCopy.py
index 8133ff9..7335c1c 100644
--- a/Pyext/test/py_u_TestCopy.py
+++ b/Pyext/test/py_u_TestCopy.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestDefs.py b/Pyext/test/py_u_TestDefs.py
index 6418ec3..f45580e 100644
--- a/Pyext/test/py_u_TestDefs.py
+++ b/Pyext/test/py_u_TestDefs.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestDefsCheck.py b/Pyext/test/py_u_TestDefsCheck.py
index 84c3808..387ef1b 100644
--- a/Pyext/test/py_u_TestDefsCheck.py
+++ b/Pyext/test/py_u_TestDefsCheck.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestDerivable.py b/Pyext/test/py_u_TestDerivable.py
index ee7015f..f4b0e58 100644
--- a/Pyext/test/py_u_TestDerivable.py
+++ b/Pyext/test/py_u_TestDerivable.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestEcf.py b/Pyext/test/py_u_TestEcf.py
index 3c33868..d995634 100644
--- a/Pyext/test/py_u_TestEcf.py
+++ b/Pyext/test/py_u_TestEcf.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestError.py b/Pyext/test/py_u_TestError.py
index e0c2693..b80fb1c 100644
--- a/Pyext/test/py_u_TestError.py
+++ b/Pyext/test/py_u_TestError.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
@@ -310,6 +310,49 @@ if __name__ == "__main__":
assert test_passed,"Adding day at the suite level should fail"
print("check adding day at the suite level: RuntimeError: ")
+ # =================================================================================
+ test_passed = False
+ try:
+ defs = Defs()
+ defs.add_suite("1").add_trigger("1 == 0")
+ except RuntimeError as e :
+ test_passed = True
+ pass
+ assert test_passed,"Adding a trigger at suite level should fail"
+ print("check adding trigger at the suite level: RuntimeError: ")
+
+ # =================================================================================
+ test_passed = False
+ try:
+ defs = Defs()
+ defs.add_suite("1").add_part_trigger("1 == 0")
+ except RuntimeError as e :
+ test_passed = True
+ pass
+ assert test_passed,"Adding a part trigger at suite level should fail"
+ print("check adding part trigger at the suite level: RuntimeError: ")
+
+ # =================================================================================
+ test_passed = False
+ try:
+ defs = Defs()
+ defs.add_suite("1").add_complete("1 == 0")
+ except RuntimeError as e :
+ test_passed = True
+ pass
+ assert test_passed,"Adding a complete trigger at suite level should fail"
+ print("check adding complete trigger at the suite level: RuntimeError: ")
+
+ # =================================================================================
+ test_passed = False
+ try:
+ defs = Defs()
+ defs.add_suite("1").add_part_complete("1 == 0")
+ except RuntimeError as e :
+ test_passed = True
+ pass
+ assert test_passed,"Adding a part complete trigger at suite level should fail"
+ print("check adding part complete trigger at the suite level: RuntimeError: ")
# =================================================================================
print("check duplicate family not allowed")
diff --git a/Pyext/test/py_u_TestFind.py b/Pyext/test/py_u_TestFind.py
index bd8a207..1bdf572 100644
--- a/Pyext/test/py_u_TestFind.py
+++ b/Pyext/test/py_u_TestFind.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestFlag.py b/Pyext/test/py_u_TestFlag.py
index b5b5918..58a6e35 100644
--- a/Pyext/test/py_u_TestFlag.py
+++ b/Pyext/test/py_u_TestFlag.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestGeneratedVariable.py b/Pyext/test/py_u_TestGeneratedVariable.py
index 11d5389..c2c7c0a 100644
--- a/Pyext/test/py_u_TestGeneratedVariable.py
+++ b/Pyext/test/py_u_TestGeneratedVariable.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestGetAllTasks.py b/Pyext/test/py_u_TestGetAllTasks.py
index f5f1cdd..6f4c842 100644
--- a/Pyext/test/py_u_TestGetAllTasks.py
+++ b/Pyext/test/py_u_TestGetAllTasks.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestJobGeneration.py b/Pyext/test/py_u_TestJobGeneration.py
index 8b099e5..9e33ef8 100644
--- a/Pyext/test/py_u_TestJobGeneration.py
+++ b/Pyext/test/py_u_TestJobGeneration.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestParent.py b/Pyext/test/py_u_TestParent.py
index a6fa838..4285346 100644
--- a/Pyext/test/py_u_TestParent.py
+++ b/Pyext/test/py_u_TestParent.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestRemove.py b/Pyext/test/py_u_TestRemove.py
index c79fd22..de09598 100644
--- a/Pyext/test/py_u_TestRemove.py
+++ b/Pyext/test/py_u_TestRemove.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestRepeatArithmetic.py b/Pyext/test/py_u_TestRepeatArithmetic.py
index a554881..638596c 100644
--- a/Pyext/test/py_u_TestRepeatArithmetic.py
+++ b/Pyext/test/py_u_TestRepeatArithmetic.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestSimulator.py b/Pyext/test/py_u_TestSimulator.py
index abe6e89..b0b49a0 100644
--- a/Pyext/test/py_u_TestSimulator.py
+++ b/Pyext/test/py_u_TestSimulator.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http:#www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
@@ -75,7 +75,7 @@ def simulate_deadlock():
os.remove("defs.flat")
def test_time_series():
- print "Simulator:: ...test_time_series";
+ print ("Simulator:: ...test_time_series")
# suite suite
# clock real <sunday>
@@ -117,9 +117,9 @@ if __name__ == "__main__":
# traverse the CSim test data, make sure python simulation matches c++
workspace_dir = Test.get_root_source_dir()
csim_test_data = workspace_dir + "/CSim/test/data/good_defs"
- print csim_test_data
+ print (csim_test_data)
for path in Test.all_files(csim_test_data,'*.def'):
- print path
+ print (path)
theDefs = ecflow.Defs(path)
theResult = theDefs.simulate()
assert len(theResult) == 0, "Expected simulation to return without any errors, but found:\n" + theResult
diff --git a/Pyext/test/py_u_TestTraversal.py b/Pyext/test/py_u_TestTraversal.py
index f751a42..2f89150 100644
--- a/Pyext/test/py_u_TestTraversal.py
+++ b/Pyext/test/py_u_TestTraversal.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestUserManual.py b/Pyext/test/py_u_TestUserManual.py
index 306bcaa..f1e1c1c 100644
--- a/Pyext/test/py_u_TestUserManual.py
+++ b/Pyext/test/py_u_TestUserManual.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Pyext/test/py_u_TestWith.py b/Pyext/test/py_u_TestWith.py
index b308f50..4d8718e 100644
--- a/Pyext/test/py_u_TestWith.py
+++ b/Pyext/test/py_u_TestWith.py
@@ -3,7 +3,7 @@
# Author : Avi
# Revision : $Revision: #10 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Server/Jamfile.jam b/Server/Jamfile.jam
index a2a5116..86e9de7 100644
--- a/Server/Jamfile.jam
+++ b/Server/Jamfile.jam
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Server/server_environment.cfg b/Server/server_environment.cfg
index 73c4793..7379e27 100644
--- a/Server/server_environment.cfg
+++ b/Server/server_environment.cfg
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Server/src/CConnection.cpp b/Server/src/CConnection.cpp
index f8bf2f7..0ded88e 100644
--- a/Server/src/CConnection.cpp
+++ b/Server/src/CConnection.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Server/src/CConnection.hpp b/Server/src/CConnection.hpp
index 15f7b24..894748d 100644
--- a/Server/src/CConnection.hpp
+++ b/Server/src/CConnection.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Server/src/CheckPtSaver.cpp b/Server/src/CheckPtSaver.cpp
index 2472de2..063422f 100644
--- a/Server/src/CheckPtSaver.cpp
+++ b/Server/src/CheckPtSaver.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #43 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Server/src/CheckPtSaver.hpp b/Server/src/CheckPtSaver.hpp
index aaf3f49..b391c23 100644
--- a/Server/src/CheckPtSaver.hpp
+++ b/Server/src/CheckPtSaver.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Server/src/NodeTreeTraverser.cpp b/Server/src/NodeTreeTraverser.cpp
index 7e95157..1a445f0 100644
--- a/Server/src/NodeTreeTraverser.cpp
+++ b/Server/src/NodeTreeTraverser.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #101 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Server/src/NodeTreeTraverser.hpp b/Server/src/NodeTreeTraverser.hpp
index 965ae27..35b698f 100644
--- a/Server/src/NodeTreeTraverser.hpp
+++ b/Server/src/NodeTreeTraverser.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #26 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Server/src/Server.cpp b/Server/src/Server.cpp
index ca04a54..60d340f 100644
--- a/Server/src/Server.cpp
+++ b/Server/src/Server.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #173 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -151,7 +151,8 @@ std::string Server::get_password() const
return contents;
}
else {
- std::stringstream ss; ss << "Server::get_password file " << passwd_file << " exists, but can't be opened";
+ std::stringstream ss;
+ ss << "Server::get_password file " << passwd_file << " exists, but can't be opened (" << strerror(errno) << ")";
throw std::runtime_error(ss.str());
}
}
diff --git a/Server/src/Server.hpp b/Server/src/Server.hpp
index be616e2..7571294 100644
--- a/Server/src/Server.hpp
+++ b/Server/src/Server.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #62 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Server/src/ServerEnvironment.cpp b/Server/src/ServerEnvironment.cpp
index 672bfa4..205be67 100644
--- a/Server/src/ServerEnvironment.cpp
+++ b/Server/src/ServerEnvironment.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #95 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Server/src/ServerEnvironment.hpp b/Server/src/ServerEnvironment.hpp
index f73ad87..ea71f80 100644
--- a/Server/src/ServerEnvironment.hpp
+++ b/Server/src/ServerEnvironment.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #52 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Server/src/ServerMain.cpp b/Server/src/ServerMain.cpp
index ba04c62..b40b9b0 100644
--- a/Server/src/ServerMain.cpp
+++ b/Server/src/ServerMain.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #37 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Server/src/ServerOptions.cpp b/Server/src/ServerOptions.cpp
index f5be79b..32132fa 100644
--- a/Server/src/ServerOptions.cpp
+++ b/Server/src/ServerOptions.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #28 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -75,8 +75,11 @@ ServerOptions::ServerOptions( int argc, char* argv[],ServerEnvironment* env )
" This is then compared with list of users in the ecf.lists file.\n"
" If this file is empty, then no authentication is done.\n"
" Each server can potentially have a different list.\n"
- " The default is <host>.<port>.ecf.lists\n"
- " Note: Any settings will be prepended with <host>.<port>.\n"
+ " The default is <host>.<port>.ecf.lists if no ECF_LISTS is specified.\n"
+ " Note: If the path to a ecf.lists is specified as i.e /var/tmp/ecflow/ecf.lists\n"
+ " then no prefix is added, the path is kept as is.\n"
+ " However if 'ECF_LISTS=ecf.lists' then this matches the default, and the\n"
+ " server will expect <host>.<port>.ecf.lists \n"
"ECF_TASK_THRESHOLD:\n"
" The Job generation process is expected to take less than 60 seconds\n"
" This is used to aid debugging of task tasking excessive times for job generation\n"
diff --git a/Server/src/ServerOptions.hpp b/Server/src/ServerOptions.hpp
index ebd3df1..f471516 100644
--- a/Server/src/ServerOptions.hpp
+++ b/Server/src/ServerOptions.hpp
@@ -6,7 +6,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Server/test/TestServer1.cpp b/Server/test/TestServer1.cpp
index e4d1042..ef788ed 100644
--- a/Server/test/TestServer1.cpp
+++ b/Server/test/TestServer1.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -93,10 +93,14 @@ BOOST_AUTO_TEST_CASE( test_server )
{
cout << "Server:: ...test_server\n";
- // Create a unique port number, allowing debug and release,gun,cland,intil to run at the same time
- // Hence the lock file is not sufficient. Hence we will make a client server call.
+ // Create a unique port number, allowing debug and release,gnu,clang,intel to run at the same time
+ // Hence the lock file is not always sufficient.
+ // TEST_ECF_PORT should be unique among gnu,clang,intel, etc
std::string the_port1 = "3144" ;
+ char* test_ecf_port = getenv("TEST_ECF_PORT"); // from metabuilder, allow parallel tests
+ if ( test_ecf_port ) the_port1 = test_ecf_port;
cout << "Find free port to start server, starting with port " << the_port1 << "\n";
+
int the_port = boost::lexical_cast<int>(the_port1);
while (!EcfPortLock::is_free(the_port)) the_port++;
std::string port = boost::lexical_cast<std::string>(the_port);
diff --git a/Server/test/TestServerEnvironment.cpp b/Server/test/TestServerEnvironment.cpp
index f281526..a6b7258 100644
--- a/Server/test/TestServerEnvironment.cpp
+++ b/Server/test/TestServerEnvironment.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/DummyMain.cpp b/Test/DummyMain.cpp
index 945196d..3b2d080 100644
--- a/Test/DummyMain.cpp
+++ b/Test/DummyMain.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/Jamfile.jam b/Test/Jamfile.jam
index 18ed2a4..5f47365 100644
--- a/Test/Jamfile.jam
+++ b/Test/Jamfile.jam
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestAbortCmd.cpp b/Test/TestAbortCmd.cpp
index 92c558c..982e0ac 100644
--- a/Test/TestAbortCmd.cpp
+++ b/Test/TestAbortCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestAlias.cpp b/Test/TestAlias.cpp
index 6819b1a..0cc85f2 100644
--- a/Test/TestAlias.cpp
+++ b/Test/TestAlias.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestClkSync.cpp b/Test/TestClkSync.cpp
index 9a7ba1f..e3421c6 100644
--- a/Test/TestClkSync.cpp
+++ b/Test/TestClkSync.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #26 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestComplete.cpp b/Test/TestComplete.cpp
index a00fea8..91aa803 100644
--- a/Test/TestComplete.cpp
+++ b/Test/TestComplete.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #25 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -52,8 +52,16 @@ BOOST_AUTO_TEST_SUITE( TestSuite )
// **************************************************************************
BOOST_AUTO_TEST_CASE( test_complete )
{
+ // Added since in 4.6.0 no longer sets state if it has not changed.
+ if (getenv("ECF_DISABLE_TEST_FOR_OLD_SERVERS")) {
+ std::cout << "\n Disable test_complete for old server ,re-enable when 4.6.0 is minimum version\n";
+ return;
+ }
+
DurationTimer timer;
cout << "Test:: ...test_complete " << flush;
+
+
TestClean clean_at_start_and_end;
// Create the defs file corresponding to the text below
@@ -88,7 +96,7 @@ BOOST_AUTO_TEST_CASE( test_complete )
task_ptr task_check = fam->add_task("check");
task_check->addEvent( Event(1,eventName) );
- task_check->addVerify( VerifyAttr(NState::COMPLETE,4) );
+ task_check->addVerify( VerifyAttr(NState::COMPLETE,2) );
task_ptr task_t1 = fam->add_task("t1");
task_t1->add_trigger( "check == complete");
diff --git a/Test/TestCron.cpp b/Test/TestCron.cpp
index d5c2174..d8a3d48 100644
--- a/Test/TestCron.cpp
+++ b/Test/TestCron.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #30 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestCtsWaitCmd.cpp b/Test/TestCtsWaitCmd.cpp
index f309d78..e0c9c0d 100644
--- a/Test/TestCtsWaitCmd.cpp
+++ b/Test/TestCtsWaitCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestEcfNoScriptCmd.cpp b/Test/TestEcfNoScriptCmd.cpp
index 8416719..c6195c8 100644
--- a/Test/TestEcfNoScriptCmd.cpp
+++ b/Test/TestEcfNoScriptCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #25 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestEvents.cpp b/Test/TestEvents.cpp
index 721b2af..90b12b8 100644
--- a/Test/TestEvents.cpp
+++ b/Test/TestEvents.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #26 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestFileCmd.cpp b/Test/TestFileCmd.cpp
index 50bc194..574d2c1 100644
--- a/Test/TestFileCmd.cpp
+++ b/Test/TestFileCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #23 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestHandle.cpp b/Test/TestHandle.cpp
index 921e51f..7de74d3 100644
--- a/Test/TestHandle.cpp
+++ b/Test/TestHandle.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #22 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestKillCmd.cpp b/Test/TestKillCmd.cpp
index 9426d16..6581322 100644
--- a/Test/TestKillCmd.cpp
+++ b/Test/TestKillCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #25 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestLate.cpp b/Test/TestLate.cpp
index 553b824..ef7c1b4 100644
--- a/Test/TestLate.cpp
+++ b/Test/TestLate.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -63,6 +63,8 @@ BOOST_AUTO_TEST_CASE( test_late )
lateAttr.addComplete( ecf::TimeSlot(0,1), true);
task->addLate( lateAttr );
+
+ suite->add_task("t2")->add_trigger(task->absNodePath() + "<flag>late");
}
ServerTestHarness serverTestHarness;
@@ -73,12 +75,16 @@ BOOST_AUTO_TEST_CASE( test_late )
BOOST_CHECK_MESSAGE( TestFixture::client().defs(),"Expected defs");
node_ptr node = TestFixture::client().defs()->findAbsNode("/test_late/t1");
- BOOST_CHECK_MESSAGE( node,"Expected task to be found");
+ BOOST_REQUIRE_MESSAGE( node,"Expected task to be found");
ecf::LateAttr* late = node->get_late();
BOOST_CHECK_MESSAGE( late->isLate(),"Expected late to be set");
BOOST_CHECK_MESSAGE( node->flag().is_set(ecf::Flag::LATE),"Expected late flag to be set");
+ node_ptr t2 = TestFixture::client().defs()->findAbsNode("/test_late/t2");
+ BOOST_REQUIRE_MESSAGE( t2,"Expected task to be found");
+ BOOST_CHECK_MESSAGE( t2->state() == NState::COMPLETE,"Expected late trigger to work");
+
cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount() << ")\n";
}
diff --git a/Test/TestLimit.cpp b/Test/TestLimit.cpp
index 13b973c..a0de09f 100644
--- a/Test/TestLimit.cpp
+++ b/Test/TestLimit.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #25 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestOrderCmd.cpp b/Test/TestOrderCmd.cpp
index 2952bbe..1e9b867 100644
--- a/Test/TestOrderCmd.cpp
+++ b/Test/TestOrderCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestRepeat.cpp b/Test/TestRepeat.cpp
index 22e7c72..a390f91 100644
--- a/Test/TestRepeat.cpp
+++ b/Test/TestRepeat.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestRequeueNode.cpp b/Test/TestRequeueNode.cpp
index 646bd66..cb171d6 100644
--- a/Test/TestRequeueNode.cpp
+++ b/Test/TestRequeueNode.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #17 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestRunner.cpp b/Test/TestRunner.cpp
index d02da84..1760ca9 100644
--- a/Test/TestRunner.cpp
+++ b/Test/TestRunner.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestServer.cpp b/Test/TestServer.cpp
index 7ee9c59..68c0855 100644
--- a/Test/TestServer.cpp
+++ b/Test/TestServer.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #39 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestSingle.cpp b/Test/TestSingle.cpp
index f49fa17..67a822b 100644
--- a/Test/TestSingle.cpp
+++ b/Test/TestSingle.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #80 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestSuspend.cpp b/Test/TestSuspend.cpp
index f9162fc..560a696 100644
--- a/Test/TestSuspend.cpp
+++ b/Test/TestSuspend.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #24 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestToday.cpp b/Test/TestToday.cpp
index cf818fd..f7c8ec9 100644
--- a/Test/TestToday.cpp
+++ b/Test/TestToday.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #35 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestTrigger.cpp b/Test/TestTrigger.cpp
index faabff5..15efc04 100644
--- a/Test/TestTrigger.cpp
+++ b/Test/TestTrigger.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #29 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestWhyCmd.cpp b/Test/TestWhyCmd.cpp
index f522e5c..39d91a3 100644
--- a/Test/TestWhyCmd.cpp
+++ b/Test/TestWhyCmd.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #27 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/TestZombies.cpp b/Test/TestZombies.cpp
index 76d0b1e..8210c5b 100644
--- a/Test/TestZombies.cpp
+++ b/Test/TestZombies.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #58 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -470,6 +470,12 @@ static void create_and_start_test(Defs& theDefs, const std::string& suite_name,
else if (create_zombies_with == "delete") {
BOOST_CHECK_MESSAGE(z.type() == Child::USER || z.type() == Child::PATH,"Creating zombies via delete, Expected 'user | path' zombie type but got: " << z);
}
+ else if (create_zombies_with == "complete") {
+ BOOST_CHECK_MESSAGE(z.type() == Child::USER,"Expected 'user' zombie type but got: " << z);
+ }
+ else if (create_zombies_with == "aborted") {
+ BOOST_CHECK_MESSAGE(z.type() == Child::USER,"Expected 'user' zombie type but got: " << z);
+ }
else {
BOOST_CHECK_MESSAGE(z.type() == Child::ECF,"Expected 'ecf' zombie type but got: " << z);
}
@@ -750,10 +756,10 @@ BOOST_AUTO_TEST_CASE( test_zombies_attr_for_adopt )
#ifdef DO_TEST8
-BOOST_AUTO_TEST_CASE( test_ecf_zombie_creation_via_complete )
+BOOST_AUTO_TEST_CASE( test_user_zombie_creation_via_complete )
{
DurationTimer timer;
- std::string suite_name = "test_ecf_zombie_creation_via_complete";
+ std::string suite_name = "test_user_zombie_creation_via_complete";
cout << "Test:: ..." << suite_name << " " << flush;
TestClean clean_at_start_and_end;
@@ -776,10 +782,10 @@ BOOST_AUTO_TEST_CASE( test_ecf_zombie_creation_via_complete )
#endif
#ifdef DO_TEST9
-BOOST_AUTO_TEST_CASE( test_ecf_zombie_creation_via_abort )
+BOOST_AUTO_TEST_CASE( test_user_zombie_creation_via_abort )
{
DurationTimer timer;
- std::string suite_name = "test_ecf_zombie_creation_via_abort";
+ std::string suite_name = "test_user_zombie_creation_via_abort";
cout << "Test:: ..." << suite_name << " " << flush;
TestClean clean_at_start_and_end;
diff --git a/Test/Test_ECF_SCRIPT_CMD.cpp b/Test/Test_ECF_SCRIPT_CMD.cpp
index 43f5fdb..e4d7fad 100644
--- a/Test/Test_ECF_SCRIPT_CMD.cpp
+++ b/Test/Test_ECF_SCRIPT_CMD.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #25 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/Test_Time.cpp b/Test/Test_Time.cpp
index 01e5263..d1b1298 100644
--- a/Test/Test_Time.cpp
+++ b/Test/Test_Time.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #35 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/src/ServerTestHarness.cpp b/Test/src/ServerTestHarness.cpp
index c7525b1..57b3771 100644
--- a/Test/src/ServerTestHarness.cpp
+++ b/Test/src/ServerTestHarness.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #127 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/src/ServerTestHarness.hpp b/Test/src/ServerTestHarness.hpp
index 920b709..93298e7 100644
--- a/Test/src/ServerTestHarness.hpp
+++ b/Test/src/ServerTestHarness.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #46 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/src/TestFixture.cpp b/Test/src/TestFixture.cpp
index d4bd79a..7d267b7 100644
--- a/Test/src/TestFixture.cpp
+++ b/Test/src/TestFixture.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #77 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -125,12 +125,11 @@ void TestFixture::init(const std::string& project_test_dir)
theSCRATCHArea += "/ECF_HOME";
scratchSmsHome_ = theSCRATCHArea;
- bool ok = File::createDirectories(theSCRATCHArea);
- BOOST_REQUIRE_MESSAGE(ok,"File::createDirectories(theSCRATCHArea) failed");
- ok = fs::exists(theSCRATCHArea); assert(ok);
+ BOOST_REQUIRE_MESSAGE(File::createDirectories(theSCRATCHArea),"File::createDirectories(theSCRATCHArea) failed");
+ BOOST_REQUIRE_MESSAGE(fs::exists(theSCRATCHArea),"theSCRATCHArea does not exist");
// Ensure that local includes data exists. This needs to be copied to SCRATCH
- ok = fs::exists(includes()); assert(ok);
+ BOOST_REQUIRE_MESSAGE(fs::exists(includes()) ,"The includes dir does not exist does not exist");
// Copy over the includes directory to the SCRATCH area.
std::string scratchIncludes = test_dir_ + "/";
diff --git a/Test/src/TestFixture.hpp b/Test/src/TestFixture.hpp
index 929e0b1..4b82f25 100644
--- a/Test/src/TestFixture.hpp
+++ b/Test/src/TestFixture.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/src/ZombieUtil.hpp b/Test/src/ZombieUtil.hpp
index c8ea6cf..3ca7083 100644
--- a/Test/src/ZombieUtil.hpp
+++ b/Test/src/ZombieUtil.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #57 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Test/src/ZombieUtill.cpp b/Test/src/ZombieUtill.cpp
index 6870c64..243dd91 100644
--- a/Test/src/ZombieUtill.cpp
+++ b/Test/src/ZombieUtill.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #57 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/VERSION.cmake b/VERSION.cmake
index c42a86e..bd4096c 100644
--- a/VERSION.cmake
+++ b/VERSION.cmake
@@ -1,7 +1,7 @@
set( ECFLOW_RELEASE "4" )
-set( ECFLOW_MAJOR "5" )
+set( ECFLOW_MAJOR "6" )
set( ECFLOW_MINOR "0" )
# use this form to be consistent with other packages,+ allow standard extraction of version from scripts
# could replaced "4.0.8" with "${ECFLOW_RELEASE}.${ECFLOW_MAJOR}.${ECFLOW_MINOR}"
-set( ${PROJECT_NAME}_VERSION_STR "4.5.0" )
+set( ${PROJECT_NAME}_VERSION_STR "4.6.0" )
diff --git a/Viewer/images/chain_closed.svg b/Viewer/images/chain_closed.svg
new file mode 100644
index 0000000..5472ea6
--- /dev/null
+++ b/Viewer/images/chain_closed.svg
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="chain_closed.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4141">
+ <stop
+ id="stop4143"
+ offset="0"
+ style="stop-color:#426396;stop-opacity:1" />
+ <stop
+ id="stop4145"
+ offset="1"
+ style="stop-color:#5e96c3;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4294">
+ <stop
+ style="stop-color:#4581e3;stop-opacity:1"
+ offset="0"
+ id="stop4296" />
+ <stop
+ style="stop-color:#94bcdc;stop-opacity:1"
+ offset="1"
+ id="stop4298" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4141"
+ id="linearGradient4300"
+ x1="26.98015"
+ y1="1035.3843"
+ x2="15.10096"
+ y2="1024.985"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2343218,0,0,1.186121,-3.6660306,-193.30477)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4141"
+ id="linearGradient4302"
+ x1="17.446945"
+ y1="1045.2266"
+ x2="5.7556653"
+ y2="1034.0756"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2343218,0,0,1.186121,-3.6660306,-193.30477)" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.962652"
+ inkscape:cx="-6.3647048"
+ inkscape:cy="16.082926"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:snap-to-guides="false"
+ inkscape:snap-grids="false"
+ inkscape:window-width="1920"
+ inkscape:window-height="1144"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1020.3622)">
+ <path
+ style="fill:url(#linearGradient4302);fill-opacity:1;stroke:none"
+ d="m 13.909329,1035.0351 c -2.653276,2.3783 -6.5579404,5.912 -7.7430003,7.6013 -1.0444529,1.4886 2.0949947,4.5745 3.6677369,3.1499 1.3007544,-1.1782 3.8035824,-3.287 3.8035824,-3.287 0,0 1.659646,0.6019 2.52734,0.7168 0.803468,0.107 2.430894,-0.032 2.430894,-0.032 0,0 -3.898658,5.1603 -6.724185,6.2999 -6.4663518,2.6829 -11.90684655,-2.9157 -9.5089477,-8.6968 0.7909199,-1.728 6.9272438,-7.378 8.6259757,-8.8339 1.29665,-1.1114 4.498498,-1.3645 6.112895,-0.8219 0.623536,0.2098 3.1017 [...]
+ id="path3772"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csscscccsscc" />
+ <path
+ sodipodi:nodetypes="csscscccsscc"
+ inkscape:connector-curvature="0"
+ id="path3774"
+ d="m 18.701169,1037.3691 c 2.653255,-2.3784 6.558003,-5.9119 7.743033,-7.6011 1.044409,-1.4888 -2.095,-4.5747 -3.667741,-3.1502 -1.300716,1.1783 -3.803593,3.2871 -3.803593,3.2871 0,0 -1.659691,-0.6019 -2.527378,-0.7168 -0.803391,-0.1059 -2.430888,0.032 -2.430888,0.032 0,0 3.898678,-5.1605 6.724212,-6.3003 6.466387,-2.6829 11.906905,2.9159 9.508979,8.697 -0.790924,1.7277 -6.92728,7.378 -8.626005,8.8338 -1.296597,1.1113 -4.498456,1.3647 -6.112831,0.8217 -0.623631,-0.2095 -3.101895,- [...]
+ style="fill:url(#linearGradient4300);fill-opacity:1;stroke:none" />
+ </g>
+</svg>
diff --git a/Viewer/images/chain_open.svg b/Viewer/images/chain_open.svg
new file mode 100644
index 0000000..e9d7b0c
--- /dev/null
+++ b/Viewer/images/chain_open.svg
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="chain_open.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4796">
+ <stop
+ style="stop-color:#e97f17;stop-opacity:1"
+ offset="0"
+ id="stop4798" />
+ <stop
+ style="stop-color:#d69028;stop-opacity:1"
+ offset="1"
+ id="stop4800" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4790">
+ <stop
+ id="stop4792"
+ offset="0"
+ style="stop-color:#f5b548;stop-opacity:1" />
+ <stop
+ id="stop4794"
+ offset="1"
+ style="stop-color:#f5d2a0;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4304">
+ <stop
+ style="stop-color:#f7c56f;stop-opacity:1;"
+ offset="0"
+ id="stop4306" />
+ <stop
+ style="stop-color:#fff2df;stop-opacity:1;"
+ offset="1"
+ id="stop4308" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4796"
+ id="linearGradient4310"
+ x1="26.414892"
+ y1="1038.3674"
+ x2="12.845695"
+ y2="1024.272"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1997061,0,0,1.1488967,-3.3252106,-153.52335)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4796"
+ id="linearGradient4312"
+ x1="16.945774"
+ y1="1046.0336"
+ x2="5.7570815"
+ y2="1034.444"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1997061,0,0,1.1488967,-3.3252106,-153.52335)" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.962652"
+ inkscape:cx="7.977298"
+ inkscape:cy="16.302187"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:snap-to-guides="false"
+ inkscape:snap-grids="false"
+ inkscape:window-width="1920"
+ inkscape:window-height="1144"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1020.3622)">
+ <path
+ style="fill:url(#linearGradient4312);fill-opacity:1;stroke:none"
+ d="m 11.577704,1036.8431 c -2.4231219,2.4085 -3.3001469,2.9715 -5.346297,5.7793 -1.0150953,1.442 2.0362412,4.431 3.5648774,3.0511 1.2642756,-1.1412 5.6509966,-5.1271 5.6509966,-5.1271 l 3.015414,3.0384 c 0,0 -3.939637,4.5667 -6.685923,5.6705 -6.2850078,2.5986 -11.5729271,-2.8243 -9.2422761,-8.4239 0.7687392,-1.6738 4.3279481,-5.2031 5.97904,-6.6133 z"
+ id="path3772"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccscccccc" />
+ <path
+ sodipodi:nodetypes="csscccccc"
+ inkscape:connector-curvature="0"
+ id="path3774"
+ d="m 20.068172,1036.5848 c 2.578846,-2.3037 4.720632,-4.7907 5.872429,-6.4268 1.01512,-1.4421 -2.036248,-4.4312 -3.564882,-3.0514 -1.264239,1.1413 -6.402579,5.8469 -6.402579,5.8469 -2.91e-4,0.096 -3.015443,-3.0383 -3.015443,-3.0383 0,0 4.691225,-5.2864 7.43752,-6.3904 6.285041,-2.5988 11.572984,2.8243 9.242305,8.424 -0.768742,1.6736 -5.305025,5.707 -6.956111,7.1171 z"
+ style="fill:url(#linearGradient4310);fill-opacity:1;stroke:none" />
+ </g>
+</svg>
diff --git a/Viewer/images/cogwheel.svg b/Viewer/images/cogwheel.svg
new file mode 100644
index 0000000..75e16f0
--- /dev/null
+++ b/Viewer/images/cogwheel.svg
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="cogwheel.svg">
+ <defs
+ id="defs15">
+ <linearGradient
+ id="linearGradient3762">
+ <stop
+ style="stop-color:#e4ca38;stop-opacity:1;"
+ offset="0"
+ id="stop3764" />
+ <stop
+ style="stop-color:#feb42e;stop-opacity:1;"
+ offset="1"
+ id="stop3766" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1361"
+ inkscape:window-height="933"
+ id="namedview13"
+ showgrid="true"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="15.353691"
+ inkscape:cx="16.389298"
+ inkscape:cy="15.644701"
+ inkscape:window-x="505"
+ inkscape:window-y="252"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2992"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4083">image/svg+xml<rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ <cc:license
+ rdf:resource="" />
+ </cc:Work>
+</rdf:RDF>
+</metadata>
+ <g
+ id="g7"
+ transform="matrix(0.07691065,0,0,0.07691085,1.0927959,0.98000587)"
+ style="fill:#ff9955">
+ <title
+ id="title9">Layer 1</title>
+ <g
+ id="layer1"
+ style="fill:#ff9955">
+ <path
+ d="m 179.97914,6.0810187 -7.75457,43.6685953 0.0305,0.02923 c -9.47919,1.531405 -18.65011,3.985597 -27.40966,7.254054 l 0,-0.02926 -28.78113,-33.99812 -27.051764,15.450686 15.360254,41.634313 0.0593,0.02928 C 97.098295,86.071717 90.376404,92.740748 84.359814,99.993878 L 84.330294,99.905145 42.217022,84.7196 26.588587,111.46369 60.976876,139.94766 c -3.300345,8.65237 -5.76082,17.70578 -7.306954,27.06772 l -0.03054,-0.0293 -44.170955,7.66636 0,30.90138 44.170955,7.66636 0.03054,-0 [...]
+ id="path4050"
+ stroke-miterlimit="4"
+ inkscape:connector-curvature="0"
+ style="fill:#333333;fill-opacity:1;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0"
+ sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccsssss" />
+ </g>
+ </g>
+</svg>
diff --git a/Viewer/images/dock_max.svg b/Viewer/images/dock_max.svg
new file mode 100644
index 0000000..f550f75
--- /dev/null
+++ b/Viewer/images/dock_max.svg
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="dock_max.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4294">
+ <stop
+ style="stop-color:#d5e5ff;stop-opacity:1;"
+ offset="0"
+ id="stop4296" />
+ <stop
+ style="stop-color:#edf7ff;stop-opacity:1;"
+ offset="1"
+ id="stop4298" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.962652"
+ inkscape:cx="14.245232"
+ inkscape:cy="16.082926"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:snap-to-guides="true"
+ inkscape:snap-grids="true"
+ inkscape:window-width="1432"
+ inkscape:window-height="914"
+ inkscape:window-x="257"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1020.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#f2f2f2;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 18.802702,1028.8031 4,1028.6151 l 0,18.7471 23.122953,-0.1253 0.187938,-12.8004"
+ id="path4147"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#f2f2f2;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 19.584874,1035.4085 9.039249,-9.6704"
+ id="path4149"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#f2f2f2;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 22.937354,1026.1742 5.874707,-0.4361 0.06265,5.1903"
+ id="path4151"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ </g>
+</svg>
diff --git a/Viewer/images/dock_max_disabled.svg b/Viewer/images/dock_max_disabled.svg
new file mode 100644
index 0000000..7c97d11
--- /dev/null
+++ b/Viewer/images/dock_max_disabled.svg
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="dock_max_disabled.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4294">
+ <stop
+ style="stop-color:#d5e5ff;stop-opacity:1;"
+ offset="0"
+ id="stop4296" />
+ <stop
+ style="stop-color:#edf7ff;stop-opacity:1;"
+ offset="1"
+ id="stop4298" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.962652"
+ inkscape:cx="12.732804"
+ inkscape:cy="16.082926"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:snap-to-guides="true"
+ inkscape:snap-grids="true"
+ inkscape:window-width="1432"
+ inkscape:window-height="914"
+ inkscape:window-x="257"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1020.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#999999;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 18.802702,1028.8031 4,1028.6151 l 0,18.7471 23.122953,-0.1253 0.187938,-12.8004"
+ id="path4147"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#999999;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 19.584874,1035.4085 9.039249,-9.6704"
+ id="path4149"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#999999;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 22.937354,1026.1742 5.874707,-0.4361 0.06265,5.1903"
+ id="path4151"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ </g>
+</svg>
diff --git a/Viewer/images/dock_restore.svg b/Viewer/images/dock_restore.svg
new file mode 100644
index 0000000..d8224ce
--- /dev/null
+++ b/Viewer/images/dock_restore.svg
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="dock_restore.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4294">
+ <stop
+ style="stop-color:#d5e5ff;stop-opacity:1;"
+ offset="0"
+ id="stop4296" />
+ <stop
+ style="stop-color:#edf7ff;stop-opacity:1;"
+ offset="1"
+ id="stop4298" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.962652"
+ inkscape:cx="14.245232"
+ inkscape:cy="16.082926"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:snap-to-guides="true"
+ inkscape:snap-grids="true"
+ inkscape:window-width="1432"
+ inkscape:window-height="914"
+ inkscape:window-x="257"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1020.3622)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#f2f2f2;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 16.67273,1028.8031 4,1028.6151 l 0,18.7471 23.122953,-0.1253 0.250584,-11.1716"
+ id="path4147"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#f2f2f2;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 17.956072,1036.3482 9.039249,-9.6704"
+ id="path4149"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#f2f2f2;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 22.109088,1037.5716 -5.8747,0.4361 -0.063,-5.1903"
+ id="path4151"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ </g>
+</svg>
diff --git a/Viewer/images/icon_complete.svg b/Viewer/images/icon_complete.svg
index 24c22db..78a4944 100644
--- a/Viewer/images/icon_complete.svg
+++ b/Viewer/images/icon_complete.svg
@@ -14,7 +14,7 @@
height="32"
id="svg2"
version="1.1"
- inkscape:version="0.48.4 r9939"
+ inkscape:version="0.91 r13725"
sodipodi:docname="icon_complete.svg">
<defs
id="defs4">
@@ -32,12 +32,13 @@
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5324"
- id="linearGradient5330"
+ id="linearGradient7301"
+ gradientUnits="userSpaceOnUse"
x1="18.005625"
y1="26.582415"
x2="10.748308"
y2="7.0853157"
- gradientUnits="userSpaceOnUse" />
+ gradientTransform="translate(-34.104449,-6.0038685)" />
</defs>
<sodipodi:namedview
id="base"
@@ -47,7 +48,7 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16.15625"
- inkscape:cx="19.957224"
+ inkscape:cx="7.6709571"
inkscape:cy="15.790581"
inkscape:document-units="px"
inkscape:current-layer="layer2"
@@ -55,9 +56,9 @@
inkscape:snap-to-guides="false"
inkscape:snap-grids="false"
inkscape:window-width="1920"
- inkscape:window-height="1180"
- inkscape:window-x="1916"
- inkscape:window-y="-4"
+ inkscape:window-height="1175"
+ inkscape:window-x="1920"
+ inkscape:window-y="0"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
@@ -75,7 +76,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title />
+ <dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
@@ -85,16 +86,28 @@
inkscape:label="Layer"
style="display:inline">
<circle
- style="fill:url(#linearGradient5330);fill-opacity:1;fill-rule:evenodd;stroke:#136922;stroke-width:1.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#136922;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path3346"
cx="15.955303"
cy="16.060171"
r="14.963701" />
<path
- style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ style="fill:#008000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 8.8665378,13.071566 C 8.6286267,13 5,17 5.13658,17.000004 c 2.7645077,2.745675 5.956143,5.432548 8.791853,8.104445 L 27.032309,11.649205 23.433269,8.44294 14,19.404256"
id="path4146"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccc" />
+ <circle
+ r="14.963701"
+ cy="10.056303"
+ cx="-18.149145"
+ id="circle7297"
+ style="fill:url(#linearGradient7301);fill-opacity:1;fill-rule:evenodd;stroke:#136922;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path7299"
+ d="m -25.237911,7.0676975 c -0.237911,-0.071566 -3.866538,3.9284345 -3.729958,3.9284385 2.764508,2.745675 5.956143,5.432548 8.791853,8.104445 L -7.0721397,5.6453365 -10.67118,2.4390715 -20.104449,13.400388"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</svg>
diff --git a/Viewer/images/icon_node_log.svg b/Viewer/images/icon_node_log.svg
index ebf8c04..f8cba14 100644
--- a/Viewer/images/icon_node_log.svg
+++ b/Viewer/images/icon_node_log.svg
@@ -14,7 +14,7 @@
height="32"
id="svg2"
version="1.1"
- inkscape:version="0.48.4 r9939"
+ inkscape:version="0.91 r13725"
sodipodi:docname="icon_node_log.svg">
<defs
id="defs4">
@@ -62,14 +62,16 @@
xlink:href="#linearGradient3845-2"
inkscape:collect="always" />
<linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3602"
- id="linearGradient3007"
- gradientUnits="userSpaceOnUse"
- x1="4.7915082"
- y1="21.301931"
- x2="28.312923"
- y2="21.301931" />
+ id="linearGradient3786-4">
+ <stop
+ id="stop3788-7"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop3790-8"
+ offset="1"
+ style="stop-color:#96b0ba;stop-opacity:1" />
+ </linearGradient>
</defs>
<sodipodi:namedview
id="base"
@@ -79,17 +81,17 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="21.072033"
- inkscape:cx="8.6401564"
- inkscape:cy="14.110451"
+ inkscape:cx="20.501136"
+ inkscape:cy="17.558393"
inkscape:document-units="px"
inkscape:current-layer="layer3"
showgrid="true"
inkscape:snap-grids="false"
- inkscape:window-width="1699"
- inkscape:window-height="1091"
- inkscape:window-x="213"
+ inkscape:window-width="1920"
+ inkscape:window-height="1175"
+ inkscape:window-x="1920"
inkscape:window-y="0"
- inkscape:window-maximized="0"
+ inkscape:window-maximized="1"
inkscape:snap-to-guides="true"
showguides="false"
inkscape:guide-bbox="true">
@@ -155,39 +157,27 @@
id="layer3"
inkscape:label="first"
style="display:inline">
- <path
- sodipodi:type="arc"
- style="fill:#8badb5;fill-opacity:1;stroke:#6f8a91;stroke-width:1.01746416;stroke-opacity:1"
- id="path8398"
- sodipodi:cx="16.552216"
- sodipodi:cy="21.301931"
- sodipodi:rx="11.112521"
- sodipodi:ry="11.57878"
- d="m 27.664737,21.301931 a 11.112521,11.57878 0 1 1 -22.2250426,0 11.112521,11.57878 0 1 1 22.2250426,0 z"
- transform="matrix(-0.40225195,-1.3059212,1.2533359,-0.38605332,-4.0754017,45.827226)" />
<text
xml:space="preserve"
- style="font-size:28.00000016px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Courier;-inkscape-font-specification:Courier Bold"
- x="8.1850863"
- y="23.932768"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:28px;line-height:125%;font-family:Courier;-inkscape-font-specification:'Courier Bold';letter-spacing:0px;word-spacing:0px;display:inline;fill:#ffffff;fill-opacity:1;stroke:none"
+ x="-25.300163"
+ y="22.20327"
id="text7062-1"
sodipodi:linespacing="125%"
- transform="scale(0.98497411,1.0152551)"><tspan
+ transform="scale(0.98497412,1.0152551)"><tspan
sodipodi:role="line"
id="tspan7064-6"
- x="8.1850863"
- y="23.932768"
- style="font-size:28.00000016px;font-weight:bold;fill:#ffffff;fill-opacity:1;-inkscape-font-specification:Courier Bold">N</tspan></text>
- <path
- transform="matrix(-0.4106509,-1.3242821,1.2795053,-0.39148115,32.569591,45.160188)"
- d="m 27.664737,21.301931 a 11.112521,11.57878 0 1 1 -22.2250426,0 11.112521,11.57878 0 1 1 22.2250426,0 z"
- sodipodi:ry="11.57878"
- sodipodi:rx="11.112521"
- sodipodi:cy="21.301931"
- sodipodi:cx="16.552216"
+ x="-25.300163"
+ y="22.20327"
+ style="font-weight:bold;font-size:28px;-inkscape-font-specification:'Courier Bold';fill:#ffffff;fill-opacity:1">N</tspan></text>
+ <ellipse
+ transform="matrix(-0.29618,-0.95513214,0.95624265,-0.29257477,0,0)"
id="path3001"
- style="fill:url(#linearGradient3007);fill-opacity:1;stroke:none"
- sodipodi:type="arc" />
+ style="fill:#000000;fill-opacity:0;stroke:none"
+ cx="-29.640074"
+ cy="45.182575"
+ rx="15.407411"
+ ry="15.493045" />
<text
transform="scale(0.98497412,1.0152551)"
sodipodi:linespacing="125%"
@@ -201,6 +191,24 @@
x="45.765656"
id="tspan3005"
sodipodi:role="line">N</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06431961px;line-height:125%;font-family:Courier;-inkscape-font-specification:'Courier Bold';letter-spacing:0px;word-spacing:0px;display:inline;fill:#ffffff;fill-opacity:1;stroke:none"
+ x="11.372865"
+ y="49.23735"
+ id="text7062-1-9"
+ sodipodi:linespacing="125%"
+ transform="scale(1.0069104,0.99313703)"><tspan
+ sodipodi:role="line"
+ id="tspan7064-6-9"
+ x="11.372865"
+ y="49.23735"
+ style="font-weight:bold;font-size:17.06431961px;-inkscape-font-specification:'Courier Bold';fill:#ffffff;fill-opacity:1">N</tspan></text>
+ <path
+ style="fill:#a2a5bf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 0.34121685,28.080791 31.885264,28.17389 15.997695,1.5464848 Z"
+ id="path8050"
+ inkscape:connector-curvature="0" />
</g>
<g
inkscape:groupmode="layer"
diff --git a/Viewer/images/icon_rerun.svg b/Viewer/images/icon_rerun.svg
index 91e3e17..aa5032a 100644
--- a/Viewer/images/icon_rerun.svg
+++ b/Viewer/images/icon_rerun.svg
@@ -14,44 +14,11 @@
height="32"
id="svg2"
version="1.1"
- inkscape:version="0.48.4 r9939"
+ inkscape:version="0.91 r13725"
sodipodi:docname="icon_rerun.svg">
<defs
id="defs4">
<linearGradient
- id="linearGradient3852">
- <stop
- style="stop-color:#467b3c;stop-opacity:1;"
- offset="0"
- id="stop3854" />
- <stop
- style="stop-color:#3d9f3d;stop-opacity:0.99215686;"
- offset="1"
- id="stop3856" />
- </linearGradient>
- <linearGradient
- id="linearGradient3799">
- <stop
- style="stop-color:#aae1be;stop-opacity:1;"
- offset="0"
- id="stop3801" />
- <stop
- style="stop-color:#4bc82b;stop-opacity:1;"
- offset="1"
- id="stop3803" />
- </linearGradient>
- <linearGradient
- id="linearGradient3777">
- <stop
- style="stop-color:#0000ad;stop-opacity:1;"
- offset="0"
- id="stop3779" />
- <stop
- style="stop-color:#25d4ce;stop-opacity:1;"
- offset="1"
- id="stop3781" />
- </linearGradient>
- <linearGradient
id="linearGradient3756">
<stop
id="stop3758"
@@ -63,36 +30,25 @@
style="stop-color:#e9dddd;stop-opacity:0;" />
</linearGradient>
<linearGradient
- id="linearGradient3728">
- <stop
- style="stop-color:#f1f3fb;stop-opacity:1;"
- offset="0"
- id="stop3730" />
- <stop
- style="stop-color:#273df9;stop-opacity:0;"
- offset="1"
- id="stop3732" />
- </linearGradient>
- <linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3756"
id="linearGradient3720"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0404908,0,0,-1.215256,0.38228708,38.586128)"
+ gradientTransform="matrix(1.1632326,0,0,-1.2685615,0.58371699,39.158084)"
x1="24.437176"
y1="3.4853487"
x2="15.941438"
y2="18.883736" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient3777"
- id="linearGradient3783"
- x1="1.4276053"
- y1="16.374115"
- x2="28.440671"
- y2="16.374115"
+ xlink:href="#linearGradient3756"
+ id="linearGradient4166"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0279887,0,0,1.0323478,7.1553463,-2.2096664)" />
+ gradientTransform="matrix(1.0404908,0,0,-1.215256,-32.737713,39.066128)"
+ x1="24.437176"
+ y1="3.4853487"
+ x2="15.941438"
+ y2="18.883736" />
</defs>
<sodipodi:namedview
id="base"
@@ -101,17 +57,17 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="18.75"
- inkscape:cx="-0.8066233"
- inkscape:cy="10.423067"
+ inkscape:zoom="26.516504"
+ inkscape:cx="13.028941"
+ inkscape:cy="15.416363"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="true"
inkscape:snap-grids="false"
inkscape:window-width="1920"
- inkscape:window-height="1180"
- inkscape:window-x="1916"
- inkscape:window-y="-4"
+ inkscape:window-height="1175"
+ inkscape:window-x="1920"
+ inkscape:window-y="0"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
@@ -158,11 +114,17 @@
inkscape:label="circle"
style="display:inline">
<path
- style="fill:none;stroke:url(#linearGradient3720);stroke-width:0.8456015;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- d="m 3.1988885,24.309 c -1.9860976,6.2832 -0.9930487,3.1416 0,0 z"
+ style="fill:none;stroke:url(#linearGradient3720);stroke-width:0.84560168;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 3.7325798,24.254708 c -2.2203884,6.558804 -1.1101942,3.279402 0,0 z"
id="path3695"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4158"
+ d="m -29.921112,24.789 c -1.986097,6.2832 -0.993048,3.1416 0,0 z"
+ style="fill:none;stroke:url(#linearGradient4166);stroke-width:0.8456015;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</g>
<g
inkscape:groupmode="layer"
@@ -171,22 +133,95 @@
style="display:inline">
<path
style="fill:none;stroke:none"
- d="M 22.909653,6.1671668 16.60076,16.625513 25.306175,15.238756 22.909653,6.1671668 z"
+ d="M 25.768531,5.3171056 18.715406,16.234193 28.447759,14.786608 25.768531,5.3171056 Z"
id="path3872"
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:none"
- d="M 14.241944,7.3321298 C 6.786479,7.5666798 1.4716388,17.360951 7.6758828,24.839907 c 0.7563942,0.780786 3.6491992,2.786828 7.0550982,2.514141 5.712717,-0.402552 6.860758,-3.132424 6.409043,-3.237554 -1.13923,-0.265136 -1.112817,1.757137 -6.227022,2.080868 -7.6308378,-1.234811 -10.664831,-10.197423 -4.19553,-15.127048 1.513013,-0.967602 2.929706,-1.5788248 4.399935,-1.6579269 1.73077,-0.093113 3.535737,0.5511844 5.659367,2.2196019 -0.365235,-2.7439249 -3.144769,-3.9647496 -6.534 [...]
+ d="M 16.078334,6.533168 C 7.7433809,6.778006 1.8015743,17.001889 8.7377039,24.808898 c 0.8456221,0.815034 4.0796791,2.909068 7.8873541,2.624421 6.38662,-0.420209 7.67009,-3.269823 7.165087,-3.379564 -1.273618,-0.276769 -1.24409,1.83421 -6.961593,2.172141 C 8.2975397,24.936923 4.9056407,15.581178 12.138094,10.435324 13.829591,9.425277 15.413405,8.7872443 17.057069,8.7046713 18.99201,8.6074693 21.0099,9.2800345 23.384044,11.021636 22.975725,8.1573513 19.868302,6.8829765 16.078334,6. [...]
id="path3844"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccsccscc" />
<path
- id="path3823-3"
- style="fill:#b7b7c8;fill-opacity:1;stroke:#000000;stroke-width:0.89287883000000001;stroke-miterlimit:4;stroke-opacity:1;display:inline"
- d="M 22.486832,22.554776 C 19.439775,25.940664 14.240651,26.201033 10.874261,23.13633 9.3587235,21.756611 8.4730084,19.938191 8.23522,18.046765 c -0.290399,-2.309904 0.3855542,-4.72869 2.060836,-6.590262 3.047057,-3.3858854 8.246179,-3.6462565 11.61257,-0.581552 0.03017,0.02745 -3.888509,4.851987 -3.858754,4.879886 L 30.228273,14.741185 29.759998,1.174775 25.710268,6.1157684 C 19.839509,0.77113026 10.772585,1.2251991 5.4587231,7.1299598 0.14486154,13.03472 0.59631617,22.154159 6.4 [...]
inkscape:connector-curvature="0"
- sodipodi:nodetypes="cssssccccssc" />
+ sodipodi:nodetypes="cccc"
+ id="path4160"
+ d="M -10.210347,6.6471668 -16.51924,17.105513 -7.813825,15.718756 -10.210347,6.6471668 Z"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccsccscc"
+ inkscape:connector-curvature="0"
+ id="path4162"
+ d="m -18.878056,7.8121298 c -7.455465,0.23455 -12.770305,10.0288212 -6.566061,17.5077772 0.756394,0.780786 3.649199,2.786828 7.055098,2.514141 5.712717,-0.402552 6.860758,-3.132424 6.409043,-3.237554 -1.13923,-0.265136 -1.112817,1.757137 -6.227022,2.080868 -7.630838,-1.234811 -10.664831,-10.197423 -4.19553,-15.127048 1.513013,-0.967602 2.929706,-1.5788248 4.399935,-1.6579269 1.73077,-0.093113 3.535737,0.5511839 5.659367,2.2196019 -0.365235,-2.7439249 -3.144769,-3.9647496 -6.53483, [...]
+ style="fill:none;stroke:none" />
+ <path
+ style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#c83737;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4168"
+ sodipodi:type="arc"
+ sodipodi:cx="16.136389"
+ sodipodi:cy="15.9062"
+ sodipodi:rx="12.171371"
+ sodipodi:ry="12.322227"
+ sodipodi:start="0"
+ sodipodi:end="2.3561945"
+ d="M 28.30776,15.9062 A 12.171371,12.322227 0 0 1 20.794171,27.290453 12.171371,12.322227 0 0 1 7.5299294,24.61933"
+ sodipodi:open="true" />
+ <path
+ id="path4170"
+ style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#e68751;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(1,-1)"
+ d="M 24.797917,-7.3926069 A 12.189322,12.033113 0 0 1 11.514112,-4.7841561 12.189322,12.033113 0 0 1 3.9894419,-15.901303"
+ sodipodi:type="arc"
+ sodipodi:open="true"
+ sodipodi:start="0.78539816"
+ sodipodi:end="3.1415927"
+ sodipodi:ry="12.033113"
+ sodipodi:rx="12.189322"
+ sodipodi:cy="-15.901302"
+ sodipodi:cx="16.178764" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#ff6600;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 28.674572,-11.697841 c 2.689022,2.2617831 3.850452,3.186923 5.493333,4.533333 l -5.386667,5.4399997"
+ id="path4172"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ sodipodi:type="star"
+ style="opacity:1;fill:#c83737;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.46715569;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4182"
+ sodipodi:sides="3"
+ sodipodi:cx="26.453333"
+ sodipodi:cy="-2.6133332"
+ sodipodi:r1="2.0308728"
+ sodipodi:r2="1.8762819"
+ sodipodi:arg1="1.0483929"
+ sodipodi:arg2="2.0955905"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="-0.001"
+ d="M 27.468383,-0.85524549 24.421888,-2.6147288 27.47129,-4.3722624 Z"
+ inkscape:transform-center-x="-3.1576911"
+ inkscape:transform-center-y="2.8730324"
+ transform="matrix(2.2080247,2.2104871,3.6009454,-3.2645636,-43.617724,-44.591438)" />
+ <path
+ transform="matrix(-2.2599723,-2.1607655,-3.5224119,3.3438351,77.410093,75.587189)"
+ inkscape:transform-center-y="-2.9428483"
+ inkscape:transform-center-x="3.0886317"
+ d="M 27.468383,-0.85524549 24.421888,-2.6147288 27.47129,-4.3722624 Z"
+ inkscape:randomized="-0.001"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.0955905"
+ sodipodi:arg1="1.0483929"
+ sodipodi:r2="1.8762819"
+ sodipodi:r1="2.0308728"
+ sodipodi:cy="-2.6133332"
+ sodipodi:cx="26.453333"
+ sodipodi:sides="3"
+ id="path4188"
+ style="opacity:1;fill:#e68751;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.46715569;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
</g>
<g
inkscape:groupmode="layer"
diff --git a/Viewer/images/icon_slow.svg b/Viewer/images/icon_slow.svg
index 57a792a..4dc6aa9 100644
--- a/Viewer/images/icon_slow.svg
+++ b/Viewer/images/icon_slow.svg
@@ -14,9 +14,9 @@
height="32"
id="svg2"
sodipodi:version="0.32"
- inkscape:version="0.47 r22583"
+ inkscape:version="0.91 r13725"
version="1.0"
- sodipodi:docname="filesave.svg"
+ sodipodi:docname="icon_slow.svg"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
@@ -25,37 +25,37 @@
<linearGradient
id="linearGradient12168">
<stop
- style="stop-color:#858585;stop-opacity:1;"
+ style="stop-color:#f6e1c6;stop-opacity:1"
offset="0"
id="stop12170" />
<stop
id="stop12172"
- offset="0.5"
- style="stop-color:#cbcbcb;stop-opacity:1;" />
+ offset="1"
+ style="stop-color:#d3c4a9;stop-opacity:1" />
<stop
- style="stop-color:#ffffff;stop-opacity:1"
+ style="stop-color:#fff9e4;stop-opacity:1"
offset="1"
id="stop12174" />
</linearGradient>
<linearGradient
id="linearGradient11450">
<stop
- style="stop-color:#191919;stop-opacity:1;"
+ style="stop-color:#80796d;stop-opacity:1"
offset="0"
id="stop11452" />
<stop
- style="stop-color:#ffffff;stop-opacity:1;"
+ style="stop-color:#fff2f2;stop-opacity:1"
offset="1"
id="stop11454" />
</linearGradient>
<linearGradient
id="linearGradient2263">
<stop
- style="stop-color:#3e848c;stop-opacity:1;"
+ style="stop-color:#cc6523;stop-opacity:1"
offset="0"
id="stop2265" />
<stop
- style="stop-color:#b3c7de;stop-opacity:1;"
+ style="stop-color:#ffb787;stop-opacity:1"
offset="1"
id="stop2267" />
</linearGradient>
@@ -77,8 +77,8 @@
gradientTransform="matrix(1.0595231,0,0,-1.0264164,-2.3364269,49.429715)"
x1="13.444483"
y1="41.398193"
- x2="38.408127"
- y2="31.618719" />
+ x2="38.822224"
+ y2="33.98666" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11450"
@@ -98,22 +98,22 @@
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="27.1875"
- inkscape:cx="3.6965521"
- inkscape:cy="18.390381"
+ inkscape:cx="13.968322"
+ inkscape:cy="17.638603"
inkscape:document-units="px"
- inkscape:current-layer="layer1"
+ inkscape:current-layer="g7418"
inkscape:showpageshadow="false"
showborder="true"
borderlayer="top"
showgrid="true"
inkscape:grid-points="false"
- inkscape:window-width="1585"
- inkscape:window-height="1096"
- inkscape:window-x="198"
- inkscape:window-y="35"
+ inkscape:window-width="1920"
+ inkscape:window-height="1175"
+ inkscape:window-x="1920"
+ inkscape:window-y="0"
width="32px"
height="32px"
- inkscape:window-maximized="0"
+ inkscape:window-maximized="1"
inkscape:snap-grids="false">
<inkscape:grid
id="GridFromPre046Settings"
@@ -168,26 +168,28 @@
style="display:inline"
id="g7418"
inkscape:label="Layer 1"
- transform="matrix(0.75450459,0,0,0.71126951,-2.1666557,-1.4575482)">
+ transform="matrix(0.78596407,0,0,0.76130988,-2.9252556,-1.862463)">
<path
sodipodi:nodetypes="ccccccccc"
id="path7428"
d="m 6.518876,43.354968 35.286861,0 c 0.534691,0 0.965147,-0.454103 0.965147,-1.018168 l 0,-36.1483706 c 0,-0.5640634 -0.430456,-1.0181674 -0.965147,-1.0181674 l -32.740934,0 c 0,0 -3.6085747,3.8629739 -3.6085747,3.8629739 L 5.553727,42.3368 c 0,0.564065 0.4304565,1.018168 0.965149,1.018168 z"
- style="fill:url(#linearGradient7454);fill-opacity:1;stroke:#25375f;stroke-width:1.09204853;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ style="fill:url(#linearGradient7454);fill-opacity:1;stroke:#2b1100;stroke-width:1.03420794;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="ccccccc"
id="path7444"
d="m 15.597127,17.861022 17.95215,0 c 0.807146,0 1.456942,-0.646926 1.456942,-1.450506 l 0,-11.3734517 c 0,0 -20.866034,0 -20.866034,0 l 0,11.3734517 c 0,0.80358 0.649796,1.450506 1.456942,1.450506 z"
- style="fill:url(#linearGradient7458);fill-opacity:1;stroke:#371d1d;stroke-width:0.80249828;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+ style="fill:url(#linearGradient7458);fill-opacity:1;stroke:#28170b;stroke-width:0.75999385;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
<rect
ry="0.47095141"
rx="0.63196307"
- y="-14.153564"
- x="27.560804"
- height="6.3106155"
- width="4.2313471"
+ y="-13.636438"
+ x="27.707052"
+ height="5.7934899"
+ width="4.0851002"
id="rect7446"
- style="fill:url(#linearGradient11456);fill-opacity:1;stroke:#251818;stroke-width:0.65857965;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:url(#linearGradient11456);fill-opacity:1;stroke:#2b1100;stroke-width:0.62369788;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
transform="scale(1,-1)" />
</g>
<g
@@ -196,12 +198,12 @@
inkscape:label="white"
style="display:inline">
<rect
- y="-27.690033"
- x="5.7776341"
- height="12.439459"
- width="20.560297"
+ y="-29.335752"
+ x="5.350276"
+ height="13.314618"
+ width="21.417572"
id="rect7430"
- style="fill:#ffffff;fill-opacity:1;stroke:#371d1d;stroke-width:0.63016373;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ style="display:inline;fill:#fffbf8;fill-opacity:1;stroke:#2b1100;stroke-width:0.63016373;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
transform="scale(1,-1)" />
</g>
<g
@@ -210,25 +212,25 @@
inkscape:label="label"
style="display:inline">
<rect
- style="fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.4163833;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ style="display:inline;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#2b1100;stroke-width:0.4163833;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect11357"
- width="15.208806"
- height="0.61792487"
- x="8.3011494"
- y="-19.845976"
- rx="0.10916411"
+ width="15.842947"
+ height="0.66139805"
+ x="7.9790111"
+ y="-20.939838"
+ rx="0.11371578"
ry="0"
transform="scale(1,-1)" />
<rect
transform="scale(1,-1)"
ry="0"
- rx="0.10925798"
- y="-24.18055"
- x="8.3313904"
- height="0.58149546"
- width="15.221885"
+ rx="0.11381356"
+ y="-25.579365"
+ x="8.0105124"
+ height="0.62240571"
+ width="15.85657"
id="rect13161"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.4040966;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" />
+ style="display:inline;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#2b1100;stroke-width:0.4040966;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</g>
</g>
</svg>
diff --git a/Viewer/images/node_log.svg b/Viewer/images/node_log.svg
index cb32b69..001b459 100644
--- a/Viewer/images/node_log.svg
+++ b/Viewer/images/node_log.svg
@@ -14,7 +14,7 @@
height="32"
id="svg2"
version="1.1"
- inkscape:version="0.48.4 r9939"
+ inkscape:version="0.91 r13725"
sodipodi:docname="node_log.svg">
<defs
id="defs4">
@@ -57,10 +57,10 @@
id="linearGradient4793"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1496437,0,0,1.0974014,-0.68181471,-2.5135733)"
- x1="29.836605"
- y1="18.129137"
- x2="-6.005146"
- y2="5.2368469" />
+ x1="22.501528"
+ y1="19.172001"
+ x2="-4.6953111"
+ y2="12.207575" />
<linearGradient
id="linearGradient3786-4">
<stop
@@ -70,7 +70,7 @@
<stop
id="stop3790-8"
offset="1"
- style="stop-color:#e4eef2;stop-opacity:1;" />
+ style="stop-color:#c7cfd2;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
@@ -131,17 +131,17 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="32.390762"
- inkscape:cx="11.822327"
- inkscape:cy="17.211211"
+ inkscape:zoom="16.601987"
+ inkscape:cx="23.49321"
+ inkscape:cy="15.829171"
inkscape:document-units="px"
inkscape:current-layer="layer3"
showgrid="true"
inkscape:snap-grids="false"
inkscape:window-width="1693"
inkscape:window-height="1132"
- inkscape:window-x="52"
- inkscape:window-y="100"
+ inkscape:window-x="1083"
+ inkscape:window-y="9"
inkscape:window-maximized="0"
inkscape:snap-to-guides="false">
<inkscape:grid
@@ -229,29 +229,19 @@
sodipodi:end="4.5518387"
transform="matrix(-0.27864429,-0.2293023,-0.50135483,0.12744222,6.6798023,4.727201)"
sodipodi:open="true" />
- <path
- sodipodi:type="arc"
- style="fill:#769ea7;fill-opacity:1;stroke:#6f8a91;stroke-width:1.01176022999999993;stroke-opacity:1;display:inline"
- id="path8398"
- sodipodi:cx="16.552216"
- sodipodi:cy="21.301931"
- sodipodi:rx="11.112521"
- sodipodi:ry="11.57878"
- d="m 27.664737,21.301931 a 11.112521,11.57878 0 1 1 -22.2250426,0 11.112521,11.57878 0 1 1 22.2250426,0 z"
- transform="matrix(-0.24413564,-0.78633963,0.76067738,-0.23245588,5.9236104,33.281366)" />
<text
xml:space="preserve"
- style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Courier;-inkscape-font-specification:Courier Bold"
- x="12.506907"
- y="20.468391"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20.88545036px;line-height:125%;font-family:Courier;-inkscape-font-specification:'Courier Bold';letter-spacing:0px;word-spacing:0px;display:inline;fill:#002c5f;fill-opacity:1;stroke:none;"
+ x="12.554404"
+ y="20.187334"
id="text7062-1"
sodipodi:linespacing="125%"
- transform="scale(1.009838,0.99025785)"><tspan
+ transform="scale(0.96825171,1.0327893)"><tspan
sodipodi:role="line"
id="tspan7064-6"
- x="12.506907"
- y="20.468391"
- style="font-size:18px;font-weight:bold;fill:#ffffff;fill-opacity:1;-inkscape-font-specification:Courier Bold">N</tspan></text>
+ x="12.554404"
+ y="20.187334"
+ style="font-weight:bold;font-size:20.88545036px;-inkscape-font-specification:'Courier Bold';fill:#002c5f;fill-opacity:1;">N</tspan></text>
<path
sodipodi:open="true"
transform="matrix(-0.27864429,-0.2293023,-0.50135483,0.12744222,6.8694669,22.176344)"
diff --git a/Viewer/images/server_log.svg b/Viewer/images/server_log.svg
index d7600a3..7620b0d 100644
--- a/Viewer/images/server_log.svg
+++ b/Viewer/images/server_log.svg
@@ -14,7 +14,7 @@
height="32"
id="svg2"
version="1.1"
- inkscape:version="0.48.4 r9939"
+ inkscape:version="0.91 r13725"
sodipodi:docname="server_log.svg">
<defs
id="defs4">
@@ -25,7 +25,7 @@
offset="0"
id="stop3847" />
<stop
- style="stop-color:#c5c7cd;stop-opacity:1"
+ style="stop-color:#c7cfd2;stop-opacity:1"
offset="1"
id="stop3849" />
</linearGradient>
@@ -35,10 +35,10 @@
id="linearGradient4793"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0757737,0,0,1.0996622,0.50954173,-2.3823021)"
- x1="27.831085"
- y1="31.597303"
- x2="-9.200532"
- y2="-2.410116" />
+ x1="21.901278"
+ y1="19.844648"
+ x2="-5.2729979"
+ y2="12.130029" />
</defs>
<sodipodi:namedview
id="base"
@@ -48,16 +48,16 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="12.070612"
- inkscape:cx="21.954017"
- inkscape:cy="-0.91100472"
+ inkscape:cx="5.5091176"
+ inkscape:cy="13.185734"
inkscape:document-units="px"
inkscape:current-layer="layer3"
showgrid="true"
inkscape:snap-grids="false"
inkscape:window-width="1693"
- inkscape:window-height="1376"
- inkscape:window-x="230"
- inkscape:window-y="152"
+ inkscape:window-height="1007"
+ inkscape:window-x="98"
+ inkscape:window-y="86"
inkscape:window-maximized="0"
inkscape:snap-to-guides="false">
<inkscape:grid
diff --git a/Viewer/scripts/CMakeLists.txt b/Viewer/scripts/CMakeLists.txt
index 394d1e0..122537b 100644
--- a/Viewer/scripts/CMakeLists.txt
+++ b/Viewer/scripts/CMakeLists.txt
@@ -11,8 +11,8 @@ else()
set(UI_BACKTRACE no)
endif()
-if(NOT UI_BACKTRACE_EMAIL_ADDRESSES)
- set(UI_BACKTRACE_EMAIL_ADDRESSES "x")
+if(NOT UI_BACKTRACE_EMAIL_ADDRESS_FILE)
+ set(UI_BACKTRACE_EMAIL_ADDRESS_FILE "x")
endif()
if(NOT UI_LOG_FILE)
diff --git a/Viewer/scripts/ecflow_test_ui.sh.in b/Viewer/scripts/ecflow_test_ui.sh.in
index 5ea5689..46700ae 100755
--- a/Viewer/scripts/ecflow_test_ui.sh.in
+++ b/Viewer/scripts/ecflow_test_ui.sh.in
@@ -1,7 +1,7 @@
#!/bin/bash
#============================================================================
-# Copyright 2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/scripts/ecflow_ui.in b/Viewer/scripts/ecflow_ui.in
index 0217857..ca2c0da 100755
--- a/Viewer/scripts/ecflow_ui.in
+++ b/Viewer/scripts/ecflow_ui.in
@@ -1,7 +1,7 @@
#!/bin/bash
#============================================================================
-# Copyright 2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
@@ -11,7 +11,7 @@
# Environment variables from the configuration step
ECFLOWUI_BT=@UI_BACKTRACE@
-ECFLOWUI_BT_EMAIL_ADDRESSES=@UI_BACKTRACE_EMAIL_ADDRESSES@
+ECFLOWUI_BT_EMAIL_ADDRESS_FILE=@UI_BACKTRACE_EMAIL_ADDRESS_FILE@
ECFLOWUI_VERSION=@ECFLOW_VERSION_STR@
ECFLOWUI_INSTALLDIR=@CMAKE_INSTALL_PREFIX@
ECFLOWUI_USAGE_LOG=@UI_LOG_FILE@
@@ -35,7 +35,8 @@ cleanup(){
then
echo "$(basename $0): $1 (OK) (line $2), exit status $status, starting 'cleanup'"
else
- echo "$(basename $0): $1 on ERROR (line $2), exit status $status, starting 'cleanup'"
+ status_message="$(basename $0): $1 on ERROR (line $2), exit status $status, starting 'cleanup'"
+ echo $status_message
if [ -e $ECFLOWUI_LOGFILE ] ; then
@@ -52,33 +53,38 @@ cleanup(){
fi
fi
- # Logic: ECFLOWUI_BT_EMAIL_ADDRESSES is not set, then the log/backtrace
+ # Logic: ECFLOWUI_BT_EMAIL_ADDRESS_FILE is not set, then the log/backtrace
# will go to stdout; otherwise it will be e-mailed to the
# addresses instead (the user will not see the backtrace).
- if [ $ECFLOWUI_BT_EMAIL_ADDRESSES != "x" ] ; then
- EFLOWUI_LOGTAIL="${ECFLOWUI_LOGFILE}.tail"
- ecfuimsg="ecFlowUI backtrace from user $USER"
- echo "Sending crash report by e-mail..."
- echo "user/host : $USER/$HOST" > $EFLOWUI_LOGTAIL
- echo "ecflow version : $ECFLOWUI_VERSION" >> $EFLOWUI_LOGTAIL
- echo "ecflow install dir : $ECFLOWUI_INSTALLDIR" >> $EFLOWUI_LOGTAIL
- echo "start time : $ECFLOWUI_STARTTIME" >> $EFLOWUI_LOGTAIL
- echo "stop time : $(date)" >> $EFLOWUI_LOGTAIL
- echo "" >> $EFLOWUI_LOGTAIL
- tail -$TAILNUM $ECFLOWUI_LOGFILE >> $EFLOWUI_LOGTAIL
-
- #Add the last lines from the user interaction log file
- if [ -e $ECFLOWUI_UI_LOGFILE ] ; then
- echo "" >> $EFLOWUI_LOGTAIL
- echo "Last $UI_TAILNUM lines of user interaction log file:" >> $EFLOWUI_LOGTAIL
- tail -${UI_TAILNUM} $ECFLOWUI_UI_LOGFILE >> $EFLOWUI_LOGTAIL
+ if [ $ECFLOWUI_BT_EMAIL_ADDRESS_FILE != "x" ] ; then
+ if [ -e $ECFLOWUI_BT_EMAIL_ADDRESS_FILE ] ; then
+ EFLOWUI_LOGTAIL="${ECFLOWUI_LOGFILE}.tail"
+ ecfuimsg="ecFlowUI backtrace from user $USER"
+ echo "Sending crash report by e-mail..."
+ echo "user/host : $USER/$HOST" > $EFLOWUI_LOGTAIL
+ echo "ecflow version : $ECFLOWUI_VERSION" >> $EFLOWUI_LOGTAIL
+ echo "ecflow install dir : $ECFLOWUI_INSTALLDIR" >> $EFLOWUI_LOGTAIL
+ echo "start time : $ECFLOWUI_STARTTIME" >> $EFLOWUI_LOGTAIL
+ echo "stop time : $(date)" >> $EFLOWUI_LOGTAIL
+ echo "" >> $EFLOWUI_LOGTAIL
+ echo $status_message >> $EFLOWUI_LOGTAIL
+ tail -$TAILNUM $ECFLOWUI_LOGFILE >> $EFLOWUI_LOGTAIL
+
+ #Add the last lines from the user interaction log file
+ if [ -e $ECFLOWUI_UI_LOGFILE ] ; then
+ echo "" >> $EFLOWUI_LOGTAIL
+ echo "Last $UI_TAILNUM lines of user interaction log file:" >> $EFLOWUI_LOGTAIL
+ tail -${UI_TAILNUM} $ECFLOWUI_UI_LOGFILE >> $EFLOWUI_LOGTAIL
+ fi
+
+ addr=$(head -1 $ECFLOWUI_BT_EMAIL_ADDRESS_FILE)
+ mail -s "$ecfuimsg" $addr < $EFLOWUI_LOGTAIL
+ rm -f $EFLOWUI_LOGTAIL
+ echo "Report sent"
+ else
+ echo "No report sent because e-mail address file does not exist: $ECFLOWUI_BT_EMAIL_ADDRESS_FILE"
fi
-
- addr=$(echo $ECFLOWUI_BT_EMAIL_ADDRESSES | sed 's/,/ /g')
- mail -s "$ecfuimsg" $addr < $EFLOWUI_LOGTAIL
- rm -f $EFLOWUI_LOGTAIL
- echo "Report sent"
else
echo "Last $TAILNUM lines of log file:"
tail -$TAILNUM $ECFLOWUI_LOGFILE
diff --git a/Viewer/scripts/generate_ui_test_scripts.sh b/Viewer/scripts/generate_ui_test_scripts.sh
index 6bdf523..41985fd 100755
--- a/Viewer/scripts/generate_ui_test_scripts.sh
+++ b/Viewer/scripts/generate_ui_test_scripts.sh
@@ -1,7 +1,7 @@
#!/bin/bash
#============================================================================
-# Copyright 2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/AboutDialog.cpp b/Viewer/src/AboutDialog.cpp
index 8d08f0e..5babbd6 100644
--- a/Viewer/src/AboutDialog.cpp
+++ b/Viewer/src/AboutDialog.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -57,7 +57,7 @@ AboutDialog::AboutDialog(QWidget* parent) : QDialog(parent)
if(!ecfVersionTxt.isEmpty())
{
logoTxt+="<p>ecflow version: <b>" + ecfVersionTxt + "</b><br>";
- logoTxt+="<i>Copyright 2009-2016 ECMWF</i><p>";
+ logoTxt+="<i>Copyright 2009-2017 ECMWF</i><p>";
}
logoTxt+="</td></tr></table>";
diff --git a/Viewer/src/AboutDialog.hpp b/Viewer/src/AboutDialog.hpp
index 7f52cac..dca71ac 100644
--- a/Viewer/src/AboutDialog.hpp
+++ b/Viewer/src/AboutDialog.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/AbstractNodeModel.cpp b/Viewer/src/AbstractNodeModel.cpp
index f6b4185..b7fca05 100644
--- a/Viewer/src/AbstractNodeModel.cpp
+++ b/Viewer/src/AbstractNodeModel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/AbstractNodeModel.hpp b/Viewer/src/AbstractNodeModel.hpp
index 7ff34e8..3ccc492 100644
--- a/Viewer/src/AbstractNodeModel.hpp
+++ b/Viewer/src/AbstractNodeModel.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -34,13 +34,14 @@ public:
virtual ~AbstractNodeModel();
enum CustomItemRole {FilterRole = Qt::UserRole+1, IconRole = Qt::UserRole+2,
- ServerRole = Qt::UserRole+3, NodeNumRole = Qt::UserRole+4,
- InfoRole = Qt::UserRole+5, LoadRole = Qt::UserRole+6,
- ConnectionRole = Qt::UserRole+7, ServerDataRole = Qt::UserRole+8,
- NodeDataRole = Qt::UserRole+9, AttributeRole = Qt::UserRole+10,
- AttributeLineRole = Qt::UserRole+11, AbortedReasonRole = Qt::UserRole + 12,
- NodeTypeRole = Qt::UserRole + 13, NodeTypeForegroundRole = Qt::UserRole + 14,
- ServerPointerRole = Qt::UserRole + 15, SortRole = Qt::UserRole + 16};
+ ServerRole = Qt::UserRole+3, NodeNumRole = Qt::UserRole+4,
+ InfoRole = Qt::UserRole+5, LoadRole = Qt::UserRole+6,
+ ConnectionRole = Qt::UserRole+7, ServerDataRole = Qt::UserRole+8,
+ NodeDataRole = Qt::UserRole+9, AttributeRole = Qt::UserRole+10,
+ AttributeLineRole = Qt::UserRole+11, AbortedReasonRole = Qt::UserRole + 12,
+ NodeTypeRole = Qt::UserRole + 13, NodeTypeForegroundRole = Qt::UserRole + 14,
+ ServerPointerRole = Qt::UserRole + 15, SortRole = Qt::UserRole + 16,
+ NodePointerRole = Qt::UserRole + 17};
void dataIsAboutToChange();
virtual VInfo_ptr nodeInfo(const QModelIndex& index)=0;
@@ -67,8 +68,8 @@ public Q_SLOTS:
virtual void slotServerAddBegin(int row)=0;
virtual void slotServerAddEnd()=0;
- virtual void slotServerRemoveBegin(VModelServer*,int)=0;
- virtual void slotServerRemoveEnd(int)=0;
+ virtual void slotServerRemoveBegin(VModelServer*,int)=0;
+ virtual void slotServerRemoveEnd(int)=0;
virtual void slotDataChanged(VModelServer*)=0;
virtual void slotBeginServerScan(VModelServer* server,int)=0;
diff --git a/Viewer/src/AbstractSearchLine.cpp b/Viewer/src/AbstractSearchLine.cpp
index 295d499..a3afec5 100644
--- a/Viewer/src/AbstractSearchLine.cpp
+++ b/Viewer/src/AbstractSearchLine.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/AbstractSearchLine.hpp b/Viewer/src/AbstractSearchLine.hpp
index d8531b1..f974dc7 100644
--- a/Viewer/src/AbstractSearchLine.hpp
+++ b/Viewer/src/AbstractSearchLine.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/AbstractTextEditSearchInterface.cpp b/Viewer/src/AbstractTextEditSearchInterface.cpp
index 6c01a85..8684265 100644
--- a/Viewer/src/AbstractTextEditSearchInterface.cpp
+++ b/Viewer/src/AbstractTextEditSearchInterface.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/AbstractTextEditSearchInterface.hpp b/Viewer/src/AbstractTextEditSearchInterface.hpp
index 1ef178d..c2819b5 100644
--- a/Viewer/src/AbstractTextEditSearchInterface.hpp
+++ b/Viewer/src/AbstractTextEditSearchInterface.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -22,7 +22,7 @@ class AbstractTextEditSearchInterface
{
public:
AbstractTextEditSearchInterface();
- virtual ~AbstractTextEditSearchInterface() {};
+ virtual ~AbstractTextEditSearchInterface() {}
virtual bool findString (QString str, bool highlightAll, QTextDocument::FindFlags findFlags,
QTextCursor::MoveOperation move, int iteration,StringMatchMode::Mode matchMode)=0;
diff --git a/Viewer/src/ActionHandler.cpp b/Viewer/src/ActionHandler.cpp
index 88a6cef..ab6e602 100644
--- a/Viewer/src/ActionHandler.cpp
+++ b/Viewer/src/ActionHandler.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -50,8 +50,38 @@ ActionHandler::ActionHandler(QWidget *view) : QObject(view), parent_(view)
void ActionHandler::contextMenu(std::vector<VInfo_ptr> nodesLst,QPoint pos)
{
+ // deal with tricky cases - if the user selects a combination of 'normal' nodes
+ // and attribute nodes, we want to ignore the attribute nodes, so we will remove
+ // them from the list here and pretend they were not selected
+
+ // count how many attributes and non-attributes are selected
+ long numAttrs=0, numNonAttrNodes=0;
+ for (std::vector<VInfo_ptr>::iterator itNodes = nodesLst.begin(); itNodes != nodesLst.end(); ++itNodes)
+ {
+ if ((*itNodes)->isAttribute())
+ numAttrs++;
+ else
+ numNonAttrNodes++;
+ }
+
+ std::vector<VInfo_ptr> filteredNodes;
+ if (numAttrs > 0 && numNonAttrNodes > 0) // just keep the non-attribute nodes
+ {
+ for (std::vector<VInfo_ptr>::iterator itNodes = nodesLst.begin(); itNodes != nodesLst.end(); ++itNodes)
+ {
+ if (!((*itNodes)->isAttribute()))
+ filteredNodes.push_back(*itNodes);
+ }
+ }
+ else // keep all the nodes
+ {
+ filteredNodes = nodesLst;
+ }
+
+
+
std::string view=parent_->property("view").toString().toStdString();
- MenuItem* item=MenuHandler::invokeMenu("Node", nodesLst,pos, parent_,view);
+ MenuItem* item=MenuHandler::invokeMenu("Node", filteredNodes, pos, parent_,view);
if(item)
{
@@ -61,28 +91,28 @@ void ActionHandler::contextMenu(std::vector<VInfo_ptr> nodesLst,QPoint pos)
#endif
if(item->handler() == "info_panel")
{
- Q_EMIT infoPanelCommand(nodesLst.at(0),QString::fromStdString(item->command()));
+ Q_EMIT infoPanelCommand(filteredNodes.at(0),QString::fromStdString(item->command()));
return;
}
else if(item->handler() == "dashboard")
{
- Q_EMIT dashboardCommand(nodesLst.at(0),QString::fromStdString(item->command()));
+ Q_EMIT dashboardCommand(filteredNodes.at(0),QString::fromStdString(item->command()));
return;
}
else if(item->handler() == "tree")
{
- Q_EMIT viewCommand(nodesLst.at(0),QString::fromStdString(item->command()));
+ Q_EMIT viewCommand(filteredNodes.at(0),QString::fromStdString(item->command()));
return;
}
/*if(action->iconText() == "Set as root")
{
- //Q_EMIT viewCommand(nodesLst,"set_as_root");
+ //Q_EMIT viewCommand(filteredNodes,"set_as_root");
}*/
else if(item->command() == "copy")
{
QString txt;
- for(std::vector<VInfo_ptr>::const_iterator it=nodesLst.begin(); it != nodesLst.end(); ++it)
+ for(std::vector<VInfo_ptr>::const_iterator it=filteredNodes.begin(); it != filteredNodes.end(); ++it)
{
if(*it)
{
@@ -104,13 +134,13 @@ void ActionHandler::contextMenu(std::vector<VInfo_ptr> nodesLst,QPoint pos)
else if(item->command() == "mark_for_move")
{
- if (nodesLst.size() > 1)
+ if (filteredNodes.size() > 1)
{
UserMessage::message(UserMessage::ERROR, true, "Only one node can be marked for move at a time");
return;
}
- VNode::setNodeMarkedForMove(nodesLst[0]->serverAlias(), nodesLst[0]->relativePath());
+ VNode::setNodeMarkedForMove(filteredNodes[0]->serverAlias(), filteredNodes[0]->relativePath());
// suspend if not already suspended
@@ -130,7 +160,7 @@ void ActionHandler::contextMenu(std::vector<VInfo_ptr> nodesLst,QPoint pos)
else if(item->command() == "move_marked")
{
- if (nodesLst.size() > 1)
+ if (filteredNodes.size() > 1)
{
UserMessage::message(UserMessage::ERROR, true, "Only one destination node should be selected");
return;
@@ -138,7 +168,7 @@ void ActionHandler::contextMenu(std::vector<VInfo_ptr> nodesLst,QPoint pos)
// if same server, then error
// NO - ecflowview had this restriction, but it does not seem to be necessary
- //if (nodesLst[0]->serverAlias() == aliasOfMarkedServer)
+ //if (filteredNodes[0]->serverAlias() == aliasOfMarkedServer)
//{
// UserMessage::message(UserMessage::ERROR, true, "Cannot move node to the same server");
// return;
@@ -173,17 +203,17 @@ void ActionHandler::contextMenu(std::vector<VInfo_ptr> nodesLst,QPoint pos)
}
// tell the user what we're about to do
- ServerHandler *shDest = nodesLst[0]->server();
+ ServerHandler *shDest = filteredNodes[0]->server();
bool ok = UserMessage::confirm("About to move node " +
pathOfMarkedNode + " from server " +
aliasOfMarkedServer + " (" + shSource->host() + ":" + shSource->port() + ") to " +
- nodesLst[0]->serverAlias() + " (" + shDest->host() + ":" + shDest->port() + ") "
- "/" + nodesLst[0]->relativePath() + ". Ok?");
+ filteredNodes[0]->serverAlias() + " (" + shDest->host() + ":" + shDest->port() + ") "
+ "/" + filteredNodes[0]->relativePath() + ". Ok?");
// do it (?)
if (ok)
{
std::string plugCommand;
- plugCommand = "ecflow_client --plug <full_name> " + shDest->host() + ":" + shDest->port() + nodesLst[0]->relativePath();
+ plugCommand = "ecflow_client --plug <full_name> " + shDest->host() + ":" + shDest->port() + filteredNodes[0]->relativePath();
shSource->command(pathOfMarkedNode, plugCommand);
shDest->reset(); // the dest server will have a big update, and we don't want to wait for the next sync to see it
VNode::clearNodeMarkedForMove();
@@ -199,11 +229,11 @@ void ActionHandler::contextMenu(std::vector<VInfo_ptr> nodesLst,QPoint pos)
{
// invoke the custom command dialogue
customCommandDialog = new CustomCommandDialog(0);
- customCommandDialog->setNodes(nodesLst);
+ customCommandDialog->setNodes(filteredNodes);
if (customCommandDialog->exec() == QDialog::Accepted)
{
// the user could have changed the node selection within the custom editor
- std::vector<VInfo_ptr> selectedNodes = customCommandDialog->selectedNodes();
+ customCommandDialog->selectedNodes();
// the dialogue contains a 'fake' menu item created from the custom command
item = &(customCommandDialog->menuItem());
@@ -220,31 +250,31 @@ void ActionHandler::contextMenu(std::vector<VInfo_ptr> nodesLst,QPoint pos)
if (item->isCustom())
MenuHandler::interceptCommandsThatNeedConfirmation(item);
- if(item && !item->question().empty() && item->shouldAskQuestion(nodesLst))
+ if(item && !item->question().empty() && item->shouldAskQuestion(filteredNodes))
{
std::string fullNames("<ul>");
std::string nodeNames("<ul>");
- if (nodesLst.size() == 1)
+ if (filteredNodes.size() == 1)
{
- fullNames = nodesLst[0]->path();
- nodeNames = "<b>" + nodesLst[0]->name() + "</b>";
+ fullNames = filteredNodes[0]->path();
+ nodeNames = "<b>" + filteredNodes[0]->name() + "</b>";
}
else
{
- int numNodes = nodesLst.size();
+ int numNodes = filteredNodes.size();
int numItemsToList = std::min(numNodes, 5);
for(int i=0; i < numItemsToList; i++)
{
fullNames += "<li><b>";
- fullNames += nodesLst[i]->path();
+ fullNames += filteredNodes[i]->path();
fullNames += "</b></li>";
nodeNames += "<li><b>";
- nodeNames += nodesLst[i]->name();
+ nodeNames += filteredNodes[i]->name();
nodeNames += "</b></li>";
}
- if(numItemsToList < nodesLst.size())
+ if(numItemsToList < filteredNodes.size())
{
std::string numExtra = QString::number(numNodes-numItemsToList).toStdString();
@@ -274,8 +304,8 @@ void ActionHandler::contextMenu(std::vector<VInfo_ptr> nodesLst,QPoint pos)
}
if(ok)
- ServerHandler::command(nodesLst,item->command());
- //ServerHandler::command(nodesLst,action->iconText().toStdString(), true);
+ ServerHandler::command(filteredNodes,item->command());
+ //ServerHandler::command(filteredNodes,action->iconText().toStdString(), true);
if (customCommandDialog)
delete customCommandDialog;
@@ -301,10 +331,10 @@ void ActionHandler::contextMenu(std::vector<VInfo_ptr> nodesLst,QPoint pos)
if(res->iconText() == "Set as root")
{
- emit viewCommand(nodesLst,"set_as_root");
+ emit viewCommand(filteredNodes,"set_as_root");
}
else
- ServerHandler::command(nodesLst,res->iconText().toStdString());
+ ServerHandler::command(filteredNodes,res->iconText().toStdString());
}
delete menu;
diff --git a/Viewer/src/ActionHandler.hpp b/Viewer/src/ActionHandler.hpp
index 4aab7b4..5861b1c 100644
--- a/Viewer/src/ActionHandler.hpp
+++ b/Viewer/src/ActionHandler.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/Animation.cpp b/Viewer/src/Animation.cpp
index 2fb6a86..e127ac2 100644
--- a/Viewer/src/Animation.cpp
+++ b/Viewer/src/Animation.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/Animation.hpp b/Viewer/src/Animation.hpp
index 95eff6b..72543fa 100644
--- a/Viewer/src/Animation.hpp
+++ b/Viewer/src/Animation.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/AstCollateVNodesVisitor.cpp b/Viewer/src/AstCollateVNodesVisitor.cpp
index 21931c4..07c672c 100644
--- a/Viewer/src/AstCollateVNodesVisitor.cpp
+++ b/Viewer/src/AstCollateVNodesVisitor.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -16,9 +16,23 @@
#include "VAttributeType.hpp"
#include "VNode.hpp"
-//AstCollateVNodesVisitor::AstCollateVNodesVisitor( std::set<VItem*>& s) : theSet_(s) {}
+static std::vector<VAttributeType*> attrTypes;
-AstCollateVNodesVisitor::AstCollateVNodesVisitor(std::vector<VItemTmp_ptr>& s) : items_(s) {}
+AstCollateVNodesVisitor::AstCollateVNodesVisitor(std::vector<VItem*>& s) : items_(s)
+{
+ if(attrTypes.empty())
+ {
+ QStringList types;
+ types << "event" << "meter" << "var" << "genvar";
+ Q_FOREACH(QString name,types)
+ {
+ VAttributeType *t=VAttributeType::find(name.toStdString());
+ Q_ASSERT(t);
+ attrTypes.push_back(t);
+
+ }
+ }
+}
AstCollateVNodesVisitor::~AstCollateVNodesVisitor() {}
@@ -31,84 +45,40 @@ void AstCollateVNodesVisitor::visitNode(AstNode* astNode)
if(Node* referencedNode = astNode->referencedNode())
{
if(VNode* n=static_cast<VNode*>(referencedNode->graphic_ptr()))
- {
- //theSet_.insert(n);
- items_.push_back(VItemTmp::create(n));
+ {
+ items_.push_back(n);
}
}
}
void AstCollateVNodesVisitor::visitVariable(AstVariable* astVar)
{
-
-#if 0
- if(Node* referencedNode = astVar->referencedNode())
- {
- if(VNode* n=static_cast<VNode*>(referencedNode->graphic_ptr()))
- {
- QStringList types;
- types << "event" << "meter" << "var" << "genvar";
- Q_FOREACH(QString tName,types)
- {
- QList<VAttribute*> lst;
- VAttributeType::getSearchData(tName.toStdString(),n,lst);
- Q_FOREACH(VAttribute *a,lst)
- {
- bool hasIt=false;
- for(std::set<VItem*>::iterator it = theSet_.begin();
- it != theSet_.end(); ++it)
- {
- if(a->sameContents(*it))
- {
- hasIt=true;
- return;
- }
- }
-
- if(!hasIt && a->strName() == astVar->name())
- {
- theSet_.insert(a);
- return;
- }
- else
- delete a;
- }
- }
- }
- }
-#endif
-
if(Node* referencedNode = astVar->referencedNode())
{
if(VNode* n=static_cast<VNode*>(referencedNode->graphic_ptr()))
{
- QStringList types;
- types << "event" << "meter" << "var" << "genvar";
- Q_FOREACH(QString tName,types)
+ int nType=attrTypes.size();
+ int nItem=items_.size();
+ for(size_t i=0; i < nType; i++)
{
- QList<VItemTmp_ptr> lst;
- VAttributeType::items(tName.toStdString(),n,lst);
- Q_FOREACH(VItemTmp_ptr aItem,lst)
+ if(VAttribute *a=n->findAttribute(attrTypes[i],astVar->name()))
{
- VAttribute *a=aItem->attribute();
- assert(a);
- for(std::vector<VItemTmp_ptr>::iterator it = items_.begin();it != items_.end(); ++it)
+ for(size_t k=0; k < nItem; k++)
{
- if(a->sameContents((*it)->item()))
- {
- return;
- }
+ if(a == items_[k])
+ return;
}
- if(a->strName() == astVar->name())
- {
- items_.push_back(aItem);
+ items_.push_back(a);
return;
- }
}
}
}
}
+}
+void AstCollateVNodesVisitor::visitFlag(AstFlag* astVar)
+{
+ // ???
}
diff --git a/Viewer/src/AstCollateVNodesVisitor.hpp b/Viewer/src/AstCollateVNodesVisitor.hpp
index afbffba..dcb83f9 100644
--- a/Viewer/src/AstCollateVNodesVisitor.hpp
+++ b/Viewer/src/AstCollateVNodesVisitor.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -13,17 +13,14 @@
#include "ExprAstVisitor.hpp"
-//#include <set>
#include <vector>
class VItem;
-#include "VItemTmp.hpp"
-
class AstCollateVNodesVisitor : public ecf::ExprAstVisitor
{
public:
- AstCollateVNodesVisitor(std::vector<VItemTmp_ptr>& );
+ AstCollateVNodesVisitor(std::vector<VItem*>& );
virtual ~AstCollateVNodesVisitor();
virtual void visitTop(AstTop*){}
@@ -49,10 +46,10 @@ public:
virtual void visitEventState(AstEventState*);
virtual void visitNode(AstNode*);
virtual void visitVariable(AstVariable*);
+ virtual void visitFlag(AstFlag*);
private:
- //std::set<VItem*>& theSet_;
- std::vector<VItemTmp_ptr>& items_;
+ std::vector<VItem*>& items_;
};
#endif // ASTCOLLATEVNODESVISITOR_HPP
diff --git a/Viewer/src/AttributeEditor.cpp b/Viewer/src/AttributeEditor.cpp
index 52d0022..f2d552b 100644
--- a/Viewer/src/AttributeEditor.cpp
+++ b/Viewer/src/AttributeEditor.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -17,7 +17,7 @@
#include "ServerHandler.hpp"
#include "UiLog.hpp"
#include "VConfig.hpp"
-#include "VRepeat.hpp"
+#include "VRepeatAttr.hpp"
#include <QPushButton>
@@ -28,7 +28,7 @@
static QList<AttributeEditor*> editors;
#endif
-AttributeEditor::AttributeEditor(VInfo_ptr info,QString type,QWidget* parent) : QDialog(parent), info_(info), type_(type), form_(0)
+AttributeEditor::AttributeEditor(VInfo_ptr info,QString type,QWidget* parent) : QDialog(parent), info_(info), form_(0), type_(type)
{
setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
@@ -61,7 +61,7 @@ AttributeEditor::~AttributeEditor()
#ifdef _USE_MODELESS_ATTRIBUTEDITOR
editors.removeOne(this);
#endif
-}
+}
void AttributeEditor::edit(VInfo_ptr info,QWidget *parent)
{
@@ -83,9 +83,9 @@ void AttributeEditor::edit(VInfo_ptr info,QWidget *parent)
//For repeats we create an editor for each type
std::string typeStr=a->type()->strName();
- if(a->type()->name() == "repeat")
- {
- typeStr+="_" + VRepeat::type(info->node());
+ if(a->type() == VAttributeType::find("repeat"))
+ {
+ typeStr+="_" + a->subType();
}
//The edtior will be automatically deleted on close (Qt::WA_DeleteOnClose is set)
@@ -230,7 +230,9 @@ void AttributeEditor::notifyBeginNodeChange(const VNode* vn, const std::vector<e
#endif
VAttribute* a=info_->attribute();
Q_ASSERT(a);
- if(!a->isValid(info_->node(),attrData_))
+ if(1)
+ //if(info->node()->isValidAttribute(a) == false)
+ //if(!a->isValid(info_->node(),attrData_))
{
#ifdef _UI_ATTRIBUTEDITOR_DEBUG
UiLog().dbg() << " attribute does not exist";
@@ -241,8 +243,8 @@ void AttributeEditor::notifyBeginNodeChange(const VNode* vn, const std::vector<e
}
}
else
- {
- //TODO: figure ot what to do when the edited attribute changed
+ {
+ nodeChanged(aspect);
}
}
#ifdef _UI_ATTRIBUTEDITOR_DEBUG
@@ -359,3 +361,18 @@ void AttributeEditor::notifyServerConnectState(ServerHandler* server)
}
}
}
+
+void AttributeEditor::doNotUseReset()
+{
+ if(QPushButton *resetPb=buttonBox_->button(QDialogButtonBox::Reset))
+ {
+ resetPb->setEnabled(false);
+ resetPb->hide();
+ }
+}
+
+void AttributeEditor::disableCancel()
+{
+ if(QPushButton *cancelPb=buttonBox_->button(QDialogButtonBox::Cancel))
+ cancelPb->hide();
+}
diff --git a/Viewer/src/AttributeEditor.hpp b/Viewer/src/AttributeEditor.hpp
index 8c99d6d..e75b543 100644
--- a/Viewer/src/AttributeEditor.hpp
+++ b/Viewer/src/AttributeEditor.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -60,9 +60,12 @@ protected:
void setSuspended(bool);
void addForm(QWidget* w);
void hideForm();
+ void doNotUseReset();
+ void disableCancel();
virtual void apply()=0;
virtual void resetValue()=0;
virtual bool isValueChanged()=0;
+ virtual void nodeChanged(const std::vector<ecf::Aspect::Type>& a) {}
VInfo_ptr info_;
QStringList attrData_;
diff --git a/Viewer/src/AttributeEditorFactory.cpp b/Viewer/src/AttributeEditorFactory.cpp
index db1a5de..3297010 100644
--- a/Viewer/src/AttributeEditorFactory.cpp
+++ b/Viewer/src/AttributeEditorFactory.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/AttributeEditorFactory.hpp b/Viewer/src/AttributeEditorFactory.hpp
index 08714c2..60c1696 100644
--- a/Viewer/src/AttributeEditorFactory.hpp
+++ b/Viewer/src/AttributeEditorFactory.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/AttributeSearchPanel.cpp b/Viewer/src/AttributeSearchPanel.cpp
index 5fd1482..d05bbbe 100644
--- a/Viewer/src/AttributeSearchPanel.cpp
+++ b/Viewer/src/AttributeSearchPanel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -81,29 +81,6 @@ protected:
QGridLayout* grid_;
};
-
-#if 0
-QString AttrGroupDesc::query() const
-{
- QString q;
- Q_FOREACH(AttrLineDesc* line, lines_)
- {
- QString s=line->value();
- if(!s.isEmpty())
- {
- if(!q.isEmpty())
- q+=" or ";
- q+=line->name() + " =\'" + s + "\'";
- }
- }
-
- if(q.isEmpty())
- q=name_;
-
- return q;
-}
-#endif
-
void AttrGroupDesc::hide()
{
Q_FOREACH(AttrLineDesc* item,lines_)
@@ -151,94 +128,10 @@ AttributeSearchPanel::AttributeSearchPanel(QWidget* parent) :
query_(NULL)
{
//setupUi(this);
-#if 0
- QVBoxLayout* vb=new QVBoxLayout;
- setLayout(vb);
- vb->setContentsMargins(0,0,0,0);
-
- grid_=new QGridLayout();
- vb->addLayout(grid_);
- vb->addStretch(1);
-
- //Build groups
- //QStringList attGroupNames;
- //attGroupNames << "date" << "event" << "label" << "late" << "limit" << "limiter" << "meter"
- // << "repeat" << "time" << "trigger" << "variable";
-
-//TODO
-
- Q_FOREACH(NodeQueryAttrDef* aDef,NodeQuery::attrDef().values())
- {
- Q_ASSERT(aDef);
- QString grName=aDef->name();
- //AttrGroupDesc* gr=new AttrGroupDesc(grName,grid_);
- //groups_[grName]=gr;
-
- Q_FOREACH(NodeQueryDef* d,aDef->defs())
- {
- //NodeQueryOptionEdit *e=new NodeQueryStringOptionEdit(d->name(),grid_,this);
- //groups_[grName] << e;
-
-#if 0
- AttrLineStringDesc* line=new AttrLineStringDesc(text,row,le);
-
- QMap<QString,AttrGroupDesc*>::iterator it=groups_.find(group);
- assert(it != groups_.end());
- it.value()->add(line);
-#endif
- //e->setVisible(false);
-
- //addStringLine(d->label(),d->name(),grName);
- }
- }
-
- /*
-
- //Populate groups
- addStringLine("Date name","date_name","date");
- addStringLine("Event name","event_name","event");
- //addStringLine("Date name","date_name","date");
- addStringLine("Label name","label_name","label");
- addStringLine("Label value","label_value","label");
- addStringLine("Late name","late_name","late");
- addStringLine("Limit name","limit_name","limit");
- addStringLine("Limit value","limit_value","limit");
- addStringLine("Limit max","limit_max","limit");
- addStringLine("Limiter name","limiter_name","limiter");
- addStringLine("Meter name","meter_name","meter");
- addStringLine("Repeat name","repeat_name","repeat");
- addStringLine("Repeat value","repeat_value","repeat");
- addStringLine("Time name","time_name","time");
- addStringLine("Trigger expression","trigger_expression","trigger");
- addStringLine("Variable name","variable_name","variable");
- addStringLine("Variable value","variable_value","variable");
-*/
- //Initialise lines
-
-#if 0
- QMapIterator<QString,AttrGroupDesc*> it(groups_);
- while (it.hasNext())
- {
- it.next();
- it.value()->hide();
- }
- hide();
-#endif
-
-#endif
-
}
AttributeSearchPanel::~AttributeSearchPanel()
{
-#if 0
- QMapIterator<QString,AttrGroupDesc*> it(groups_);
- while (it.hasNext())
- {
- it.next();
- delete it.value();
- }
-#endif
}
void AttributeSearchPanel::setQuery(NodeQuery* query)
@@ -246,52 +139,6 @@ void AttributeSearchPanel::setQuery(NodeQuery* query)
query_=query;
}
-#if 0
-void AttributeSearchPanel::addStringLine(QString labelTxt,QString text,QString group)
-{
- QLabel *label=new QLabel(labelTxt + ":",this);
- QLineEdit* le=new QLineEdit(this);
- StringMatchCombo *matchCb=new StringMatchCombo(this);
-#if 0
- CaseSensitiveButton* caseTb=new CaseSensitiveButton(this);
-#endif
- le->setProperty("id",text);
- matchCb->setProperty("id",text);
-
-#if 0
- caseTb->setProperty("id",text);
-#endif
-
-#if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
- le->setClearButtonEnabled(true);
-#endif
-
- int row=grid_->rowCount();
- grid_->addWidget(label,row,0);
- grid_->addWidget(matchCb,row,1);
- grid_->addWidget(le,row,2);
-#if 0
- grid_->addWidget(caseTb,row,3);
-#endif
- connect(le,SIGNAL(textEdited(QString)),
- this,SLOT(slotTextEdited(QString)));
-
- connect(matchCb,SIGNAL(currentIndexChanged(int)),
- this,SLOT(slotMatchChanged(int)));
-
-#if 0
- connect(caseTb,SIGNAL(changed(bool)),
- this,SLOT(slotCaseChanged(bool)));
-#endif
-
- AttrLineStringDesc* line=new AttrLineStringDesc(text,row,le);
-
- QMap<QString,AttrGroupDesc*>::iterator it=groups_.find(group);
- assert(it != groups_.end());
- it.value()->add(line);
-}
-#endif
-
void AttributeSearchPanel::setSelection(QStringList lst)
{
if(lst == selection_)
@@ -329,35 +176,6 @@ void AttributeSearchPanel::setSelection(QStringList lst)
selection_=lst;
buildQuery();
-
-#if 0
- QMapIterator<QString,QList<NodeQueryOptionEdit*> >> it(groups_);
- while (it.hasNext())
- {
- it.next();
- bool inNew=lst.contains(it.key());
- bool inCurrent=selection_.contains(it.key());
-
- if(inNew && !inCurrent)
- {
- it.value()->show();
- }
- else if(!inNew && inCurrent)
- {
- it.value()->hide();
- }
- }
-
- if(lst.isEmpty())
- hide();
- else
- show();
-
- selection_=lst;
-
- buildQuery();
-#endif
-
}
void AttributeSearchPanel::clearSelection()
@@ -370,61 +188,6 @@ void AttributeSearchPanel::slotOptionEditChanged()
}
-
-#if 0
-void AttributeSearchPanel::slotTextEdited(QString val)
-{
- if(QLineEdit *le=static_cast<QLineEdit*>(sender()))
- {
-#if 0
- QString id=le->property("id").toString();
- if(NodeQueryStringOption *op=query_->stringOption(id))
- {
- op->setValue(val);
- }
-#endif
- Q_EMIT queryChanged();
- }
-
- buildQuery();
-}
-
-void AttributeSearchPanel::slotMatchChanged(int val)
-{
- if(StringMatchCombo *cb=static_cast<StringMatchCombo*>(sender()))
- {
-#if 0
- QString id=cb->property("id").toString();
- if(NodeQueryStringOption *op=query_->stringOption(id))
- {
- op->setMatchMode(cb->currentMatchMode());
- }
-#endif
- Q_EMIT queryChanged();
- }
-
- buildQuery();
-}
-#endif
-
-
-
-#if 0
-void AttributeSearchPanel::slotCaseChanged(bool val)
-{
- if(CaseSensitiveButton *tb=static_cast<CaseSensitiveButton*>(sender()))
- {
- QString id=tb->property("id").toString();
- if(NodeQueryStringOption *op=query_->stringOption(id))
- {
- op->setCaseSensitive(val);
- }
- }
-
- buildQuery();
-}
-#endif
-
void AttributeSearchPanel::buildQuery()
{
/*query_.clear();
diff --git a/Viewer/src/AttributeSearchPanel.hpp b/Viewer/src/AttributeSearchPanel.hpp
index 4199791..47abcf1 100644
--- a/Viewer/src/AttributeSearchPanel.hpp
+++ b/Viewer/src/AttributeSearchPanel.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/AttributeView.hpp b/Viewer/src/AttributeView.hpp
index 9aa8f3d..1f74ec4 100644
--- a/Viewer/src/AttributeView.hpp
+++ b/Viewer/src/AttributeView.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/CMakeLists.txt b/Viewer/src/CMakeLists.txt
index f111810..fede923 100644
--- a/Viewer/src/CMakeLists.txt
+++ b/Viewer/src/CMakeLists.txt
@@ -17,10 +17,13 @@ set(viewer_srcs
ChangeNotifyModel.cpp
ChangeNotifyWidget.cpp
CodeItemWidget.cpp
- ConnectState.cpp
ComboMulti.cpp
CommandDesignerWidget.cpp
+ CompactView.cpp
+ CompactNodeView.cpp
+ CompactNodeViewDelegate.cpp
ConfigListDelegate.cpp
+ ConnectState.cpp
CustomCommandDialog.cpp
CustomCommandHandler.cpp
CustomListWidget.cpp
@@ -34,14 +37,16 @@ set(viewer_srcs
EditItemWidget.cpp
EditProvider.cpp
EditorInfoLabel.cpp
- ExpandState.cpp
+ ExpandStateNode.cpp
FlagSet.hpp
FileInfoLabel.cpp
FileWatcher.cpp
FilterWidget.cpp
+ FontMetrics.cpp
GotoLineDialog.cpp
Highlighter.cpp
HistoryItemWidget.cpp
+ HtmlItemWidget.cpp
IconProvider.cpp
InfoPanel.cpp
InfoPanelItem.cpp
@@ -52,10 +57,8 @@ set(viewer_srcs
LabelEditor.cpp
LimitEditor.cpp
LineEdit.cpp
- LogEvent.cpp
LogModel.cpp
- LogProvider.cpp
- LogServer.cpp
+ LogProvider.cpp
LogTruncator.cpp
MainWindow.cpp
ManualItemWidget.cpp
@@ -106,6 +109,7 @@ set(viewer_srcs
PropertyEditor.cpp
PropertyLine.cpp
PropertyMapper.cpp
+ RectMetrics.cpp
RepeatEditor.cpp
SaveSessionAsDialog.cpp
ScriptItemWidget.cpp
@@ -136,6 +140,9 @@ set(viewer_srcs
TableNodeView.cpp
TableNodeViewDelegate.cpp
TableNodeWidget.cpp
+ RichTextEdit.cpp
+ RichTextSearchInterface.cpp
+ RichTextSearchLine.cpp
TextEditSearchLine.cpp
TimeItemWidget.cpp
TriggerBrowser.cpp
@@ -145,6 +152,7 @@ set(viewer_srcs
TreeNodeModel.cpp
TreeNodeView.cpp
TreeNodeViewDelegate.cpp
+ TreeNodeViewDelegateBase.cpp
TreeNodeWidget.cpp
TreeView.cpp
TriggerCollector.cpp
@@ -157,7 +165,9 @@ set(viewer_srcs
VAttribute.cpp
VAttributeType.cpp
VConfig.cpp
+ VDateAttr.cpp
VDir.cpp
+ VEventAttr.cpp
VFilter.cpp
VIcon.cpp
VInfo.cpp
@@ -165,21 +175,29 @@ set(viewer_srcs
VFileInfo.cpp
VItem.cpp
VItemPathParser.cpp
- VItemTmp.cpp
+ VLabelAttr.cpp
+ VLateAttr.cpp
+ VLimitAttr.cpp
+ VLimiterAttr.cpp
+ VMeterAttr.cpp
VModelData.cpp
VNode.cpp
VNodeList.cpp
VNState.cpp
VParam.cpp
VProperty.cpp
- VRepeat.cpp
+ VRepeatAttr.cpp
VReply.cpp
VServerSettings.cpp
VSettings.cpp
VSState.cpp
VTask.cpp
VTaskNode.cpp
+ VTimeAttr.cpp
VTree.cpp
+ VTriggerAttr.cpp
+ VGenVarAttr.cpp
+ VUserVarAttr.cpp
VariableModel.cpp
VariableModelData.cpp
VariableItemWidget.cpp
@@ -218,9 +236,11 @@ set(viewer_moc_files AbstractNodeModel.hpp
ChangeNotifyEditor.hpp
ChangeNotifyModel.hpp
ChangeNotifyWidget.hpp
- ComboMulti.hpp
- CommandDesignerWidget.hpp
CodeItemWidget.hpp
+ ComboMulti.hpp
+ CommandDesignerWidget.hpp
+ CompactView.hpp
+ CompactNodeView.hpp
CustomCommandDialog.hpp
CustomListWidget.hpp
Dashboard.hpp
@@ -233,6 +253,7 @@ set(viewer_moc_files AbstractNodeModel.hpp
FilterWidget.hpp
GotoLineDialog.hpp
HistoryItemWidget.hpp
+ HtmlItemWidget.hpp
InfoPanel.hpp
InputEventLog.hpp
LabelEditor.hpp
@@ -271,6 +292,7 @@ set(viewer_moc_files AbstractNodeModel.hpp
PropertyLine.hpp
SaveSessionAsDialog.hpp
RepeatEditor.hpp
+ RichTextEdit.hpp
ServerComQueue.hpp
ServerComThread.hpp
ServerHandler.hpp
@@ -290,7 +312,7 @@ set(viewer_moc_files AbstractNodeModel.hpp
TextEditSearchLine.hpp
TreeNodeModel.hpp
TreeNodeView.hpp
- TreeNodeViewDelegate.hpp
+ TreeNodeViewDelegateBase.hpp
TreeNodeWidget.hpp
TriggerBrowser.hpp
TriggerEditor.hpp
@@ -329,7 +351,8 @@ set(viewer_wrap_ui_files
EditItemWidget.ui
GotoLineDialog.ui
HistoryItemWidget.ui
- InfoPanel.ui
+ HtmlItemWidget.ui
+ InfoPanel.ui
LabelEditorWidget.ui
LimitEditorWidget.ui
MainWindow.ui
diff --git a/Viewer/src/CaseSensitiveButton.cpp b/Viewer/src/CaseSensitiveButton.cpp
index cbebbe3..096814d 100644
--- a/Viewer/src/CaseSensitiveButton.cpp
+++ b/Viewer/src/CaseSensitiveButton.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/CaseSensitiveButton.hpp b/Viewer/src/CaseSensitiveButton.hpp
index 279644d..c7c3cd5 100644
--- a/Viewer/src/CaseSensitiveButton.hpp
+++ b/Viewer/src/CaseSensitiveButton.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ChangeNotify.cpp b/Viewer/src/ChangeNotify.cpp
index f69a84a..1bf0eb9 100644
--- a/Viewer/src/ChangeNotify.cpp
+++ b/Viewer/src/ChangeNotify.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -176,7 +176,7 @@ void ChangeNotify::setProperty(VProperty* prop)
QStringList lst;
const std::vector<std::string>& vals=Sound::instance()->sysSounds();
- for(std::vector<std::string>::const_iterator it=vals.begin(); it != vals.end(); it++)
+ for(std::vector<std::string>::const_iterator it=vals.begin(); it != vals.end(); ++it)
{
lst << QString::fromStdString(*it);
}
diff --git a/Viewer/src/ChangeNotify.hpp b/Viewer/src/ChangeNotify.hpp
index 2e76145..bea9d78 100644
--- a/Viewer/src/ChangeNotify.hpp
+++ b/Viewer/src/ChangeNotify.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ChangeNotifyDialog.cpp b/Viewer/src/ChangeNotifyDialog.cpp
index 20efb50..b876ba9 100644
--- a/Viewer/src/ChangeNotifyDialog.cpp
+++ b/Viewer/src/ChangeNotifyDialog.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -25,6 +25,8 @@
#include <QSettings>
#include <QVariant>
+Q_DECLARE_METATYPE(QList<int>)
+
ChangeNotifyDialogWidget::ChangeNotifyDialogWidget(QWidget *parent) :
QWidget(parent),
notifier_(0)
@@ -111,6 +113,46 @@ void ChangeNotifyDialogWidget::slotDoubleClickItem(const QModelIndex&)
}
+void ChangeNotifyDialogWidget::writeSettings(QSettings& settings)
+{
+ QList<int> wVec;
+ for(int i=0; i < tree_->model()->columnCount(QModelIndex()); i++)
+ {
+ wVec.push_back(tree_->columnWidth(i));
+ }
+ settings.setValue("colWidth",QVariant::fromValue(wVec));
+}
+
+void ChangeNotifyDialogWidget::readSettings(const QSettings& settings)
+{
+ QList<int> wVec;
+ if(settings.contains("colWidth"))
+ {
+ wVec=settings.value("colWidth").value<QList<int> >();
+ if(wVec.count() >0 && wVec[0] < 1)
+ wVec.clear();
+ }
+
+ if(!wVec.isEmpty())
+ {
+ for(int i=0; i < tree_->model()->columnCount(QModelIndex()); i++)
+ {
+ if(wVec.count() > i && wVec[i] > 0)
+ tree_->setColumnWidth(i,wVec[i]);
+ }
+ }
+ else
+ {
+ if(tree_->model()->columnCount(QModelIndex()) > 1)
+ {
+ QFont f;
+ QFontMetrics fm(f);
+ tree_->setColumnWidth(0,fm.width("serverserverserver"));
+ tree_->setColumnWidth(1,fm.width("/suite1/family1/family2/family3/family4/task"));
+ }
+ }
+}
+
//===========================================================
//
// ChangeNotifyDialog
@@ -147,8 +189,6 @@ ChangeNotifyDialog::~ChangeNotifyDialog()
void ChangeNotifyDialog::addTab(ChangeNotify* notifier)
{
- const std::string& id=notifier->id();
-
ChangeNotifyDialogWidget* w=new ChangeNotifyDialogWidget(this);
w->init(notifier);
@@ -169,6 +209,8 @@ void ChangeNotifyDialog::addTab(ChangeNotify* notifier)
updateStyleSheet(notifier->prop());
decorateTab(idx,notifier);
+
+ readTabSettings(tab_->count()-1);
}
void ChangeNotifyDialog::slotContentsChanged()
@@ -261,13 +303,8 @@ void ChangeNotifyDialog::decorateTab(int tabIdx,ChangeNotify* notifier)
numF.setPointSize(f.pointSize()-1);
QFontMetrics numFm(numF);
- int w;
int h=2*margin+textH+4;
- if(!numText.isEmpty())
- //w=2*margin+textW + 3 + numFm.width(numText) + 3;
- w=2*margin+textW;
- else
- w=2*margin+textW;
+ int w=2*margin+textW;
QPixmap pix(w,h);
pix.fill(Qt::transparent);
@@ -466,7 +503,14 @@ void ChangeNotifyDialog::writeSettings()
settings.beginGroup("main");
settings.setValue("size",size());
settings.setValue("clearOnClose",clearOnCloseCb_->isChecked());
- settings.endGroup();
+ settings.endGroup();
+
+ for(int i=0; i < tab_->count(); i++)
+ {
+ settings.beginGroup("tab_" + QString::number(i));
+ tabWidgets_[i]->writeSettings(settings);
+ settings.endGroup();
+ }
}
void ChangeNotifyDialog::readSettings()
@@ -483,7 +527,7 @@ void ChangeNotifyDialog::readSettings()
}
else
{
- resize(QSize(440,380));
+ resize(QSize(540,460));
}
if(settings.contains("clearOnClose"))
@@ -492,4 +536,19 @@ void ChangeNotifyDialog::readSettings()
}
settings.endGroup();
+
+ //The tab settings are read when the actual tabs are created later.
+}
+
+void ChangeNotifyDialog::readTabSettings(int tabIndex)
+{
+ SessionItem* cs=SessionHandler::instance()->current();
+ Q_ASSERT(cs);
+ QSettings settings(QString::fromStdString(cs->qtSettingsFile("ChangeNotifyDialog")),
+ QSettings::NativeFormat);
+
+ settings.beginGroup("tab_" + QString::number(tabIndex));
+ Q_ASSERT(tab_->count() > tabIndex);
+ tabWidgets_[tabIndex]->readSettings(settings);
+ settings.endGroup();
}
diff --git a/Viewer/src/ChangeNotifyDialog.hpp b/Viewer/src/ChangeNotifyDialog.hpp
index 6fb7bb1..a6b09b6 100644
--- a/Viewer/src/ChangeNotifyDialog.hpp
+++ b/Viewer/src/ChangeNotifyDialog.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -13,6 +13,7 @@
#include <QDialog>
#include <QLinearGradient>
+#include <QSettings>
#include <QWidget>
#include "ui_ChangeNotifyDialog.h"
@@ -36,6 +37,8 @@ public:
void init(ChangeNotify*);
void update(ChangeNotify*);
ChangeNotify* notifier() const {return notifier_;}
+ void writeSettings(QSettings& settings);
+ void readSettings(const QSettings& settings);
public Q_SLOTS:
void slotAppend();
@@ -86,6 +89,7 @@ protected:
void closeEvent(QCloseEvent*);
void writeSettings();
void readSettings();
+ void readTabSettings(int tabIndex);
QList<ChangeNotifyDialogWidget*> tabWidgets_;
bool ignoreCurrentChange_;
diff --git a/Viewer/src/ChangeNotifyEditor.cpp b/Viewer/src/ChangeNotifyEditor.cpp
index e1a0844..cf15ac6 100644
--- a/Viewer/src/ChangeNotifyEditor.cpp
+++ b/Viewer/src/ChangeNotifyEditor.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ChangeNotifyEditor.hpp b/Viewer/src/ChangeNotifyEditor.hpp
index f39b9ac..b45acff 100644
--- a/Viewer/src/ChangeNotifyEditor.hpp
+++ b/Viewer/src/ChangeNotifyEditor.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ChangeNotifyModel.cpp b/Viewer/src/ChangeNotifyModel.cpp
index 90b857a..beb0c17 100644
--- a/Viewer/src/ChangeNotifyModel.cpp
+++ b/Viewer/src/ChangeNotifyModel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ChangeNotifyModel.hpp b/Viewer/src/ChangeNotifyModel.hpp
index e5a8119..e616792 100644
--- a/Viewer/src/ChangeNotifyModel.hpp
+++ b/Viewer/src/ChangeNotifyModel.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ChangeNotifyWidget.cpp b/Viewer/src/ChangeNotifyWidget.cpp
index 1e24bd2..c40c9f5 100644
--- a/Viewer/src/ChangeNotifyWidget.cpp
+++ b/Viewer/src/ChangeNotifyWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -125,13 +125,19 @@ void ChangeNotifyButton::updateIcon()
f.setBold(true);
f.setPointSize(f.pointSize());
QFontMetrics fm(f);
+
+ QFont fNum;
+ fNum.setBold(true);
+ fNum.setPointSize(f.pointSize()-1);
+ QFontMetrics fmNum(fNum);
+
int w;
if(!numText.isEmpty())
w=fm.width(text) + 6 + fm.width(numText) + 2;
else
w=fm.width(text) + 6;
- int h=fm.height()+6;
+ int h=fm.height()+2;
QPixmap pix(w,h);
pix.fill(QColor(255,255,255,0));
@@ -146,7 +152,7 @@ void ChangeNotifyButton::updateIcon()
grad_.setColorAt(1,bgCol);
painter.setBrush(QBrush(grad_));
- painter.setPen(border);
+ painter.setPen(bgCol.darker(150));
painter.drawRoundedRect(textRect,2,2);
painter.setPen(fgCol);
painter.setFont(f);
@@ -154,11 +160,11 @@ void ChangeNotifyButton::updateIcon()
if(!numText.isEmpty())
{
- QRect numRect(textRect.right()-1,0,fm.width(numText)+4,fm.ascent()+4);
+ QRect numRect(textRect.right()-1,0,fmNum.width(numText)+4,fmNum.ascent()+2);
painter.setBrush(countBgCol);
painter.setPen(countFgCol);
painter.drawRoundedRect(numRect,4,4);
- painter.setFont(f);
+ painter.setFont(fNum);
painter.drawText(numRect,Qt::AlignHCenter|Qt::AlignVCenter,numText);
}
@@ -208,7 +214,7 @@ void ChangeNotifyWidget::addTb(ChangeNotify* notifier)
void ChangeNotifyWidget::setEnabled(const std::string& id,bool b)
{
- for(std::vector<ChangeNotifyWidget*>::iterator it=widgets_.begin(); it!= widgets_.end(); it++)
+ for(std::vector<ChangeNotifyWidget*>::iterator it=widgets_.begin(); it!= widgets_.end(); ++it)
{
if(ChangeNotifyButton* tb=(*it)->findButton(id))
{
@@ -219,7 +225,7 @@ void ChangeNotifyWidget::setEnabled(const std::string& id,bool b)
void ChangeNotifyWidget::updateSettings(const std::string& id)
{
- for(std::vector<ChangeNotifyWidget*>::iterator it=widgets_.begin(); it!= widgets_.end(); it++)
+ for(std::vector<ChangeNotifyWidget*>::iterator it=widgets_.begin(); it!= widgets_.end(); ++it)
{
if(ChangeNotifyButton* tb=(*it)->findButton(id))
{
diff --git a/Viewer/src/ChangeNotifyWidget.hpp b/Viewer/src/ChangeNotifyWidget.hpp
index 339e530..340ee44 100644
--- a/Viewer/src/ChangeNotifyWidget.hpp
+++ b/Viewer/src/ChangeNotifyWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/CodeItemWidget.cpp b/Viewer/src/CodeItemWidget.cpp
index 76318ed..bbe11a5 100644
--- a/Viewer/src/CodeItemWidget.cpp
+++ b/Viewer/src/CodeItemWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -68,3 +68,8 @@ void CodeItemWidget::on_fontSizeDownTb__clicked()
//We need to call a custom slot here instead of "zoomOut"!!!
textEdit_->slotZoomOut();
}
+
+void CodeItemWidget::on_reloadTb__clicked()
+{
+ reloadRequested();
+}
diff --git a/Viewer/src/CodeItemWidget.hpp b/Viewer/src/CodeItemWidget.hpp
index 0f2b839..5bf342f 100644
--- a/Viewer/src/CodeItemWidget.hpp
+++ b/Viewer/src/CodeItemWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -28,12 +28,14 @@ protected Q_SLOTS:
void on_gotoLineTb__clicked();
void on_fontSizeUpTb__clicked();
void on_fontSizeDownTb__clicked();
+ void on_reloadTb__clicked();
Q_SIGNALS:
void editorFontSizeChanged();
protected:
void removeSpacer();
+ virtual void reloadRequested()=0;
};
#endif
diff --git a/Viewer/src/CodeItemWidget.ui b/Viewer/src/CodeItemWidget.ui
index 3cfdc32..3a38c29 100644
--- a/Viewer/src/CodeItemWidget.ui
+++ b/Viewer/src/CodeItemWidget.ui
@@ -17,11 +17,20 @@
<property name="spacing">
<number>1</number>
</property>
- <property name="margin">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
<number>0</number>
</property>
<item>
- <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,0,0,0,0,0,0">
+ <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,0,0,0,0,0,0,0">
<property name="spacing">
<number>1</number>
</property>
@@ -147,6 +156,23 @@
</property>
</widget>
</item>
+ <item>
+ <widget class="QToolButton" name="reloadTb_">
+ <property name="toolTip">
+ <string>Reload</string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="icon">
+ <iconset resource="viewer.qrc">
+ <normaloff>:/viewer/sync_black.svg</normaloff>:/viewer/sync_black.svg</iconset>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
</layout>
</item>
<item>
diff --git a/Viewer/src/ComboMulti.cpp b/Viewer/src/ComboMulti.cpp
index 89c8e1f..24ce486 100644
--- a/Viewer/src/ComboMulti.cpp
+++ b/Viewer/src/ComboMulti.cpp
@@ -87,8 +87,6 @@ void ComboMulti::slotChecked()
QString s;
selection_.clear();
- int cnt=0;
-
for(int i=0; i < model()->rowCount(); i++)
{
if(model()->data(model()->index(i,0),Qt::CheckStateRole).toBool())
diff --git a/Viewer/src/CommandDesignerWidget.cpp b/Viewer/src/CommandDesignerWidget.cpp
index 210f558..b2cb788 100644
--- a/Viewer/src/CommandDesignerWidget.cpp
+++ b/Viewer/src/CommandDesignerWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -207,13 +207,12 @@ void CommandDesignerWidget::on_nodeSelectionChanged()
}
-std::vector<VInfo_ptr> &CommandDesignerWidget::selectedNodes()
+std::vector<VInfo_ptr>& CommandDesignerWidget::selectedNodes()
{
nodeSelectionView_->getListOfSelectedNodes(nodes_);
return nodes_;
}
-
void CommandDesignerWidget::addClientCommandsToComponentList()
{
// sort the commands into alphabetical order
@@ -444,7 +443,7 @@ void CommandDesignerWidget::on_saveAsNewButton__clicked()
if (validSaveName(name))
{
- CustomCommand *cmd = CustomSavedCommandHandler::instance()->add(name, command, context, true);
+ CustomSavedCommandHandler::instance()->add(name, command, context, true);
refreshSavedCommandList();
currentCommandSaved_ = true;
updateSaveButtonStatus();
@@ -466,7 +465,7 @@ void CommandDesignerWidget::on_overwriteButton__clicked()
if (validSaveName(name))
{
- CustomCommand *cmd = CustomSavedCommandHandler::instance()->replace(savedCommandsTable_->currentRow(), name, command, context);
+ CustomSavedCommandHandler::instance()->replace(savedCommandsTable_->currentRow(), name, command, context);
savedCommandsTable_->setEnabled(true); // to show that we are no longer busy editing an entry
inCommandEditMode_ = false;
refreshSavedCommandList();
diff --git a/Viewer/src/CommandDesignerWidget.hpp b/Viewer/src/CommandDesignerWidget.hpp
index 0546655..0eebbb3 100644
--- a/Viewer/src/CommandDesignerWidget.hpp
+++ b/Viewer/src/CommandDesignerWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -32,7 +32,7 @@ public:
MenuItem &menuItem();
void setNodes(std::vector<VInfo_ptr> &nodes);
- std::vector<VInfo_ptr> &selectedNodes();
+ std::vector<VInfo_ptr>& selectedNodes();
diff --git a/Viewer/src/CompactNodeView.cpp b/Viewer/src/CompactNodeView.cpp
new file mode 100644
index 0000000..90819a8
--- /dev/null
+++ b/Viewer/src/CompactNodeView.cpp
@@ -0,0 +1,555 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "CompactNodeView.hpp"
+
+#include <QDebug>
+#include <QMouseEvent>
+#include <QScrollBar>
+#include <QTime>
+
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+#include <QGuiApplication>
+#endif
+
+#include "ActionHandler.hpp"
+#include "Animation.hpp"
+#include "AttributeEditor.hpp"
+#include "CompactNodeViewDelegate.hpp"
+#include "ExpandState.hpp"
+#include "PropertyMapper.hpp"
+#include "TreeNodeModel.hpp"
+#include "TreeNodeViewDelegate.hpp"
+#include "UIDebug.hpp"
+#include "UiLog.hpp"
+#include "VFilter.hpp"
+#include "VModelData.hpp"
+#include "VTree.hpp"
+
+#define _UI_COMPACTNODEVIEW_DEBUG
+
+CompactNodeView::CompactNodeView(TreeNodeModel* model,NodeFilterDef* filterDef,QWidget* parent) :
+ CompactView(model,parent),
+ NodeViewBase(filterDef),
+ needItemsLayout_(false),
+ //defaultIndentation_(indentation()),
+ prop_(NULL),
+ setCurrentIsRunning_(false),
+ setCurrentFromExpand_(false),
+ inStartUp_(true)
+{
+ setObjectName("view");
+ setProperty("style","nodeView");
+ setProperty("view","tree");
+
+ setContextMenuPolicy(Qt::CustomContextMenu);
+
+ //Context menu
+ connect(this, SIGNAL(customContextMenuRequested(const QPoint &)),
+ this, SLOT(slotContextMenu(const QPoint &)));
+
+ //Selection
+ connect(this,SIGNAL(doubleClicked(const QModelIndex&)),
+ this,SLOT(slotDoubleClickItem(const QModelIndex)));
+
+ //expandState_=new ExpandState(this,model_);
+ actionHandler_=new ActionHandler(this);
+
+ connect(delegate_,SIGNAL(sizeHintChangedGlobal()),
+ this,SLOT(slotSizeHintChangedGlobal()));
+
+ //Properties
+ std::vector<std::string> propVec;
+ propVec.push_back("view.tree.background");
+ propVec.push_back("view.tree.branchLineColour");
+ propVec.push_back("view.tree.serverToolTip");
+ propVec.push_back("view.tree.nodeToolTip");
+ propVec.push_back("view.tree.attributeToolTip");
+ prop_=new PropertyMapper(propVec,this);
+
+ VProperty *prop=0;
+ std::string propName;
+
+ //Init stylesheet related properties
+ propName="view.tree.background";
+ prop=prop_->find(propName);
+ UI_ASSERT(prop,"Could not find property=" + propName);
+ adjustBackground(prop->value().value<QColor>());
+
+ //Init stylesheet related properties
+ propName="view.tree.branchLineColour";
+ prop=prop_->find(propName);
+ UI_ASSERT(prop,"Could not find property=" + propName);
+ adjustBranchLineColour(prop->value().value<QColor>());
+
+ //Adjust tooltip
+ propName="view.tree.serverToolTip";
+ prop=prop_->find(propName);
+ UI_ASSERT(prop,"Could not find property=" + propName);
+ adjustServerToolTip(prop->value().toBool());
+
+ propName="view.tree.nodeToolTip";
+ prop=prop_->find(propName);
+ UI_ASSERT(prop,"Could not find property=" + propName);
+ adjustNodeToolTip(prop->value().toBool());
+
+ propName="view.tree.attributeToolTip";
+ prop=prop_->find(propName);
+ UI_ASSERT(prop,"Could not find property=" + propName);
+ adjustAttributeToolTip(prop->value().toBool());
+
+ inStartUp_=false;
+}
+
+CompactNodeView::~CompactNodeView()
+{
+ qDeleteAll(expandStates_);
+ delete actionHandler_;
+ delete prop_;
+}
+
+QWidget* CompactNodeView::realWidget()
+{
+ return this;
+}
+
+//Collects the selected list of indexes
+QModelIndexList CompactNodeView::selectedList()
+{
+ QModelIndexList lst;
+ Q_FOREACH(QModelIndex idx,selectedIndexes())
+ if(idx.column() == 0)
+ lst << idx;
+ return lst;
+}
+
+// reimplement virtual function from CompactView - called when the selection is changed
+void CompactNodeView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
+{
+ QModelIndexList lst=selectedIndexes();
+ //When the selection was triggered from restoring (expanding) the nodes
+ //we do not want to broadcast it
+ if(lst.count() > 0 && !setCurrentFromExpand_)
+ {
+ VInfo_ptr info=model_->nodeInfo(lst.front());
+ if(info && !info->isEmpty())
+ {
+#ifdef _UI_COMPACTNODEVIEW_DEBUG
+ UiLog().dbg() << "CompactNodeView::selectionChanged --> emit=" << info->path();
+#endif
+ Q_EMIT selectionChanged(info);
+ }
+ lastSelection_=info;
+ }
+
+ CompactView::selectionChanged(selected, deselected);
+
+ //The model has to know about the selection in order to manage the
+ //nodes that are forced to be shown
+ model_->selectionChanged(lst);
+}
+
+VInfo_ptr CompactNodeView::currentSelection()
+{
+ QModelIndexList lst=selectedIndexes();
+ if(lst.count() > 0)
+ {
+ return model_->nodeInfo(lst.front());
+ }
+ return VInfo_ptr();
+}
+
+void CompactNodeView::setCurrentSelection(VInfo_ptr info)
+{
+ //While the current is being selected we do not allow
+ //another setCurrent call go through
+ if(!info || setCurrentIsRunning_)
+ return;
+
+ setCurrentIsRunning_=true;
+ QModelIndex idx=model_->infoToIndex(info);
+ if(idx.isValid())
+ {
+#ifdef _UI_COMPACTNODEVIEW_DEBUG
+ UiLog().dbg() << "CompactNodeView::setCurrentSelection --> " << info->path();
+#endif
+ setCurrentIndex(idx);
+ }
+ setCurrentIsRunning_=false;
+}
+
+
+void CompactNodeView::setCurrentSelectionFromExpand(VInfo_ptr info)
+{
+ if(!info || setCurrentFromExpand_)
+ return;
+
+#ifdef _UI_COMPACTNODEVIEW_DEBUG
+ UiLog().dbg() << "CompactNodeView::setCurrentSelectionFromExpand --> " << info->path();
+#endif
+
+ setCurrentFromExpand_=true;
+ setCurrentSelection(info);
+ setCurrentFromExpand_=false;
+}
+
+void CompactNodeView::selectFirstServer()
+{
+ QModelIndex idx=model_->index(0,0);
+ if(idx.isValid())
+ {
+ setCurrentIndex(idx);
+ VInfo_ptr info=model_->nodeInfo(idx);
+ Q_EMIT selectionChanged(info);
+ }
+}
+
+void CompactNodeView::slotContextMenu(const QPoint &position)
+{
+ QModelIndexList lst=selectedList();
+ //QModelIndex index=indexAt(position);
+ QPoint scrollOffset(horizontalScrollBar()->value(),verticalScrollBar()->value());
+
+ handleContextMenu(indexAt(position),lst,mapToGlobal(position),position+scrollOffset,this);
+}
+
+
+void CompactNodeView::handleContextMenu(QModelIndex indexClicked,QModelIndexList indexLst,QPoint globalPos,QPoint widgetPos,QWidget *widget)
+{
+ //Node actions
+ if(indexClicked.isValid() && indexClicked.column() == 0) //indexLst[0].isValid() && indexLst[0].column() == 0)
+ {
+ //qDebug() << "context menu" << indexClicked;
+
+ std::vector<VInfo_ptr> nodeLst;
+ for(int i=0; i < indexLst.count(); i++)
+ {
+ VInfo_ptr info=model_->nodeInfo(indexLst[i]);
+ if(info && !info->isEmpty())
+ nodeLst.push_back(info);
+ }
+
+ actionHandler_->contextMenu(nodeLst,globalPos);
+ }
+
+ //Desktop actions
+ else
+ {
+ }
+}
+
+void CompactNodeView::slotDoubleClickItem(const QModelIndex& idx)
+{
+ VInfo_ptr info=model_->nodeInfo(idx);
+ if(info && info->isAttribute())
+ {
+ slotViewCommand(info,"edit");
+ }
+}
+
+void CompactNodeView::slotViewCommand(VInfo_ptr info,QString cmd)
+{
+ if(cmd == "expand")
+ {
+ QModelIndex idx=model_->infoToIndex(info);
+ if(idx.isValid())
+ {
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+ QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+#endif
+#ifdef _UI_COMPACTNODEVIEW_DEBUG
+ QTime t;
+ t.start();
+#endif
+ expandAll(idx);
+#ifdef _UI_COMPACTNODEVIEW_DEBUG
+ UiLog().dbg() << "expandAll time=" << t.elapsed()/1000. << "s";
+#endif
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+ QGuiApplication::restoreOverrideCursor();
+#endif
+
+ }
+ }
+ else if(cmd == "collapse")
+ {
+ QModelIndex idx=model_->infoToIndex(info);
+ if(idx.isValid())
+ {
+ collapseAll(idx);
+ }
+ }
+
+ else if(cmd == "edit")
+ {
+ if(info && info->isAttribute())
+ {
+ AttributeEditor::edit(info,this);
+ }
+ }
+
+ /*if(cmd == "set_as_root")
+ {
+ model_->setRootNode(nodeLst.at(0)->node());
+ expandAll();
+ }*/
+}
+
+void CompactNodeView::reload()
+{
+ //model_->reload();
+ //expandAll();
+}
+
+void CompactNodeView::rerender()
+{
+ if(needItemsLayout_)
+ {
+ doItemsLayout();
+ needItemsLayout_=false;
+ }
+ else
+ {
+ viewport()->update();
+ }
+}
+
+void CompactNodeView::slotRerender()
+{
+ rerender();
+}
+
+void CompactNodeView::slotRepaint(Animation* an)
+{
+ if(!an)
+ return;
+
+ Q_FOREACH(VNode* n,an->targets())
+ {
+ update(model_->nodeToIndex(n));
+ }
+}
+
+void CompactNodeView::slotSizeHintChangedGlobal()
+{
+ needItemsLayout_=true;
+}
+
+
+//====================================================
+// Expand state management
+//====================================================
+
+#if 0
+void CompactNodeView::expandAll(const QModelIndex& idx)
+{
+ expand(idx);
+
+ for(int i=0; i < model_->rowCount(idx); i++)
+ {
+ QModelIndex chIdx=model_->index(i, 0, idx);
+ expandAll(chIdx);
+ }
+}
+#endif
+
+#if 0
+void CompactNodeView::collapseAll(const QModelIndex& idx)
+{
+ collapse(idx);
+
+ for(int i=0; i < model_->rowCount(idx); i++)
+ {
+ QModelIndex chIdx=model_->index(i, 0, idx);
+ collapseAll(chIdx);
+ }
+}
+#endif
+
+void CompactNodeView::expandTo(const QModelIndex& idxTo)
+{
+ QModelIndex idx=model_->parent(idxTo);
+ QModelIndexList lst;
+
+ //qDebug() << idxTo << idx;
+
+ while(idx.isValid())
+ {
+ lst.push_front(idx);
+ idx=idx.parent();
+ }
+
+ //qDebug() << lst;
+
+ Q_FOREACH(QModelIndex d,lst)
+ {
+ expand(d);
+ //qDebug() << "expand" << d << isExpanded(d);
+ }
+}
+
+//Save all
+void CompactNodeView::slotSaveExpand()
+{
+ for(int i=0; i < model_->rowCount(); i++)
+ {
+ QModelIndex serverIdx=model_->index(i, 0);
+ VTreeServer* ts=model_->indexToServer(serverIdx);
+ Q_ASSERT(ts);
+
+ CompactViewExpandState* es=new CompactViewExpandState(this,model_);
+ expandStates_ << es;
+ es->save(ts->tree());
+ }
+}
+
+void CompactNodeView::slotRestoreExpand()
+{
+ Q_FOREACH(CompactViewExpandState* es,expandStates_)
+ {
+ if(es->root())
+ {
+ VTreeServer* ts=model_->nameToServer(es->root()->name_);
+ if(ts)
+ {
+ QModelIndex idx=model_->nodeToIndex(ts->tree());
+ if(idx.isValid())
+ {
+ collapse(idx);
+ es->collectExpanded(ts->tree(),expandedIndexes);
+ expand(idx);
+ }
+ }
+ }
+ }
+
+ qDeleteAll(expandStates_);
+ expandStates_.clear();
+ regainSelectionFromExpand();
+}
+
+//Save the expand state for the given node (it can be a server as well)
+void CompactNodeView::slotSaveExpand(const VTreeNode* node)
+{
+ CompactViewExpandState* es=new CompactViewExpandState(this,model_);
+ expandStates_ << es;
+ es->save(node);
+}
+
+//Restore the expand state for the given node (it can be a server as well)
+void CompactNodeView::slotRestoreExpand(const VTreeNode* node)
+{
+ for(int i=0; i < expandStates_.count(); i++)
+ {
+ CompactViewExpandState* es=expandStates_[i];
+ {
+ if(es->rootSameAs(node->vnode()->strName()))
+ {
+ //es->restore(node);
+ QModelIndex idx=model_->nodeToIndex(node);
+ if(idx.isValid())
+ {
+ collapse(idx);
+ es->collectExpanded(node,expandedIndexes);
+ expand(idx);
+ }
+ expandStates_.remove(i);
+ delete es;
+ break;
+ }
+ }
+ }
+
+ regainSelectionFromExpand();
+}
+
+void CompactNodeView::regainSelectionFromExpand()
+{
+ VInfo_ptr s=currentSelection();
+ if(!s)
+ {
+ if(lastSelection_)
+ {
+ lastSelection_->regainData();
+ if(!lastSelection_->hasData())
+ {
+ lastSelection_.reset();
+ }
+ else
+ {
+ setCurrentSelectionFromExpand(lastSelection_);
+ }
+ }
+ }
+}
+
+//==============================================
+// Property handling
+//==============================================
+
+void CompactNodeView::adjustBackground(QColor col)
+{
+ if(col.isValid())
+ {
+ QPalette p=viewport()->palette();
+ p.setColor(QPalette::Window,col);
+ viewport()->setPalette(p);
+
+ //When we set the palette on startup something resets the palette
+ //before the first paint event happens. So we set the expected bg colour
+ //so that the view should know what bg colour it should use.
+ if(inStartUp_)
+ setExpectedBg(col);
+ }
+}
+
+void CompactNodeView::adjustBranchLineColour(QColor col)
+{
+ setConnectorColour(col);
+}
+
+void CompactNodeView::adjustServerToolTip(bool st)
+{
+ model_->setEnableServerToolTip(st);
+}
+
+void CompactNodeView::adjustNodeToolTip(bool st)
+{
+ model_->setEnableNodeToolTip(st);
+}
+
+void CompactNodeView::adjustAttributeToolTip(bool st)
+{
+ model_->setEnableAttributeToolTip(st);
+}
+
+void CompactNodeView::notifyChange(VProperty* p)
+{
+ if(p->path() == "view.tree.background")
+ {
+ adjustBackground(p->value().value<QColor>());
+ }
+ else if(p->path() == "view.tree.branchLineColour")
+ {
+ adjustBranchLineColour(p->value().value<QColor>());
+ }
+ else if(p->path() == "view.tree.serverToolTip")
+ {
+ adjustServerToolTip(p->value().toBool());
+ }
+ else if(p->path() == "view.tree.nodeToolTip")
+ {
+ adjustNodeToolTip(p->value().toBool());
+ }
+ else if(p->path() == "view.tree.attributeToolTip")
+ {
+ adjustAttributeToolTip(p->value().toBool());
+ }
+}
diff --git a/Viewer/src/CompactNodeView.hpp b/Viewer/src/CompactNodeView.hpp
new file mode 100644
index 0000000..5f3b6b8
--- /dev/null
+++ b/Viewer/src/CompactNodeView.hpp
@@ -0,0 +1,103 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#ifndef COMPACTNODEVIEW_HPP
+#define COMPACTNODEVIEW_HPP
+
+#include "CompactView.hpp"
+#include "ExpandState.hpp"
+#include "NodeViewBase.hpp"
+#include "VInfo.hpp"
+#include "VProperty.hpp"
+
+#include <QMap>
+#include <QModelIndex>
+
+class ActionHandler;
+class Animation;
+class ExpandNode;
+//class ExpandState;
+class PropertyMapper;
+class VTreeNode;
+class QItemSelection;
+
+class CompactNodeView : public CompactView, public NodeViewBase, public VPropertyObserver
+{
+Q_OBJECT
+
+public:
+ explicit CompactNodeView(TreeNodeModel* model,NodeFilterDef* filterDef,QWidget *parent=0);
+ ~CompactNodeView();
+
+ void reload();
+ void rerender();
+ QWidget* realWidget();
+ VInfo_ptr currentSelection();
+ void setCurrentSelection(VInfo_ptr n);
+ void selectFirstServer();
+
+ void notifyChange(VProperty* p);
+
+ void readSettings(VSettings* vs) {}
+ void writeSettings(VSettings* vs) {}
+
+public Q_SLOTS:
+ void slotContextMenu(const QPoint &position);
+ void slotViewCommand(VInfo_ptr,QString);
+ void slotSaveExpand();
+ void slotRestoreExpand();
+ void slotSaveExpand(const VTreeNode* node);
+ void slotRestoreExpand(const VTreeNode* node);
+ void slotRepaint(Animation*);
+ void slotRerender();
+ void slotSizeHintChangedGlobal();
+
+protected Q_SLOTS:
+ void slotDoubleClickItem(const QModelIndex&);
+ void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
+
+Q_SIGNALS:
+ void selectionChanged(VInfo_ptr);
+ void infoPanelCommand(VInfo_ptr,QString);
+ void dashboardCommand(VInfo_ptr,QString);
+
+protected:
+ QModelIndexList selectedList();
+ void handleContextMenu(QModelIndex indexClicked,QModelIndexList indexLst,QPoint globalPos,QPoint widgetPos,QWidget *widget);
+
+ void saveExpand(ExpandNode *parentExpand,const QModelIndex& idx);
+ void restoreExpand(ExpandNode *expand,const VNode* node);
+ void expandTo(const QModelIndex& idxTo);
+ void setCurrentSelectionFromExpand(VInfo_ptr info);
+ void regainSelectionFromExpand();
+
+ void adjustBackground(QColor col);
+ void adjustBranchLineColour(QColor col);
+ void adjustServerToolTip(bool);
+ void adjustNodeToolTip(bool);
+ void adjustAttributeToolTip(bool);
+
+ ActionHandler* actionHandler_;
+ bool needItemsLayout_;
+ int defaultIndentation_;
+ PropertyMapper* prop_;
+ QMap<QString,QString> styleSheet_;
+ bool setCurrentIsRunning_;
+ bool setCurrentFromExpand_;
+ VInfo_ptr lastSelection_;
+
+ typedef ExpandState<CompactNodeView> CompactViewExpandState;
+ QVector<CompactViewExpandState*> expandStates_;
+ bool inStartUp_;
+};
+
+
+#endif // COMPACTNODEVIEW_HPP
+
diff --git a/Viewer/src/CompactNodeViewDelegate.cpp b/Viewer/src/CompactNodeViewDelegate.cpp
new file mode 100644
index 0000000..78bdbde
--- /dev/null
+++ b/Viewer/src/CompactNodeViewDelegate.cpp
@@ -0,0 +1,298 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//============================================================================
+
+#include "CompactNodeViewDelegate.hpp"
+
+#include <QApplication>
+#include <QDebug>
+#include <QImageReader>
+#include <QLinearGradient>
+#include <QPainter>
+
+#include "AbstractNodeModel.hpp"
+#include "Animation.hpp"
+#include "IconProvider.hpp"
+#include "PropertyMapper.hpp"
+#include "RectMetrics.hpp"
+#include "ServerHandler.hpp"
+#include "TreeNodeModel.hpp"
+#include "UiLog.hpp"
+
+class CompactNodeDelegateBox : public NodeDelegateBox
+{
+public:
+
+ CompactNodeDelegateBox() : textTopCorrection(0), textBottomCorrection(0)
+ {
+ topMargin=2;
+ bottomMargin=2;
+ leftMargin=1;
+ rightMargin=2;
+ topPadding=0;
+ bottomPadding=0;
+ leftPadding=2;
+ rightPadding=2;
+ }
+
+ int realFontHeight;
+ int textTopCorrection;
+ int textBottomCorrection;
+
+ void adjust(const QFont& f)
+ {
+ FontMetrics fm(f);
+ realFontHeight=fm.realHeight();
+ textTopCorrection=fm.topPaddingForCentre();
+ textBottomCorrection=fm.bottomPaddingForCentre();
+ fontHeight=fm.height();
+
+ if(textTopCorrection > 1)
+ {
+ textTopCorrection-=2;
+ realFontHeight+=2;
+ }
+
+ height=realFontHeight+topPadding+bottomPadding;
+ fullHeight=height+topMargin+bottomMargin;
+ sizeHintCache=QSize(100,fullHeight);
+ spacing=fm.width('A')*3/4;
+
+ int h=static_cast<int>(static_cast<float>(fm.height())*0.7);
+ iconSize=h;
+ if(iconSize % 2 == 1)
+ iconSize+=1;
+
+ iconGap=1;
+ if(iconSize > 16)
+ iconGap=2;
+
+ iconPreGap=fm.width('A')/2;
+ }
+
+ QRect adjustTextRect(const QRect& rIn) const
+ {
+ //Q_ASSERT(rIn.height() == fontHeight);
+ QRect r=rIn;
+ r.setY(r.y()-textTopCorrection);
+ r.setHeight(fontHeight);
+ return r;
+ }
+
+ QRect adjustSelectionRect(const QRect& optRect) const {
+ QRect r=optRect;
+ return r;
+ }
+};
+
+class CompactAttrDelegateBox : public AttrDelegateBox
+{
+public:
+ CompactAttrDelegateBox() : textTopCorrection(0), textBottomCorrection(0)
+ {
+ topMargin=2;
+ bottomMargin=2;
+ leftMargin=1;
+ rightMargin=2;
+ topPadding=0;
+ bottomPadding=0;
+ leftPadding=1;
+ rightPadding=2;
+ }
+
+ int realFontHeight;
+ int textTopCorrection;
+ int textBottomCorrection;
+
+ void adjust(const QFont& f)
+ {
+ FontMetrics fm(f);
+ realFontHeight=fm.realHeight();
+ textTopCorrection=fm.topPaddingForCentre();
+ textBottomCorrection=fm.bottomPaddingForCentre();
+ fontHeight=fm.height();
+
+ height=realFontHeight+topPadding+bottomPadding;
+ fullHeight=height+topMargin+bottomMargin;
+ sizeHintCache=QSize(100,fullHeight);
+ spacing=fm.width('A')*3/4;
+ }
+
+ QRect adjustTextRect(const QRect& rIn) const
+ {
+ QRect r=rIn;
+ r.setY(r.y()-textTopCorrection+1);
+ r.setHeight(fontHeight);
+ return r;
+ }
+
+ QRect adjustTextBgRect(const QRect& rIn) const
+ {
+ QRect r=rIn;
+ return r.adjusted(0,-1,0,1);
+ }
+
+ QRect adjustSelectionRect(const QRect& optRect) const {
+ QRect r=optRect;
+ return r.adjusted(0,-selectRm.topOffset(),0,-selectRm.bottomOffset());
+ }
+
+ QRect adjustSelectionRectNonOpt(const QRect& optRect) const {
+ return adjustSelectionRect(optRect);
+ }
+};
+
+CompactNodeViewDelegate::CompactNodeViewDelegate(TreeNodeModel* model,QWidget *parent) :
+ TreeNodeViewDelegateBase(model,parent)
+{
+ nodeBox_=new CompactNodeDelegateBox;
+ attrBox_=new CompactAttrDelegateBox;
+
+ nodeBox_->adjust(font_);
+ attrBox_->adjust(attrFont_);
+
+ updateSettings();
+}
+
+CompactNodeViewDelegate::~CompactNodeViewDelegate()
+{
+}
+
+bool CompactNodeViewDelegate::isSingleHeight(int h) const
+{
+ return (h==nodeBox_->fullHeight || h == attrBox_->fullHeight);
+}
+
+QSize CompactNodeViewDelegate::sizeHint(const QStyleOptionViewItem&, const QModelIndex & index ) const
+{
+#if 0
+ //QSize size=QStyledItemDelegate::sizeHint(option,index);
+ //QSize size(100,fontHeight_+8);
+
+ int attLineNum=0;
+ if((attLineNum=index.data(AbstractNodeModel::AttributeLineRole).toInt()) > 0)
+ {
+ if(attLineNum==1)
+ return attrBox_->sizeHintCache;
+ else
+ {
+ QFontMetrics fm(attrFont_);
+ QStringList lst;
+ for(int i=0; i < attLineNum; i++)
+ lst << "1";
+
+ return QSize(100,fm.size(0,lst.join(QString('\n'))).height()+6);
+ }
+ }
+
+ return nodeBox_->sizeHintCache;
+#endif
+
+ return nodeBox_->sizeHintCache;
+}
+
+//This has to be extremely fast
+void CompactNodeViewDelegate::sizeHint(const QModelIndex& index,int& w,int& h) const
+{
+ QVariant tVar=index.data(Qt::DisplayRole);
+
+ h=nodeBox_->fullHeight;
+
+ //For nodes we compute the exact size of visual rect
+ if(tVar.type() == QVariant::String)
+ {
+ QString text=index.data(Qt::DisplayRole).toString();
+ if(index.data(AbstractNodeModel::ServerRole).toInt() ==0)
+ {
+ widthHintServer(index,w,text);
+ }
+ else
+ {
+ w=nodeWidth(index,text);
+ }
+ }
+ //For attributes we do not need the exact width since they do not have children so
+ //there is nothing on their right in the view. We compute their proper size when
+ //they are first rendered. However the exact height must be known at this stage!
+ else if(tVar.type() == QVariant::StringList)
+ {
+ //Each attribute has this height except the multiline labels
+ h=attrBox_->fullHeight;
+
+ //It is a big enough hint for the width.
+ w=300;
+
+ //For multiline labels we need to cimpute the height
+ int attLineNum=0;
+ if((attLineNum=index.data(AbstractNodeModel::AttributeLineRole).toInt()) > 1)
+ {
+ h=labelHeight(attLineNum);
+ }
+ }
+}
+
+int CompactNodeViewDelegate::paintItem(QPainter *painter,const QStyleOptionViewItem &option,
+ const QModelIndex& index) const
+{
+ int width=0;
+
+ //Background
+ QStyleOptionViewItem vopt(option);
+ initStyleOption(&vopt, index);
+
+ //Save painter state
+ painter->save();
+
+ if(index.data(AbstractNodeModel::ConnectionRole).toInt() == 0)
+ {
+ QRect fullRect=QRect(0,vopt.rect.y(),painter->device()->width(),vopt.rect.height());
+ painter->fillRect(fullRect,lostConnectBgBrush_);
+ QRect bandRect=QRect(0,vopt.rect.y(),5,vopt.rect.height());
+ painter->fillRect(bandRect,lostConnectBandBrush_);
+ }
+
+ QVariant tVar=index.data(Qt::DisplayRole);
+ painter->setFont(font_);
+
+ if(tVar.type() == QVariant::String)
+ {
+ QString text=index.data(Qt::DisplayRole).toString();
+ if(index.data(AbstractNodeModel::ServerRole).toInt() ==0)
+ {
+ width=renderServer(painter,index,vopt,text);
+ }
+ else
+ {
+ width=renderNode(painter,index,vopt,text);
+ }
+ }
+ //Render attributes
+ else if(tVar.type() == QVariant::StringList)
+ {
+ QStringList lst=tVar.toStringList();
+ if(lst.count() > 0)
+ {
+ QMap<QString,AttributeRendererProc>::const_iterator it=attrRenderers_.find(lst.at(0));
+ if(it != attrRenderers_.end())
+ {
+ AttributeRendererProc a=it.value();
+ width=(this->*a)(painter,lst,vopt);
+ }
+ //if(width==0)
+ // width=300;
+ }
+
+ }
+
+ painter->restore();
+
+ return width;
+
+ //else
+ // QStyledItemDelegate::paint(painter,option,index);
+}
diff --git a/Viewer/src/ConfigListDelegate.hpp b/Viewer/src/CompactNodeViewDelegate.hpp
similarity index 53%
copy from Viewer/src/ConfigListDelegate.hpp
copy to Viewer/src/CompactNodeViewDelegate.hpp
index 9908e8d..8fb1105 100644
--- a/Viewer/src/ConfigListDelegate.hpp
+++ b/Viewer/src/CompactNodeViewDelegate.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -8,31 +8,29 @@
//
//============================================================================
-#ifndef VIEWER_SRC_CONFIGLISTDELEGATE_HPP_
-#define VIEWER_SRC_CONFIGLISTDELEGATE_HPP_
+#ifndef COMPACTNODEVIEWDELEGATE_HPP
+#define COMPACTNODEVIEWDELEGATE_HPP
-#include <QBrush>
-#include <QMap>
-#include <QPen>
-#include <QStyledItemDelegate>
+#include "TreeNodeViewDelegateBase.hpp"
-#include "TreeView.hpp"
-
-#include <string>
-
-class ConfigListDelegate : public QStyledItemDelegate
+class CompactNodeViewDelegate : public TreeNodeViewDelegateBase
{
public:
- explicit ConfigListDelegate(int,int,QWidget *parent=0);
+ explicit CompactNodeViewDelegate(TreeNodeModel* model,QWidget *parent=0);
+ ~CompactNodeViewDelegate();
+
void paint(QPainter *painter,const QStyleOptionViewItem &option,
+ const QModelIndex& index) const {}
+
+ int paintItem(QPainter *painter,const QStyleOptionViewItem &option,
const QModelIndex& index) const;
- QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index ) const;
-protected:
- int iconSize_;
- int maxTextWidth_;
- int margin_;
- int gap_;
+ QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex& index ) const;
+ void sizeHint(const QModelIndex& index,int& w,int& h) const;
+ bool isSingleHeight(int h) const;
};
-#endif /* VIEWER_SRC_CONFIGLISTDELEGATE_HPP_ */
+#endif // COMPACTNODEVIEWDELEGATE_HPP
+
+
+
diff --git a/Viewer/src/CompactView.cpp b/Viewer/src/CompactView.cpp
new file mode 100644
index 0000000..7a2a575
--- /dev/null
+++ b/Viewer/src/CompactView.cpp
@@ -0,0 +1,2161 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "CompactView.hpp"
+
+#include "ExpandState.hpp"
+#include "TreeNodeModel.hpp"
+#include "CompactNodeViewDelegate.hpp"
+#include "UIDebug.hpp"
+#include "UiLog.hpp"
+
+#include <QtAlgorithms>
+#include <QApplication>
+#include <QDebug>
+#include <QItemSelectionRange>
+#include <QPainter>
+#include <QMouseEvent>
+#include <QScrollBar>
+#include <QStack>
+#include <QStyledItemDelegate>
+#include <QTimerEvent>
+#include <QToolTip>
+
+//#define _UI_COMPACTVIEW_DEBUG
+
+CompactView::CompactView(TreeNodeModel* model,QWidget* parent) :
+ QAbstractScrollArea(parent),
+ model_(model),
+ verticalScrollMode_(ScrollPerItem),
+ rowCount_(0),
+ maxRowWidth_(0),
+ lastViewedItem_(0),
+ topMargin_(4),
+ leftMargin_(4),
+ itemGap_(12),
+ connectorGap_(1),
+ expandConnectorLenght_(20),
+ noSelectionOnMousePress_(false),
+ connectorColour_(Qt::black)
+{
+ delegate_=new CompactNodeViewDelegate(model_,this);
+
+ itemDelegate_=new QStyledItemDelegate(this);
+
+ expandConnectorLenght_=itemGap_-2*connectorGap_;
+
+ viewport()->setBackgroundRole(QPalette::Window);
+
+ //We attach the model.
+ attachModel();
+}
+
+CompactView::~CompactView()
+{
+
+}
+
+//Connect the models signal to the view
+void CompactView::attachModel()
+{
+ //Standard signals from the model
+ connect(model_,SIGNAL(modelReset()),
+ this,SLOT(reset()));
+
+ connect(model_,SIGNAL(rowsInserted(QModelIndex,int,int)),
+ this, SLOT(rowsInserted(QModelIndex,int,int)));
+
+ connect(model_,SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
+ this, SLOT(rowsAboutToBeRemoved(QModelIndex,int,int)));
+
+ connect(model_,SIGNAL(rowsRemoved(QModelIndex,int,int)),
+ this, SLOT(rowsRemoved(QModelIndex,int,int)));
+
+ connect(model_,SIGNAL(dataChanged(const QModelIndex&,const QModelIndex&)),
+ this,SLOT(dataChanged(const QModelIndex&,const QModelIndex&)));
+
+ //The selection model
+ selectionModel_ = new QItemSelectionModel(model_, this);
+ connect(model_, SIGNAL(destroyed()), selectionModel_, SLOT(deleteLater()));
+
+ connect(selectionModel_, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
+ this, SLOT(selectionChanged(QItemSelection,QItemSelection)));
+
+ connect(selectionModel_, SIGNAL(currentChanged(QModelIndex,QModelIndex)),
+ this, SLOT(currentChanged(QModelIndex,QModelIndex)));
+
+ //We need to call it to be sure that the view show the actual state of the model!!!
+ reset();
+}
+
+void CompactView::mousePressEvent(QMouseEvent* event)
+{
+ QPoint pos = event->pos();
+ QPersistentModelIndex index = indexAt(pos);
+ pressedIndex_ = index;
+
+ //Get the selection flags
+ QItemSelectionModel::SelectionFlags command = selectionCommand(index, event);
+
+ noSelectionOnMousePress_ = command == QItemSelectionModel::NoUpdate || !index.isValid();
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << "CompactView::mousePressEvent --> current=" << currentIndex().data().toString() <<
+ " pressed=" << pressedIndex_.data().toString() <<
+ " pos=" << pos << " pressedRef=" << pressedRefIndex_.data().toString();
+#endif
+
+ if((command & QItemSelectionModel::Current) == 0)
+ pressedRefIndex_ = index;
+ else if(!pressedRefIndex_.isValid())
+ pressedRefIndex_ = currentIndex();
+
+ QPoint pressedRefPosition=visualRect(pressedRefIndex_).center();
+
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << " pressedRefPosition=" << pressedRefPosition << " visrect=" << visualRect(currentIndex()) <<
+ " center=" << visualRect(currentIndex()).center() << " pressedRef=" << indexAt(pressedRefPosition).data().toString() <<
+ " pressedRef=" << pressedRefIndex_.data().toString();
+#endif
+
+ if(index.isValid())
+ {
+ selectionModel_->setCurrentIndex(index, QItemSelectionModel::NoUpdate);
+ QPoint p1=pressedRefPosition;
+ QRect rect(p1,QSize(pos.x()-p1.x(),pos.y()-p1.y()));
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << " rect=" << rect << " p1=" << p1 << " p2=" << pos ;
+#endif
+ setSelection(rect, command);
+ }
+ else
+ {
+ //Forces a finalize even if mouse is pressed, but not on a item
+ selectionModel_->select(QModelIndex(), QItemSelectionModel::Select);
+ }
+
+ if(event->button() == Qt::MidButton)
+ {
+ int viewItemIndex=itemAtCoordinate(event->pos());
+ if(viewItemIndex != -1 && viewItems_[viewItemIndex].hasChildren)
+ {
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << " midbutton index=" << viewItemIndex << " name=" <<
+ viewItems_[viewItemIndex].index.data().toString();
+#endif
+ if(viewItems_[viewItemIndex].expanded)
+ {
+ collapse(viewItemIndex);
+ updateRowCount();
+ updateScrollBars();
+ viewport()->update();
+ }
+ else
+ {
+ expand(viewItemIndex);
+ }
+ }
+ }
+}
+
+void CompactView::mouseReleaseEvent(QMouseEvent *event)
+{
+ QPoint pos = event->pos();
+ QPersistentModelIndex index = indexAt(pos);
+
+ if(selectionModel_ && noSelectionOnMousePress_)
+ {
+ noSelectionOnMousePress_ = false;
+ selectionModel_->select(index, selectionCommand(index, event));
+ }
+}
+
+void CompactView::mouseDoubleClickEvent(QMouseEvent *event)
+{
+ if(event->button() == Qt::LeftButton)
+ {
+ int viewItemIndex=itemAtCoordinate(event->pos());
+ if(viewItemIndex != -1)
+ {
+ if(viewItems_[viewItemIndex].hasChildren)
+ {
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << "CompactNodeView::mousePressEvent " << viewItemIndex << " name=" <<
+ viewItems_[viewItemIndex].index.data().toString();
+#endif
+ if(viewItems_[viewItemIndex].expanded)
+ {
+ collapse(viewItemIndex);
+ }
+ else
+ {
+ expand(viewItemIndex);
+ }
+ updateRowCount();
+ updateScrollBars();
+ viewport()->update();
+ }
+ else
+ {
+ Q_EMIT doubleClicked(viewItems_[viewItemIndex].index);
+ }
+ }
+ }
+}
+
+void CompactView::keyPressEvent(QKeyEvent *event)
+{
+ QModelIndex current = currentIndex();
+
+ if (current.isValid())
+ {
+ switch(event->key())
+ {
+ case Qt::Key_Plus:
+ expand(current);
+ break;
+ case Qt::Key_Minus:
+ collapse(current);
+ break;
+ }
+ }
+
+ QAbstractScrollArea::keyPressEvent(event);
+}
+
+bool CompactView::viewportEvent(QEvent *event)
+{
+ if(event->type() == QEvent::ToolTip)
+ {
+ QHelpEvent *he = static_cast<QHelpEvent*>(event);
+ const QModelIndex index = indexAt(he->pos());
+
+ //see qbatractitemdelegate::helpEvent()
+ QVariant tooltip = index.data(Qt::ToolTipRole);
+ if(tooltip.canConvert<QString>())
+ {
+ QToolTip::showText(he->globalPos(),tooltip.toString(),this);
+ return true;
+ }
+ return false;
+ }
+ return QAbstractScrollArea::viewportEvent(event);
+}
+
+void CompactView::timerEvent(QTimerEvent *event)
+{
+ if(event->timerId() == delayedWidth_.timerId())
+ {
+ updateScrollBars();
+ viewport()->update();
+ delayedWidth_.stop();
+ }
+}
+
+void CompactView::reset()
+{
+ viewItems_.clear();
+ rowCount_=0;
+ maxRowWidth_=0;
+ expandedIndexes.clear();
+ pressedRefIndex_=QPersistentModelIndex(QModelIndex());
+ //currentIndexSet_ = false;
+ if(selectionModel_)
+ selectionModel_->reset();
+
+ layout(-1,false,false,false);
+ updateRowCount();
+ updateScrollBars();
+}
+
+/*
+ Informs the view that the rows from the start row to the end row
+ inclusive have been inserted into the parent model item.
+*/
+void CompactView::rowsInserted(const QModelIndex& parent,int start,int end)
+{
+ const int parentItem = viewIndex(parent);
+
+ //If the item is expanded we need to relayout the whole tree
+ if(((parentItem != -1) && viewItems_[parentItem].expanded) || (parent == root_))
+ {
+ doItemsLayout();
+ }
+
+ //the parent just went from 0 children to more. update to re-paint the decoration
+ else if(parentItem != -1 && (model_->rowCount(parent) == end - start + 1))
+ {
+ viewItems_[parentItem].hasChildren = true;
+ viewport()->update();
+ }
+}
+
+/*
+ Informs the view that the rows from the start row to the end row
+ inclusive are about to removed from the given parent model item.
+*/
+void CompactView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
+{
+ //TODO: the selection has to be adjusted!!!
+ //QAbstractItemView::rowsAboutToBeRemoved(parent, start, end);
+
+ //A safety measure
+ viewItems_.clear();
+}
+
+/*
+ Informs the view that the rows from the start row to the end row
+ inclusive have been removed from the given parent model item.
+*/
+void CompactView::rowsRemoved(const QModelIndex &parent, int start, int end)
+{
+ doItemsLayout(true);
+}
+
+void CompactView::doItemsLayout(bool hasRemovedItems)
+{
+ if(hasRemovedItems)
+ {
+ //clean the QSet that may contains old (and thus invalid) indexes
+ QSet<QPersistentModelIndex>::iterator it = expandedIndexes.begin();
+ while (it != expandedIndexes.constEnd())
+ {
+ if (!it->isValid())
+ it = expandedIndexes.erase(it);
+ else
+ ++it;
+ }
+ //TODO: do we need to clear the selectionmodel?
+ }
+
+ viewItems_.clear(); // prepare for new layout
+ rowCount_=0;
+ maxRowWidth_=0;
+ pressedRefIndex_=QPersistentModelIndex(QModelIndex());
+
+ QModelIndex parent = root_;
+ if(model_->hasChildren(parent))
+ {
+ layout(-1,false,false,false);
+ }
+ updateRowCount();
+ updateScrollBars();
+ viewport()->update();
+}
+
+
+//Creates and initialize the viewItem structure of the children of the element
+// parentId: the items whose children are to be expanded
+// recursiveExpanding: all the children will be expanded
+// afterIsUninitialized: when we recurse from layout(-1) it indicates
+// the items after 'i' are not yet initialized and need not to be moved
+
+void CompactView::layout(int parentId, bool recursiveExpanding,bool afterIsUninitialized,bool preAllocated)
+{
+ //This is the root item.
+ if(parentId == -1)
+ {
+ rowCount_=0;
+ maxRowWidth_=0;
+ }
+
+ QModelIndex parentIndex = (parentId < 0) ? root_ : modelIndex(parentId);
+
+ if(parentId >=0 && !parentIndex.isValid())
+ {
+ //modelIndex() should never return something invalid for the real items.
+ //This can happen if columncount has been set to 0.
+ //To avoid infinite loop we stop here.
+ return;
+ }
+
+ int count=model_->rowCount(parentIndex);
+ bool expanding=true;
+
+ //This is the root item. viewItems must be empty at this point.
+ if(parentId == -1)
+ {
+ Q_ASSERT(viewItems_.empty());
+ Q_ASSERT(preAllocated == false);
+ viewItems_.resize(count);
+ afterIsUninitialized = true; //It can only be true when we expand from the root!
+ }
+ //The count of the stored children does not match the actual count
+ else if(viewItems_[parentId].total != (uint)count)
+ {
+ //Expand
+ if(!afterIsUninitialized)
+ {
+ //We called expandall for a non-root item. All the new items need must be
+ //already instered at this point. This is the duty of the caller routine.
+ //const int itemsCount = viewItems_.size();
+ //if(recursiveExpanding)
+ if(preAllocated)
+ {
+ //We called expandAll() for a non-root item. All the needed items need must already be
+ //inserted at this point. This is the duty of the caller routine!
+ //When layout() is finished we need to adjust the parent of all the items
+ //after the insertion position. This is the duty of the caller routine. We
+ //have chosen this solution for performance reasons!
+ }
+ else
+ {
+ insertViewItems(parentId + 1, count, CompactViewItem());
+ }
+ }
+ //ExpandAll from the root
+ else if(count > 0)
+ viewItems_.resize(viewItems_.size() + count);
+ }
+ else
+ {
+ expanding=false;
+ }
+
+ int first = parentId + 1;
+ int last = 0;
+ int children = 0;
+ int level=(parentId >=0?viewItems_[parentId].level+1:0);
+ CompactViewItem *item=0;
+
+ std::vector<int> itemWidthVec;
+ std::vector<int> itemHeightVec;
+ int widest=0;
+ for(int i=first; i < first+count; i++)
+ {
+ int w,h;
+ QModelIndex currentIndex=model_->index(i-first,0,parentIndex);
+ delegate_->sizeHint(currentIndex,w,h);
+ itemWidthVec.push_back(w);
+ itemHeightVec.push_back(h);
+
+ if(parentId >=0 && !model_->isAttribute(currentIndex))
+ if(w > widest) widest=w;
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << " item=" << currentIndex.data().toString() << " w=" << w;
+#endif
+ }
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ if(parentId >=0)
+ UiLog().dbg() << "layout parent=" << viewItems_[parentId].index.data().toString() <<
+ " widest child=" << widest;
+#endif
+
+ //Iterate through the direct children of parent item. At this point all the items
+ //needed in the loop below are pre-allocated but not yet initialised.
+ for(int i=first; i < first+count; i++)
+ {
+ QModelIndex currentIndex=model_->index(i-first,0,parentIndex);
+
+ last = i + children;
+ item = &viewItems_[last];
+ item->parentItem = parentId;
+ item->index=currentIndex;
+ item->hasMoreSiblings=(i < first+count-1);
+ item->level=level;
+ item->expanded = false;
+ item->total = 0;
+ item->widestInSiblings=widest;
+
+ //We compute the size of the item. For attributes we delay the width computation until we
+ //actually paint them and we set their width to 300.
+ item->width=itemWidthVec[i-first];
+ item->height=itemHeightVec[i-first];
+
+ int xp=leftMargin_;
+ if(parentId >=0)
+ {
+ item->widestInSiblings=widest;
+ xp=viewItems_[parentId].alignedRight()+itemGap_;
+ }
+ else
+ {
+ item->widestInSiblings=item->width;
+ }
+
+ item->x=xp;
+
+ if(item->alignedRight() > maxRowWidth_)
+ maxRowWidth_=item->alignedRight();
+
+ //We need to expand the item
+ if(recursiveExpanding || isIndexExpanded(currentIndex))
+ {
+ if(recursiveExpanding)
+ expandedIndexes.insert(currentIndex);
+
+ item->expanded = true;
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << " before " << item->index.data().toString() << " total=" << item->total;
+#endif
+ //Add the children to the layout
+ layout(last,recursiveExpanding,afterIsUninitialized,preAllocated);
+
+ item = &viewItems_[last];
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << " after " << item->index.data().toString() << " total=" << item->total;
+#endif
+ children+=item->total;
+ item->hasChildren = item->total > 0;
+ }
+ else
+ {
+ item->hasChildren = model_->hasChildren(currentIndex);
+ }
+ }
+
+ if(!expanding)
+ return; // nothing changed
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << " update parent total";
+#endif
+
+ int pp=parentId;
+ while (pp > -1)
+ {
+ viewItems_[pp].total += count;
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << " parent=" << viewItems_[pp].index.data().toString() <<
+ " total=" << viewItems_[pp].total;
+#endif
+
+ pp = viewItems_[pp].parentItem;
+ }
+}
+
+void CompactView::paintEvent(QPaintEvent *event)
+{
+ QPainter painter(viewport());
+ paint(&painter,event->region());
+}
+
+//Paint the rows intersecting with the given region
+void CompactView::paint(QPainter *painter,const QRegion& region)
+{
+ //Even though the viewport palette is set correctly at the
+ //beginning something sets it to another value. Here we try
+ //to detect it and correct the palette with right colour.
+ if(expectedBg_.isValid())
+ {
+ QPalette p=viewport()->palette();
+ if(p.color(QPalette::Window) != expectedBg_)
+ {
+ p.setColor(QPalette::Window,expectedBg_);
+ viewport()->setPalette(p);
+ viewport()->update();
+ expectedBg_=QColor();
+ return;
+ }
+ }
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << "CompactView::paint -->";
+ //UiLog().dbg() << "sizeof(CompactViewItem)=" << sizeof(CompactViewItem);
+ //UiLog().dbg() << "region=" << region;
+#endif
+
+ int firstVisibleOffset=0;
+
+ //The first visible item at the top of the viewport
+ int firstVisible=firstVisibleItem(firstVisibleOffset);
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << "firstVisible " << firstVisible;
+#endif
+
+ if(firstVisible<0)
+ return;
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << "scrollX" << horizontalScrollBar()->value() << " " << viewport()->width();
+#endif
+
+ int xOffset=0;
+ if(horizontalScrollBar()->value() > 0)
+ {
+ xOffset=horizontalScrollBar()->value();
+ painter->translate(-xOffset,0);
+ }
+
+ const int itemsCount = viewItems_.size();
+ const int viewportWidth = viewport()->width();
+ QVector<QRect> rects = region.rects();
+ QVector<int> drawn;
+ bool multipleRects = (rects.size() > 1);
+
+ //Iterate through the rectangles in the region
+ for(int a = 0; a < rects.size(); ++a)
+ {
+ const QRect area = (multipleRects
+ ? QRect(0, rects.at(a).y(), viewportWidth, rects.at(a).height())
+ : rects.at(a));
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << " area=" << area;
+#endif
+
+ //Initialise indentVec. For each indentation level it tells us if
+ //a connector line is to be drawn. Here we scan up to the
+ //toplevel item in the firstVisible item's branch.
+ std::vector<int> indentVec(1000,0);
+ if(firstVisible >0)
+ {
+ CompactViewItem* item=&viewItems_[firstVisible];
+ int level=item->level;
+ while(item->parentItem >= 0 && level >0)
+ {
+ CompactViewItem* pt=&viewItems_[item->parentItem];
+ if(item->hasMoreSiblings)
+ {
+ indentVec[item->level]=connectorPos(item,pt);
+ }
+ UI_ASSERT(pt->level == level-1, "item->parentItem=" << item->parentItem <<
+ " pt->level=" << pt->level << " level=" << level);
+ item=pt;
+ level--;
+ }
+ }
+
+ int i = firstVisible; // the first item at the top of the viewport
+ int y = firstVisibleOffset; // we may only see part of the first item
+
+ //start at the top of the viewport and iterate down through the update area
+ int itemsInRow=1;
+ for (; i < itemsCount; i+=itemsInRow)
+ {
+ int itemHeight;
+ rowProperties(i,itemHeight,itemsInRow,indentVec);
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << "row: " << i << " " << itemHeight << " " << itemsInRow;
+#endif
+ //Try to find the first item int the current rect
+ if(y + itemHeight > area.top())
+ break;
+ y += itemHeight;
+ }
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << "y: " << y << " " << area.bottom();
+#endif
+
+ //Paint the visible rows in the current rect
+ for (; i < itemsCount && y <= area.bottom(); i+=itemsInRow)
+ {
+ if(!multipleRects || !drawn.contains(i))
+ {
+ //Draw a whole row. It will update y,itemsInRow and indentVec!!
+ drawRow(painter,i,xOffset,y,itemsInRow,indentVec);
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << " row rendered - item=" << i << " y=" << y << " itemsInRow=" << itemsInRow;
+#endif
+ }
+ else
+ {
+ int rh=rowHeight(i,1,itemsInRow);
+ y+=rh;
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << " row skipped - item=" << i << " y=" << y << " itemsInRow=" << itemsInRow;
+#endif
+ }
+
+ if(multipleRects)
+ drawn.append(i);
+ }
+ }
+}
+
+//Draw a whole row staring at item start.
+void CompactView::drawRow(QPainter* painter,int start,int xOffset,int& yp,int& itemsInRow,std::vector<int>& indentVec)
+{
+ itemsInRow=0;
+ bool leaf=false;
+ const int itemsCount = static_cast<int>(viewItems_.size());
+
+ //Get the rowheight
+ int iir=0;
+ int rh=rowHeight(start,1,iir);
+
+ //See if there are no multiline items in this row
+ bool singleRow=delegate_->isSingleHeight(rh);
+
+ int firstLevel=0;
+ const int viewportWidth = viewport()->width();
+
+ //We iterate through the items in the row
+ for(int i=start; i < itemsCount && !leaf; ++i )
+ {
+ CompactViewItem* item=&(viewItems_[i]);
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << " item=" << i << " " << item->index.data().toString();
+#endif
+ leaf=(item->total == 0);
+
+ //Find out the first indentation level in the row
+ if(firstLevel==0)
+ firstLevel=item->level;
+
+ //Init style option
+ QStyleOptionViewItem opt;
+ if(selectionModel_->isSelected(item->index))
+ opt.state |= QStyle::State_Selected;
+
+ int optWidth=2000;
+ if(item->width > optWidth)
+ optWidth=item->width;
+ opt.rect=QRect(item->x,yp,optWidth,item->height);
+
+ //We do not render the item if it is outisde the viewport and
+ //its parent's right is also outside the viewport. Here we considered that
+ //the connector line is always drawn from the child to the parent.
+ bool needToDraw=true;
+ if(item->parentItem >=0)
+ {
+ if(viewItems_[item->parentItem].right() >= translation() + viewportWidth)
+ needToDraw=false;
+ }
+
+ if(needToDraw)
+ {
+ //For single rows we center items halfway through the rowHeight
+ if(singleRow)
+ {
+ if(item->height < rh)
+ {
+ opt.rect.moveTop(yp+(rh-item->height)/2);
+ }
+ }
+
+ //QRect vr=visualRect(item->index);
+ //painter->fillRect(vr,QColor(120,120,120,120));
+
+//#ifdef _UI_COMPACTVIEW_DEBUG
+// UiLog().dbg() << " optRect=" << opt.rect << " visRect=" << vr;
+//#endif
+
+
+ //Draw the item with the delegate
+ int paintedWidth=delegate_->paintItem(painter,opt,item->index);
+
+ //we have to know if the item width is the same that we exepcted
+ if(paintedWidth != item->width)
+ {
+ bool sameAsWidest=(item->width == item->widestInSiblings);
+ item->width=paintedWidth;
+
+ //servers
+ if(item->parentItem ==-1)
+ {
+ adjustWidthInParent(i);
+ doDelayedWidthAdjustment();
+ }
+ //Nodes
+ else if(model_->isNode(item->index))
+ {
+ //widestInSiblings has to be adjusted
+ if(sameAsWidest || paintedWidth > item->widestInSiblings)
+ {
+ adjustWidthInParent(i);
+ doDelayedWidthAdjustment();
+ }
+ //we just need to update the item
+ else if( paintedWidth < item->widestInSiblings)
+ {
+ doDelayedWidthAdjustment();
+ }
+ }
+ //Attributes
+ else
+ {
+ if(item->right() > maxRowWidth_)
+ {
+ maxRowWidth_=item->right();
+ doDelayedWidthAdjustment();
+ }
+ }
+ }
+
+ //QRect rr=opt.rect;
+ //rr.setWidth(item->width);
+ //painter->drawRect(rr);
+
+ //UiLog().dbg() << i << " " << viewItems_[i]->index << " " << viewItems_[i]->index.data().toString() << " "
+ // << viewItems_[i]->x << " " << viewItems_[i]->height << " " << leaf;
+
+ painter->setPen(connectorColour_);
+
+ //If not a top level item (e.i. not a server)
+ if(item->parentItem >=0)
+ {
+ //The parent item. It is always a node.
+ CompactViewItem* pt=&(viewItems_[item->parentItem]);
+
+ //The horizontal line connecting the item to its parent
+ int lineX1=pt->right()+connectorGap_;
+ int lineX2=item->x-connectorGap_;
+ int lineX=(pt->right()+item->x)/2;
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << " lineX=" << lineX << " " << item->x << " " << connectorPos(item,pt);
+#endif
+ UI_ASSERT(lineX==connectorPos(item,pt),"lineX=" << lineX << " i=" << i <<
+ " item->x=" << item->x << " connectorPos=" << connectorPos(item,pt));
+
+ //First child - in the same row as its parent
+ if(item->index.row() == 0)
+ {
+ int lineY=yp+pt->height/2;
+
+ //horizontal line to the parent
+ painter->drawLine(lineX1,lineY,lineX2,lineY);
+
+ //line towards the siblings - downwards
+ if(item->hasMoreSiblings)
+ {
+ painter->drawLine(lineX,lineY,lineX,lineY+rh/2);
+ indentVec[item->level]=lineX;
+ }
+ else
+ indentVec[item->level]=0;
+ }
+ //Child in the middle - has sibling both upwards and downwards
+ else if(item->hasMoreSiblings)
+ {
+ int lineY=yp+item->height/2;
+
+ painter->drawLine(lineX,lineY,lineX2,lineY);
+ painter->drawLine(lineX,lineY+rh/2,lineX,lineY-rh/2);
+ indentVec[item->level]=lineX;
+ }
+
+ //The last child - has sibling only upwards
+ else
+ {
+ int lineY=yp+item->height/2;
+ painter->drawLine(lineX,lineY,lineX2,lineY);
+ painter->drawLine(lineX,lineY,lineX,lineY-rh/2);
+ indentVec[item->level]=0;
+ }
+ }
+
+ //indicate if a node is exandable
+ if(item->hasChildren && !item->expanded)
+ {
+ int lineY=yp+item->height/2;
+ int lineX=item->right()+connectorGap_;
+ QPen oriPen=painter->pen();
+ painter->setPen(QPen(connectorColour_,1,Qt::DashLine));
+ painter->drawLine(lineX,lineY,lineX+expandConnectorLenght_,lineY);
+ painter->setPen(oriPen);
+ }
+ }
+
+ //When we reach a leaf item we move one row down.
+ if(leaf)
+ {
+ //Draw the vertical connector lines for all the levels
+ //preceding the first level in the row!
+ painter->setPen(connectorColour_);
+ for(size_t j=0; j < firstLevel; j++)
+ {
+ int xp=indentVec[j];
+ if(xp != 0)
+ painter->drawLine(xp,yp,xp,yp+rh);
+ }
+
+ yp+=rh;
+ rh=0;
+ firstLevel=0;
+ }
+ itemsInRow++;
+ }
+
+ if(itemsInRow == 0)
+ itemsInRow=1;
+}
+
+void CompactView::adjustWidthInParent(int start)
+{
+ //The parent index of the start item
+ int parentItem=viewItems_[start].parentItem;
+
+ //The current max width in the start item's siblings
+ int prevWidest=viewItems_[start].widestInSiblings;
+
+ //If the parent is not the root ie the start item is not a server
+ if(parentItem >=0)
+ {
+ int w=0, h=0, widest=0;
+ QModelIndex parentIndex=viewItems_[parentItem].index;
+
+ //Determine the max width in the siblings of the start
+ //item, ie in the children of the parent item
+ int rowCount=model_->rowCount(parentIndex);
+ for(int i=0; i < rowCount; i++)
+ {
+ QModelIndex idx=model_->index(i,0,parentIndex);
+ if(model_->isNode(idx))
+ {
+ delegate_->sizeHint(idx,w,h);
+ if(w >widest) widest=w;
+ }
+ }
+
+ //If there is a new max width we need to adjust all the children of
+ //the parent item
+ int delta=widest-prevWidest;
+ if(delta != 0)
+ {
+ int n=parentItem+viewItems_[parentItem].total;
+ for(int i=parentItem+1; i <= n; i++)
+ {
+ //For a direct child of the parent item we just
+ //set the max width to its new value
+ if(viewItems_[i].parentItem == parentItem)
+ {
+ viewItems_[i].widestInSiblings = widest;
+ }
+ //The other items are shifted
+ else
+ {
+ viewItems_[i].x+=delta;
+ }
+
+ //Check if the total width changed
+ if(viewItems_[i].right() > maxRowWidth_)
+ maxRowWidth_=viewItems_[i].right();
+ }
+ }
+ }
+
+ //If the parent is the root ie the start item is a server
+ else
+ {
+ //Determine the diff between the current and the previous width
+ int delta=viewItems_[start].width-prevWidest;
+
+ //for server widestInSiblings is set to the width
+ viewItems_[start].widestInSiblings=viewItems_[start].width;
+
+ //Shift all the children with the diff
+ if(delta != 0)
+ {
+ int n=start+viewItems_[start].total;
+ for(int i=start+1; i <= n; i++)
+ {
+ //shifted
+ viewItems_[i].x+=delta;
+
+ //Check if the total width changed
+ if(viewItems_[i].right() > maxRowWidth_)
+ maxRowWidth_=viewItems_[i].right();
+ }
+ }
+ }
+
+}
+
+int CompactView::connectorPos(CompactViewItem* item, CompactViewItem* parent) const
+{
+ return (parent->right()+item->x)/2;
+}
+
+//Updates the area occupied by the given index.
+void CompactView::update(const QModelIndex &index)
+{
+ if (index.isValid())
+ {
+ const QRect rect = visualRect(index);
+ //this test is important for peformance reasons
+ //For example in dataChanged if we simply update all the cells without checking
+ //it can be a major bottleneck to update rects that aren't even part of the viewport
+ if(viewport()->rect().intersects(rect))
+ {
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << "update -->" << index.data().toString() << " rect=" << rect;
+#endif
+ viewport()->update(rect);
+ }
+ }
+}
+
+/*
+ This slot is called when items are changed in the model. The
+ changed items are those from topLeft to bottomRight
+ inclusive. If just one item is changed topLeft ==
+ bottomRight.
+*/
+void CompactView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
+{
+ // Single item changed
+ if (topLeft == bottomRight && topLeft.isValid())
+ {
+ update(topLeft);
+ return;
+ }
+
+ viewport()->update();
+}
+
+//Get the rowheight. There are three kinds of row heights.
+// 1. nodes (fixed height)
+// 2. attributes (fixed height)
+// 3. multiline label attributes (variable height!!!)
+void CompactView::rowProperties(int start,int& rowHeight,int &itemsInRow,std::vector<int>& indentVec) const
+{
+ rowHeight=0;
+ itemsInRow=0;
+ const int itemsCount = static_cast<int>(viewItems_.size());
+
+ for(int i=start; i < itemsCount; i++)
+ {
+ CompactViewItem* item=&(viewItems_[i]);
+ rowHeight=qMax(rowHeight,static_cast<int>(item->height));
+ itemsInRow++;
+ if(item->total == 0)
+ {
+ indentVec[item->level]=0;
+ break;
+ }
+
+ if(item->parentItem >=0)
+ {
+ //The parent item. It is always a node.
+ CompactViewItem* pt=&(viewItems_[item->parentItem]);
+
+ if(item->hasMoreSiblings)
+ {
+ int lineX1=pt->right()+2;
+ int lineX2=item->x-2;
+ int lineX=(lineX1+lineX2)/2;
+ indentVec[item->level]=lineX;
+ }
+ else
+ {
+ indentVec[item->level]=0;
+ }
+ }
+ }
+
+ UI_ASSERT(itemsInRow > 0,"itemsInRow=" << itemsInRow);
+}
+
+int CompactView::rowHeight(int start,int forward, int &itemsInRow) const
+{
+ uint rh=0;
+ itemsInRow=0;
+ const int itemsCount = static_cast<int>(viewItems_.size());
+
+ if(forward == 1)
+ {
+ for(int i=start; i < itemsCount; i++)
+ {
+ rh=qMax(rh,viewItems_[i].height);
+ itemsInRow++;
+ if(viewItems_[i].total == 0)
+ break;
+ }
+ }
+ else
+ {
+ UI_ASSERT(start >= 0,"start=" << start << " total=" << viewItems_.size());
+ UI_ASSERT(start < viewItems_.size(),"start=" << start << " total=" << viewItems_.size());
+ rh=qMax(rh,viewItems_[start].height);
+ itemsInRow++;
+ for(int i=start-1; i >= 0; i--)
+ {
+ if(viewItems_[i].total == 0)
+ break;
+ rh=qMax(rh,viewItems_[i].height);
+ itemsInRow++;
+ }
+ }
+
+ UI_ASSERT(itemsInRow > 0,"itemsInRow=" << itemsInRow);
+ return rh;
+}
+
+int CompactView::itemCountInRow(int start) const
+{
+ const std::size_t itemsCount = viewItems_.size();
+ int itemsInRow=0;
+ for(int i=start; i < itemsCount; i++)
+ {
+ itemsInRow++;
+ if(viewItems_[i].total == 0)
+ return itemsInRow;
+ }
+
+ UI_ASSERT(itemsInRow > 0,"itemsInRow=" << itemsInRow);
+ return itemsInRow;
+}
+
+int CompactView::itemRow(int item) const
+{
+ if(item < 0 || item >= viewItems_.size())
+ return -1;
+
+ int row=-1;
+ int itemsInRow=0;
+ for(int i=0; i <= item; i+=itemsInRow)
+ {
+ row++;
+ itemsInRow=itemCountInRow(i);
+ }
+
+ return row;
+}
+
+int CompactView::firstVisibleItem(int &offset) const
+{
+ const int value = verticalScrollBar()->value();
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << "CompactNodeView::firstVisibleItem --> value=" << value;
+#endif
+
+ if (verticalScrollMode_ == ScrollPerItem)
+ {
+ offset = 0;
+ //value is the row number
+
+ if(value <0 || value >= rowCount_)
+ return -1;
+
+ int cnt=0;
+ int itemsInRow=0;
+ const std::size_t itemsCount=viewItems_.size();
+ for (std::size_t i=0; i < itemsCount; i+=itemsInRow)
+ {
+ if(cnt == value)
+ {
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << " i=" << i << " itemsInRow=" << itemsInRow;
+#endif
+ return i;
+ }
+ itemsInRow=itemCountInRow(i);
+ cnt++;
+ }
+ //return (value < 0 || value >= viewItems_.count()) ? -1 : value;
+ }
+
+ return -1;
+}
+
+void CompactView::resizeEvent(QResizeEvent *event)
+{
+ QAbstractScrollArea::resizeEvent(event);
+ updateScrollBars();
+ viewport()->update();
+}
+
+//This has to be very quick. Called after each collapse/expand.
+void CompactView::updateRowCount()
+{
+ rowCount_=0;
+ const int itemsCount = static_cast<int>(viewItems_.size());
+ for(int i=0; i < itemsCount; i++)
+ {
+ if(viewItems_[i].total == 0)
+ rowCount_++;
+ }
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << "CompactNodeView::updateRowCount --> " << rowCount_;
+#endif
+}
+
+void CompactView::updateScrollBars()
+{
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << "CompactNodeView::updateScrollBars -->";
+#endif
+
+ QSize viewportSize = viewport()->size();
+ if(!viewportSize.isValid())
+ viewportSize = QSize(0, 0);
+
+ if(viewItems_.empty())
+ {
+ //doItemsLayout();
+ }
+
+ int itemsInViewport = 0;
+
+ const int itemsCount = viewItems_.size();
+ if(itemsCount ==0)
+ return;
+
+ const int viewportHeight = viewportSize.height();
+ int itemsInRow=1;
+ for(int height = 0, item = itemsCount - 1; item >= 0; item-=itemsInRow)
+ {
+ //UiLog().dbg() << "item=" << item;
+ height +=rowHeight(item,-1,itemsInRow);
+ if(height > viewportHeight)
+ break;
+ itemsInViewport++;
+ }
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << " itemsCount=" << itemsCount << " rowCount=" << rowCount_;
+ UiLog().dbg() << " itemsInViewport " << itemsInViewport;
+#endif
+
+ if(verticalScrollMode_ == ScrollPerItem)
+ {
+ if(!viewItems_.empty())
+ itemsInViewport = qMax(1, itemsInViewport);
+
+ //verticalScrollBar()->setRange(0, itemsCount - itemsInViewport);
+ verticalScrollBar()->setRange(0, rowCount_ - itemsInViewport);
+ verticalScrollBar()->setPageStep(itemsInViewport);
+ verticalScrollBar()->setSingleStep(1);
+ }
+ else
+ {
+ // scroll per pixel
+ }
+
+ //Horizontal scrollbar
+ if(viewportSize.width() < maxRowWidth_)
+ {
+ horizontalScrollBar()->setRange(0,maxRowWidth_+10-viewportSize.width());
+ horizontalScrollBar()->setPageStep(viewportSize.width());
+ horizontalScrollBar()->setSingleStep(1);
+ }
+ else
+ {
+ horizontalScrollBar()->setRange(0,0);
+ }
+}
+
+void CompactView::doDelayedWidthAdjustment()
+{
+ if(!delayedWidth_.isActive())
+ {
+ delayedWidth_.start(0,this);
+ }
+}
+
+int CompactView::translation() const
+{
+ return horizontalScrollBar()->value();
+}
+
+void CompactView::scrollTo(const QModelIndex &index)
+{
+ if(!index.isValid())
+ return;
+
+ //d->executePostedLayout();
+ updateScrollBars();
+
+ // Expand all parents if the parent(s) of the node are not expanded.
+ QList<QModelIndex> parentLst;
+ QModelIndex parent = index.parent();
+ while(parent.isValid())
+ {
+ parentLst.prepend(parent);
+ parent = model_->parent(parent);
+ }
+
+ Q_FOREACH(QModelIndex pt,parentLst)
+ {
+ if(!isExpanded(pt))
+ expand(pt);
+ }
+
+ int item = viewIndex(index);
+ if (item < 0)
+ return;
+
+ if (verticalScrollMode_ == ScrollPerItem)
+ {
+ int row=itemRow(item);
+
+ int top = verticalScrollBar()->value();
+ int bottom = top + verticalScrollBar()->pageStep();
+
+ if (row >= top && row < bottom)
+ {
+ // nothing to do
+ }
+ else if(row < top)
+ {
+ verticalScrollBar()->setValue(row);
+ }
+ else
+ {
+ verticalScrollBar()->setValue(row);
+#if 0
+ const int currentItemHeight = viewItem_[item].height;
+ int y = area.height();
+ if (y > currentItemHeight)
+ {
+ while (item >= 0)
+ {
+ y -= viewItem_[item].height;
+ if (y < 0)
+ { //there is no more space left
+ item++;
+ break;
+ }
+ item--;
+ }
+ }
+ verticalScrollBar()->setValue(item);
+#endif
+ }
+ }
+ else // ScrollPerPixel
+ {
+
+ }
+
+ // horizontal
+ int viewportWidth = viewport()->width();
+ int xp=viewItems_[item].x;
+ int horizontalPosition=xp-horizontalScrollBar()->value();
+
+ if( horizontalPosition< 0)
+ {
+ xp-=10;
+ if(xp < 0) xp=0;
+ horizontalScrollBar()->setValue(xp);
+ }
+ else if(horizontalPosition > viewportWidth)
+ {
+ xp-=10;
+ horizontalScrollBar()->setValue(xp);
+ }
+}
+
+/*
+ Returns the rectangle on the viewport occupied by the item at \a index.
+ If the index is not visible or explicitly hidden, the returned rectangle is invalid.
+*/
+QRect CompactView::visualRect(const QModelIndex &index) const
+{
+ //if (!d->isIndexValid(index) || isIndexHidden(index))
+ // return QRect();
+
+ //d->executePostedLayout();
+
+ int vi = viewIndex(index);
+ if (vi < 0)
+ return QRect();
+
+ int y = -1;
+ int rh=0;
+ coordinateForItem(vi,y,rh);
+ if(y >=0)
+ {
+ //return QRect(viewItems_[vi].x, y, viewItems_[vi].width,rh); //TODO: optimise it
+ return QRect(viewItems_[vi].x-1-translation(), y, viewItems_[vi].width+2,rh);
+ }
+ return QRect();
+}
+
+//point is in viewport coordinates
+QModelIndex CompactView::indexAt(const QPoint &point) const
+{
+ int item=itemAtCoordinate(point);
+ return (item>=0)?viewItems_[item].index:QModelIndex();
+}
+
+//Returns the viewport y coordinate for item.
+void CompactView::coordinateForItem(int item,int& itemY,int& itemRowHeight) const
+{
+ itemY=-1;
+ if(verticalScrollMode_ == ScrollPerItem)
+ {
+ int offset = 0;
+ //firstVisibleItem must always start a row!!!!
+ int topViewItemIndex=firstVisibleItem(offset);
+ if (item >= topViewItemIndex)
+ {
+ // search in the visible area first and continue down
+ // ### slow if the item is not visible
+
+ const int itemsCount = viewItems_.size();
+ const int viewportHeight = viewport()->size().height();
+ int itemsInRow=1;
+
+ for(int height = 0, viewItemIndex = topViewItemIndex;
+ height <= viewportHeight && viewItemIndex < itemsCount; viewItemIndex+=itemsInRow)
+ {
+ int h=rowHeight(viewItemIndex,1,itemsInRow);
+ if(viewItemIndex <=item && item < viewItemIndex+itemsInRow)
+ {
+ itemY=height;
+ itemRowHeight=h;
+ return;
+ }
+ height +=h;
+ }
+ }
+ }
+}
+
+//coordinate is in viewport coordinates
+int CompactView::itemAtCoordinate(const QPoint& coordinate) const
+{
+ const std::size_t itemCount = viewItems_.size();
+ if(itemCount == 0)
+ return -1;
+
+ if(verticalScrollMode_ == ScrollPerItem)
+ {
+ //int topRow = verticalScrollBar()->value();
+
+ int offset = 0;
+ int topViewItemIndex=firstVisibleItem(offset);
+
+ if(coordinate.y() >= 0)
+ {
+ // the coordinate is in or below the viewport
+ int viewItemCoordinate = 0;
+ int itemsInRow=0;
+ for(std::size_t viewItemIndex = topViewItemIndex; viewItemIndex < itemCount; viewItemIndex+=itemsInRow)
+ {
+ viewItemCoordinate += rowHeight(viewItemIndex,1,itemsInRow);
+ if (viewItemCoordinate > coordinate.y())
+ {
+ viewItemIndex=itemAtRowCoordinate(viewItemIndex,itemsInRow,coordinate.x()+translation());
+ return (viewItemIndex >= itemCount ? -1 : viewItemIndex);
+ }
+ }
+ }
+ }
+
+ return -1;
+}
+
+//return the item index at the absolute x coordinate (i.e. not viewport x coordinate)
+int CompactView::itemAtRowCoordinate(int start,int count,int logicalXPos) const
+{
+ for(int i=start; i < start+count; i++)
+ {
+ int left=viewItems_[i].x-1;
+ int right=viewItems_[i].right()+2;
+ if(!viewItems_[i].expanded && viewItems_[i].hasChildren)
+ right=viewItems_[i].right()+connectorGap_+expandConnectorLenght_+3;
+
+ if(left <= logicalXPos && right >= logicalXPos)
+ {
+ return i;
+ }
+ }
+ return -1;
+}
+
+QModelIndex CompactView::modelIndex(int i) const
+{
+ if(i < 0 || i >= viewItems_.size())
+ return QModelIndex();
+
+ return viewItems_[i].index;
+}
+
+//Returns the index of the view item representing the given index
+int CompactView::viewIndex(const QModelIndex& index) const
+{
+ if(!index.isValid() || viewItems_.empty())
+ return -1;
+
+ const int totalCount = static_cast<int>(viewItems_.size());
+ const QModelIndex topIndex = index.sibling(index.row(), 0);
+ const int row = topIndex.row();
+ const qint64 internalId = topIndex.internalId();
+
+ // We start nearest to the lastViewedItem
+ int localCount = qMin(lastViewedItem_ - 1, totalCount - lastViewedItem_);
+ for(int i = 0; i < localCount; ++i)
+ {
+ const QModelIndex &idx1 = viewItems_[lastViewedItem_ + i].index;
+ if(idx1.row() == row && idx1.internalId() == internalId)
+ {
+ lastViewedItem_ = lastViewedItem_ + i;
+ return lastViewedItem_;
+ }
+ const QModelIndex &idx2 = viewItems_[lastViewedItem_ - i - 1].index;
+ if(idx2.row() == row && idx2.internalId() == internalId)
+ {
+ lastViewedItem_ = lastViewedItem_ - i - 1;
+ return lastViewedItem_;
+ }
+ }
+
+ for(int j = qMax(0, lastViewedItem_ + localCount); j < totalCount; ++j)
+ {
+ const QModelIndex &idx = viewItems_[j].index;
+ if (idx.row() == row && idx.internalId() == internalId)
+ {
+ lastViewedItem_ = j;
+ return j;
+ }
+ }
+ for(int j = qMin(totalCount, lastViewedItem_ - localCount) - 1; j >= 0; --j)
+ {
+ const QModelIndex &idx = viewItems_[j].index;
+ if (idx.row() == row && idx.internalId() == internalId)
+ {
+ lastViewedItem_ = j;
+ return j;
+ }
+ }
+
+ // nothing found
+ return -1;
+}
+
+void CompactView::insertViewItems(int pos, int count, const CompactViewItem &viewItem)
+{
+ ViewItemIterator it=viewItems_.begin();
+ viewItems_.insert(it+pos,count,viewItem);
+
+ //We need to update the parentItem in the items after the insertion
+ const int itemsCount=static_cast<int>(viewItems_.size());
+ for(int i = pos + count; i < itemsCount; i++)
+ if (viewItems_[i].parentItem >= pos)
+ viewItems_[i].parentItem += count;
+}
+
+
+void CompactView::removeViewItems(int pos, int count)
+{
+ ViewItemIterator it=viewItems_.begin();
+ viewItems_.erase(it+pos,it+pos+count);
+
+ //We need to update the parentItem in the items after the deletion
+ const int itemsCount=static_cast<int>(viewItems_.size());
+ for(int i=0; i < itemsCount; i++)
+ if(viewItems_[i].parentItem >= pos)
+ viewItems_[i].parentItem -= count;
+}
+
+
+//---------------------------------------
+// Expand / collapse
+//---------------------------------------
+
+int CompactView::totalNumOfChildren(const QModelIndex& idx,int& num) const
+{
+ int count=model_->rowCount(idx);
+ num+=count;
+ for(int i=0; i < count; i++)
+ {
+ QModelIndex chIdx=model_->index(i,0,idx);
+ totalNumOfChildren(chIdx,num);
+ }
+}
+
+int CompactView::totalNumOfExpandedChildren(const QModelIndex& idx,int& num) const
+{
+ int count=model_->rowCount(idx);
+ num+=count;
+ for(int i=0; i < count; i++)
+ {
+ QModelIndex chIdx=model_->index(i,0,idx);
+ if(isIndexExpanded(chIdx))
+ {
+ totalNumOfExpandedChildren(chIdx,num);
+ }
+ }
+}
+
+void CompactView::expand(int item)
+{
+ if(item != -1 && !viewItems_[item].expanded)
+ {
+ QModelIndex idx=viewItems_[item].index;
+
+ //mark the item as expanded
+ storeExpanded(idx);
+ viewItems_[item].expanded = true;
+
+ //The total number items to be inserted
+ int total=0;
+ totalNumOfExpandedChildren(idx,total);
+
+ //Insert the required number items
+ ViewItemIterator it=viewItems_.begin();
+ viewItems_.insert(it+item+1,total,CompactViewItem());
+
+ //recursively relayout the item
+ layout(item,false,false,true);
+
+ UI_ASSERT(viewItems_[item].total==total,"viewItems_[" << item << "].total=" << viewItems_[item].total <<
+ " total=" << total);
+
+ //We need to update the parentItem in the items after the insertion.
+ //When layout() is called with the given arguments it is delayed to
+ //this point to gain performance!
+ const int itemsCount=static_cast<int>(viewItems_.size());
+ int count=viewItems_[item].total;
+ for(int i = item + count+1; i < itemsCount; i++)
+ if (viewItems_[i].parentItem >= item)
+ viewItems_[i].parentItem += count;
+
+ //update the scrollbars and rerender the viewport
+ updateRowCount();
+ updateScrollBars();
+ viewport()->update();
+ }
+}
+
+void CompactView::expand(const QModelIndex &idx)
+{
+ int item=viewIndex(idx);
+ expand(item);
+}
+
+void CompactView::expandAll(const QModelIndex& idx)
+{
+ int item = viewIndex(idx);
+ if (item != -1) // is visible
+ {
+ //first we need to collapse all the children to start
+ //with a managable state.
+ collapseAllCore(idx);
+
+ //mark the item as expanded
+ storeExpanded(idx);
+ viewItems_[item].expanded = true;
+
+ //The total number items to be inserted
+ int total=0;
+ totalNumOfChildren(idx,total);
+
+ //Insert the required number items
+ ViewItemIterator it=viewItems_.begin();
+ viewItems_.insert(it+item+1,total,CompactViewItem());
+
+ //recursively relayout the item
+ layout(item,true,false,true);
+
+ UI_ASSERT(viewItems_[item].total==total,"viewItems_[" << item << "].total=" << viewItems_[item].total <<
+ " total=" << total);
+
+ //We need to update the parentItem in the items after the insertion.
+ //When layout() is called with the given arguments it is delayed to
+ //this point to gain performance!
+ const int itemsCount=static_cast<int>(viewItems_.size());
+ int count=viewItems_[item].total;
+ for(int i = item + count+1; i < itemsCount; i++)
+ if (viewItems_[i].parentItem >= item)
+ viewItems_[i].parentItem += count;
+
+
+ //update the scrollbars and rerender the viewport
+ updateRowCount();
+ updateScrollBars();
+ viewport()->update();
+ }
+}
+
+void CompactView::restoreExpand(const QModelIndex& idx)
+{
+ //expandedIndexed now contains all the indexes to expand
+ expand(idx);
+}
+
+void CompactView::collapse(int item)
+{
+ if (item == -1 || expandedIndexes.isEmpty())
+ return;
+
+ const QModelIndex &modelIndex = viewItems_.at(item).index;
+ //if(!isPersistent(modelIndex))
+ // return; // if the index is not persistent, no chances it is expanded
+
+ QSet<QPersistentModelIndex>::iterator it = expandedIndexes.find(modelIndex);
+ if (it == expandedIndexes.end() || viewItems_.at(item).expanded == false)
+ return; // nothing to do
+
+ expandedIndexes.erase(it);
+ viewItems_[item].expanded = false;
+ int total=viewItems_[item].total;
+ int index = item;
+ while (index > -1)
+ {
+ viewItems_[index].total-=total;
+ index = viewItems_[index].parentItem;
+ }
+ removeViewItems(item + 1, total); // collapse
+}
+
+void CompactView::collapse(const QModelIndex &index)
+{
+ int i = viewIndex(index);
+ if (i != -1) // is visible
+ {
+ collapse(i);
+ updateRowCount();
+ updateScrollBars();
+ viewport()->update();
+ }
+}
+
+bool CompactView::collapseAllCore(const QModelIndex &index)
+{
+ //identify item
+ int item = viewIndex(index);
+
+ //check if there is nothing to do
+ if (item == -1 || expandedIndexes.isEmpty())
+ return false;
+
+ //check if the item is expanded
+ QSet<QPersistentModelIndex>::iterator it = expandedIndexes.find(index);
+ if (it == expandedIndexes.end() || viewItems_.at(item).expanded == false)
+ return false;
+
+ //remove all the children of the item
+ viewItems_[item].expanded = false;
+ int total=viewItems_[item].total;
+ int parentItem = item;
+ while (parentItem > -1)
+ {
+ viewItems_[parentItem].total-=total;
+ parentItem = viewItems_[parentItem].parentItem;
+ }
+ removeViewItems(item + 1, total);
+
+ //recursivel remove the indexes related to the deleted items from the expanded set
+ removeAllFromExpanded(index);
+
+ updateRowCount();
+ return true;
+}
+
+void CompactView::collapseAll(const QModelIndex &index)
+{
+ if(collapseAllCore(index))
+ {
+ updateScrollBars();
+ viewport()->update();
+ }
+}
+
+void CompactView::removeAllFromExpanded(const QModelIndex &index)
+{
+ if(expandedIndexes.isEmpty())
+ return;
+
+ QSet<QPersistentModelIndex>::iterator it = expandedIndexes.find(index);
+ if(it == expandedIndexes.end())
+ return;
+
+ expandedIndexes.erase(it);
+
+ for(int i=0; i < model_->rowCount(index); i++)
+ {
+ QModelIndex chIdx=model_->index(i, 0, index);
+ removeAllFromExpanded(chIdx);
+ }
+}
+
+
+bool CompactView::isExpanded(const QModelIndex &index) const
+{
+ return isIndexExpanded(index);
+}
+
+void CompactView::setExpanded(const QModelIndex &index, bool expanded)
+{
+ if (expanded)
+ expand(index);
+ else
+ collapse(index);
+}
+
+//Expands all expandable items.
+void CompactView::expandAll()
+{
+ viewItems_.clear();
+ expandedIndexes.clear();
+ //d->interruptDelayedItemsLayout();
+ layout(-1, true,false,false);
+ updateRowCount();
+ updateScrollBars();
+ viewport()->update();
+}
+
+//Collapses all expanded items.
+void CompactView::collapseAll()
+{
+ expandedIndexes.clear();
+ doItemsLayout();
+}
+
+//========================================================
+//
+// Selection
+//
+//========================================================
+
+void CompactView::setCurrentIndex(const QModelIndex &index)
+{
+ if(selectionModel_ && index.isValid())
+ {
+ QItemSelectionModel::SelectionFlags command = selectionCommand(index, 0);
+ selectionModel_->setCurrentIndex(index, command);
+ //currentIndexSet_ = true;
+ QPoint offset;
+ if((command & QItemSelectionModel::Current) == 0)
+ //pressedPosition_ = visualRect(currentIndex()).center() + offset;
+ pressedRefIndex_=currentIndex();
+ }
+}
+
+
+QModelIndex CompactView::currentIndex() const
+{
+ return selectionModel_ ? selectionModel_->currentIndex() : QModelIndex();
+}
+
+QModelIndexList CompactView::selectedIndexes() const
+{
+ if(selectionModel_)
+ return selectionModel_->selectedIndexes();
+
+ return QModelIndexList();
+}
+
+
+/*
+ Applies the selection command to the items in or touched by the
+ rectangle rect.
+*/
+void CompactView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command)
+{
+ if (!selectionModel_ || rect.isNull())
+ return;
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << "CompactView::setSelection --> rect=" << rect;
+#endif
+
+ QPoint tl=QPoint(rect.x(),rect.y());
+ QPoint br=QPoint(rect.x()+rect.width(),rect.y()+rect.height());
+
+ if(tl.y() > br.y())
+ qSwap(tl,br);
+
+ QModelIndex topLeft = indexAt(tl);
+ QModelIndex bottomRight = indexAt(br);
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << " tl=" << tl << " " << topLeft.data().toString() <<
+ " br=" << br << " " << bottomRight.data().toString();
+#endif
+
+ if (!topLeft.isValid() && !bottomRight.isValid())
+ {
+ if(command & QItemSelectionModel::Clear)
+ selectionModel_->clear();
+ return;
+ }
+
+ if (!topLeft.isValid() && !viewItems_.empty())
+ topLeft = viewItems_.front().index;
+
+ if (!bottomRight.isValid() && !viewItems_.empty())
+ {
+ const QModelIndex index = viewItems_.back().index;
+ bottomRight = index.sibling(index.row(),0);
+ }
+
+ select(topLeft, bottomRight, command);
+}
+
+void CompactView::select(const QModelIndex &topIndex, const QModelIndex &bottomIndex,
+ QItemSelectionModel::SelectionFlags command)
+{
+ QItemSelection selection;
+ const int top = viewIndex(topIndex),
+ bottom = viewIndex(bottomIndex);
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << "CompactView::select --> command=" << command;
+ UiLog().dbg() << "top=" << top << " " << topIndex.data().toString() <<
+ " bottom=" << bottom << " " << bottomIndex.data().toString();
+#endif
+
+ QModelIndex previous;
+ QItemSelectionRange currentRange;
+ QStack<QItemSelectionRange> rangeStack;
+ for(int i = top; i <= bottom; ++i)
+ {
+ QModelIndex index = modelIndex(i);
+ QModelIndex parent = index.parent();
+ QModelIndex previousParent = previous.parent();
+
+ //same parent as previous
+ if (previous.isValid() && parent == previousParent)
+ {
+ //same parent
+ if (qAbs(previous.row() - index.row()) > 1)
+ {
+ //a hole (hidden index inside a range) has been detected
+ if (currentRange.isValid())
+ {
+ selection.append(currentRange);
+ }
+ //let's start a new range
+ currentRange = QItemSelectionRange(index, index);
+ }
+
+ else
+ {
+ QModelIndex tl = model_->index(currentRange.top(),0,
+ currentRange.parent());
+ currentRange = QItemSelectionRange(tl, index);
+ }
+ }
+
+ //The current parent is the previous item
+ else if(previous.isValid() &&
+ parent == model_->index(previous.row(), 0, previousParent))
+ {
+ rangeStack.push(currentRange);
+ currentRange = QItemSelectionRange(index, index);
+ }
+
+ else
+ {
+ if(currentRange.isValid())
+ selection.append(currentRange);
+ if(rangeStack.isEmpty())
+ {
+ currentRange = QItemSelectionRange(index, index);
+ }
+ else
+ {
+ currentRange = rangeStack.pop();
+ index = currentRange.bottomRight(); //let's resume the range
+ --i; //we process again the current item
+ }
+ }
+
+ previous = index;
+ }
+
+ if (currentRange.isValid())
+ selection.append(currentRange);
+
+ for (int i = 0; i < rangeStack.count(); ++i)
+ selection.append(rangeStack.at(i));
+
+ selectionModel_->select(selection, command);
+}
+
+
+/*
+ Returns the SelectionFlags to be used when updating a selection with
+ to include the index specified. The event is a user input event,
+ such as a mouse or keyboard event.
+*/
+
+QItemSelectionModel::SelectionFlags CompactView::selectionCommand(
+ const QModelIndex &index, const QEvent *event) const
+{
+ Qt::KeyboardModifiers modifiers = QApplication::keyboardModifiers();
+ if (event) {
+
+ switch (event->type()) {
+ case QEvent::MouseMove: {
+ // Toggle on MouseMove
+ modifiers = static_cast<const QMouseEvent*>(event)->modifiers();
+ if (modifiers & Qt::ControlModifier)
+ return QItemSelectionModel::ToggleCurrent|selectionBehaviorFlags();
+ break;
+ }
+ case QEvent::MouseButtonPress: {
+ modifiers = static_cast<const QMouseEvent*>(event)->modifiers();
+ const Qt::MouseButton button = static_cast<const QMouseEvent*>(event)->button();
+ const bool rightButtonPressed = button & Qt::RightButton;
+ const bool shiftKeyPressed = modifiers & Qt::ShiftModifier;
+ const bool controlKeyPressed = modifiers & Qt::ControlModifier;
+ const bool indexIsSelected = selectionModel_->isSelected(index);
+ if ((shiftKeyPressed || controlKeyPressed) && rightButtonPressed)
+ return QItemSelectionModel::NoUpdate;
+ if (!shiftKeyPressed && !controlKeyPressed && indexIsSelected)
+ return QItemSelectionModel::NoUpdate;
+ if (!index.isValid() && !rightButtonPressed && !shiftKeyPressed && !controlKeyPressed)
+ return QItemSelectionModel::Clear;
+ if (!index.isValid())
+ return QItemSelectionModel::NoUpdate;
+ break;
+ }
+ case QEvent::MouseButtonRelease: {
+ // ClearAndSelect on MouseButtonRelease if MouseButtonPress on selected item or empty area
+ modifiers = static_cast<const QMouseEvent*>(event)->modifiers();
+ const Qt::MouseButton button = static_cast<const QMouseEvent*>(event)->button();
+ const bool rightButtonPressed = button & Qt::RightButton;
+ const bool shiftKeyPressed = modifiers & Qt::ShiftModifier;
+ const bool controlKeyPressed = modifiers & Qt::ControlModifier;
+ if (((index == pressedIndex_ && selectionModel_->isSelected(index))
+ || !index.isValid()) //&& state != QAbstractItemView::DragSelectingState
+ && !shiftKeyPressed && !controlKeyPressed && (!rightButtonPressed || !index.isValid()))
+ return QItemSelectionModel::ClearAndSelect|selectionBehaviorFlags();
+ return QItemSelectionModel::NoUpdate;
+ }
+ case QEvent::KeyPress: {
+ // NoUpdate on Key movement and Ctrl
+ modifiers = static_cast<const QKeyEvent*>(event)->modifiers();
+ switch (static_cast<const QKeyEvent*>(event)->key()) {
+ case Qt::Key_Backtab:
+ modifiers = modifiers & ~Qt::ShiftModifier; // special case for backtab
+ case Qt::Key_Down:
+ case Qt::Key_Up:
+ case Qt::Key_Left:
+ case Qt::Key_Right:
+ case Qt::Key_Home:
+ case Qt::Key_End:
+ case Qt::Key_PageUp:
+ case Qt::Key_PageDown:
+ case Qt::Key_Tab:
+ if (modifiers & Qt::ControlModifier
+#ifdef QT_KEYPAD_NAVIGATION
+ // Preserve historical tab order navigation behavior
+ || QApplication::navigationMode() == Qt::NavigationModeKeypadTabOrder
+#endif
+ )
+ return QItemSelectionModel::NoUpdate;
+ break;
+ case Qt::Key_Select:
+ return QItemSelectionModel::Toggle|selectionBehaviorFlags();
+ case Qt::Key_Space:// Toggle on Ctrl-Qt::Key_Space, Select on Space
+ if (modifiers & Qt::ControlModifier)
+ return QItemSelectionModel::Toggle|selectionBehaviorFlags();
+ return QItemSelectionModel::Select|selectionBehaviorFlags();
+ default:
+ break;
+ }
+ }
+ default:
+ break;
+ }
+ }
+
+ if (modifiers & Qt::ShiftModifier)
+ return QItemSelectionModel::SelectCurrent|selectionBehaviorFlags();
+ if (modifiers & Qt::ControlModifier)
+ return QItemSelectionModel::Toggle|selectionBehaviorFlags();
+ //if (state == QAbstractItemView::DragSelectingState) {
+ // //when drag-selecting we need to clear any previous selection and select the current one
+ // return QItemSelectionModel::Clear|QItemSelectionModel::SelectCurrent|selectionBehaviorFlags();
+ //}
+
+ return QItemSelectionModel::ClearAndSelect|selectionBehaviorFlags();
+}
+
+/*
+ Returns the rectangle from the viewport of the items in the given
+ selection.
+
+ The returned region only contains rectangles intersecting
+ (or included in) the viewport.
+*/
+QRegion CompactView::visualRegionForSelection(const QItemSelection &selection) const
+{
+ if(selection.isEmpty())
+ return QRegion();
+
+ QRegion selectionRegion;
+ const QRect &viewportRect = viewport()->rect();
+ for(int i = 0; i < selection.count(); ++i)
+ {
+ QItemSelectionRange range = selection.at(i);
+ if (!range.isValid())
+ continue;
+
+ QModelIndex leftIndex = range.topLeft();
+ if (!leftIndex.isValid())
+ continue;
+
+ QModelIndex rightIndex = range.bottomRight();
+ if (!rightIndex.isValid())
+ continue;
+
+ int left=100000000,right=0,top=1000000000, bottom=0;
+ Q_FOREACH(QModelIndex idx,range.indexes())
+ {
+ const QRect r = visualRect(idx);
+ //UiLog().dbg() << r << " " << idx << " " << idx.data().toString();
+ if(r.x() < left) left=r.x();
+ if(r.right()+1 > right) right=r.right()+1;
+ if(r.y() < top) top=r.y();
+ if(r.bottom()+1 > bottom ) bottom=r.bottom()+1;
+ }
+
+ top-=1;
+ bottom+=1;
+
+ QRect combined(left,top,right-left+1,bottom-top+1);
+ if (viewportRect.intersects(combined))
+ selectionRegion += combined;
+ }
+ return selectionRegion;
+}
+
+/*
+ This slot is called when the selection is changed. The previous
+ selection (which may be empty), is specified by deselected, and the
+ new selection by selected.
+*/
+void CompactView::selectionChanged(const QItemSelection &selected,
+ const QItemSelection &deselected)
+{
+ if(isVisible()) // && updatesEnabled()) {
+ {
+ QRegion des=visualRegionForSelection(deselected);
+ QRegion sel=visualRegionForSelection(selected);
+
+#ifdef _UI_COMPACTVIEW_DEBUG
+ UiLog().dbg() << "CompactView::selectionChanged -->";
+ UiLog().dbg() << " deselect=" << des.boundingRect() << " select=" << sel.boundingRect();
+ QRegion un=des | sel;
+ UiLog().dbg() << " union=" << un.boundingRect();
+#endif
+ viewport()->update(des | sel);
+ }
+}
+
+/*
+ This slot is called when a new item becomes the current item.
+ The previous current item is specified by the previous index, and the new
+ item by the current index.
+*/
+void CompactView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
+{
+ if(!isVisible())
+ return;
+
+ if(previous.isValid())
+ {
+ update(previous);
+ }
+
+ if(current.isValid())
+ {
+ scrollTo(current);
+ update(current);
+ }
+}
+
+
diff --git a/Viewer/src/CompactView.hpp b/Viewer/src/CompactView.hpp
new file mode 100644
index 0000000..e9f67b1
--- /dev/null
+++ b/Viewer/src/CompactView.hpp
@@ -0,0 +1,216 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#ifndef COMPACTVIEW_HPP
+#define COMPACTVIEW_HPP
+
+#include <QAbstractScrollArea>
+#include <QBasicTimer>
+#include <QItemSelectionModel>
+#include <QMap>
+#include <QModelIndex>
+#include <QPointer>
+#include <QSet>
+#include <QStyleOptionViewItem>
+
+class TreeNodeModel;
+class GraphNodeViewItem;
+class CompactNodeViewDelegate;
+class QStyledItemDelegate;
+
+//Struct representing visible items in the view. When an item is collapsed
+//all its children will be removed from viewItems.
+struct CompactViewItem
+{
+ CompactViewItem() : parentItem(-1), total(0), widestInSiblings(0), expanded(0), hasChildren(0),
+ hasMoreSiblings(0), level(0), width(0), height(0), x(0) {}
+
+ QModelIndex index; //the model index represented by the item.
+ //We remove items whenever the indexes are invalidated
+ int parentItem; // parent item index in viewItems
+ uint total; // total number of visible children in the view
+ uint widestInSiblings;
+ uint expanded : 1; //the item expanded
+ uint hasChildren : 1; // if the item has children in the model (it is
+ // independent of the expanded/collapsed state)
+ uint hasMoreSiblings : 1;
+ uint level : 12; // indentation
+ uint width: 12;
+ uint height : 16;
+ uint x: 16;
+
+ int right() const {return x+width;}
+ int alignedRight() const {return x+widestInSiblings;}
+ bool isFirstChild() const {return index.row() ==0;}
+ bool isLeaf() const {return total == 0;}
+};
+
+
+class CompactView : public QAbstractScrollArea
+{
+Q_OBJECT
+
+public:
+ explicit CompactView(TreeNodeModel* model,QWidget *parent=0);
+ ~CompactView();
+
+ QModelIndex currentIndex() const;
+ QModelIndexList selectedIndexes() const;
+ QModelIndex indexAt(const QPoint &point) const;
+ QRect visualRect(const QModelIndex &index) const;
+ bool isExpanded(const QModelIndex &index) const;
+ void setExpanded(const QModelIndex &index, bool expanded);
+ void expandAll(const QModelIndex &index);
+ void collapseAll(const QModelIndex &index);
+
+public Q_SLOTS:
+ void reset();
+ void setCurrentIndex(const QModelIndex &index);
+ void update(const QModelIndex &index);
+ void expand(const QModelIndex &index);
+ void collapse(const QModelIndex &index);
+ void expandAll();
+ void collapseAll();
+
+protected Q_SLOTS:
+ void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
+ void rowsInserted(const QModelIndex&,int,int);
+ void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end);
+ void rowsRemoved(const QModelIndex &parent, int start, int end);
+ virtual void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
+ void currentChanged(const QModelIndex ¤t, const QModelIndex &previous);
+
+Q_SIGNALS:
+ void doubleClicked(const QModelIndex&);
+
+protected:
+ void mousePressEvent(QMouseEvent* event);
+ void mouseReleaseEvent(QMouseEvent *event);
+ void mouseDoubleClickEvent(QMouseEvent *event);
+ void keyPressEvent(QKeyEvent *event);
+ void paintEvent(QPaintEvent *event);
+ void resizeEvent(QResizeEvent *event);
+ bool viewportEvent(QEvent *event);
+ void timerEvent(QTimerEvent *event);
+
+ void attachModel();
+ void insertItems(const QModelIndex& parent, int);
+ void paint(QPainter *painter,const QRegion& region);
+ void drawRow(QPainter* painter,int start,int xOffset,int &yp,int &itemsInRow,std::vector<int>&);
+
+ void doItemsLayout(bool hasRemovedItems=false);
+ void layout(int parentId, bool recursiveExpanding,bool afterIsUninitialized,bool preAllocated);
+
+ void scrollTo(const QModelIndex &index);
+ int itemRow(int item) const;
+ int itemCountInRow(int start) const;
+ void rowProperties(int start,int& rowHeight,int &itemsInRow,std::vector<int>& indentVec) const;
+ int rowHeight(int start,int forward,int &itemsInRow) const;
+ void coordinateForItem(int item,int& itemY,int& itemRowHeight) const;
+ int itemAtCoordinate(const QPoint& coordinate) const;
+ int itemAtRowCoordinate(int start,int count,int xPos) const;
+
+ QModelIndex modelIndex(int i) const;
+ int viewIndex(const QModelIndex& index) const;
+
+ void restoreExpand(const QModelIndex& idx);
+ void removeAllFromExpanded(const QModelIndex &index);
+
+ void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command);
+ void select(const QModelIndex &topIndex, const QModelIndex &bottomIndex,
+ QItemSelectionModel::SelectionFlags command);
+
+ QItemSelectionModel::SelectionFlags selectionCommand(const QModelIndex &index,
+ const QEvent *event) const;
+
+ QRegion visualRegionForSelection(const QItemSelection &selection) const;
+
+ int firstVisibleItem(int &offset) const;
+ void updateRowCount();
+ void updateScrollBars();
+ void adjustWidthInParent(int start);
+ //void shiftItems(int start);
+ //void shiftItems(int start,int diff);
+
+ void setExpectedBg(QColor c) {expectedBg_=c;}
+ void setConnectorColour(QColor c) {connectorColour_=c;}
+
+ enum ScrollMode {
+ ScrollPerItem,
+ ScrollPerPixel
+ };
+
+ TreeNodeModel* model_;
+ CompactNodeViewDelegate* delegate_;
+
+ // used when expanding and collapsing items
+ QSet<QPersistentModelIndex> expandedIndexes;
+
+private:
+ int totalNumOfChildren(const QModelIndex& idx,int& num) const;
+ int totalNumOfExpandedChildren(const QModelIndex& idx,int& num) const;
+ void expand(int item);
+ void collapse(int item);
+ bool collapseAllCore(const QModelIndex &index);
+
+ void insertViewItems(int pos, int count, const CompactViewItem &viewItem);
+ void removeViewItems(int pos, int count);
+
+ void doDelayedWidthAdjustment();
+
+ int connectorPos(CompactViewItem* item, CompactViewItem* parent) const;
+ int translation() const;
+
+ typedef std::vector<CompactViewItem>::iterator ViewItemIterator;
+ ScrollMode verticalScrollMode_;
+ mutable std::vector<CompactViewItem> viewItems_;
+ int rowCount_;
+ int maxRowWidth_;
+ mutable int lastViewedItem_;
+ QModelIndex root_;
+ int topMargin_;
+ int leftMargin_;
+ int itemGap_;
+ int connectorGap_;
+ int expandConnectorLenght_;
+
+ QPointer<QItemSelectionModel> selectionModel_;
+ QPoint pressedPosition_;
+ QPersistentModelIndex pressedIndex_;
+ QPersistentModelIndex pressedRefIndex_;
+ bool noSelectionOnMousePress_;
+ QStyledItemDelegate* itemDelegate_;
+ QColor expectedBg_;
+ QColor connectorColour_;
+ QBasicTimer delayedWidth_;
+ int delayedTimeout_;
+
+ inline bool storeExpanded(const QPersistentModelIndex &idx)
+ {
+ if(expandedIndexes.contains(idx))
+ return false;
+ expandedIndexes.insert(idx);
+ return true;
+ }
+
+ inline bool isIndexExpanded(const QModelIndex &idx) const
+ {
+ //We first check if the idx is a QPersistentModelIndex, because creating QPersistentModelIndex is slow
+ return expandedIndexes.contains(idx);
+ }
+
+ inline QItemSelectionModel::SelectionFlags selectionBehaviorFlags() const
+ {
+ return QItemSelectionModel::NoUpdate;
+ }
+};
+
+#endif // COMPACTVIEW_HPP
+
diff --git a/Viewer/src/ConfigListDelegate.cpp b/Viewer/src/ConfigListDelegate.cpp
index f6fcbc9..6d42f55 100644
--- a/Viewer/src/ConfigListDelegate.cpp
+++ b/Viewer/src/ConfigListDelegate.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -32,11 +32,8 @@ ConfigListDelegate::ConfigListDelegate(int iconSize,int maxWidth,QWidget *parent
void ConfigListDelegate::paint(QPainter *painter,const QStyleOptionViewItem &option,
const QModelIndex& index) const
{
- QStyleOptionViewItemV4 vopt(option);
- initStyleOption(&vopt, index);
-
- const QStyle *style = vopt.widget ? vopt.widget->style() : QApplication::style();
- const QWidget* widget = vopt.widget;
+ QStyleOptionViewItem vopt(option);
+ initStyleOption(&vopt, index);
QPixmap pix=index.data(Qt::DecorationRole).value<QPixmap>();
diff --git a/Viewer/src/ConfigListDelegate.hpp b/Viewer/src/ConfigListDelegate.hpp
index 9908e8d..e11230c 100644
--- a/Viewer/src/ConfigListDelegate.hpp
+++ b/Viewer/src/ConfigListDelegate.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ConnectState.cpp b/Viewer/src/ConnectState.cpp
index 56e6e1e..2253135 100644
--- a/Viewer/src/ConnectState.cpp
+++ b/Viewer/src/ConnectState.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ConnectState.hpp b/Viewer/src/ConnectState.hpp
index 1ff8a6b..af627a0 100644
--- a/Viewer/src/ConnectState.hpp
+++ b/Viewer/src/ConnectState.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -31,7 +31,7 @@ public:
const std::string& shortErrorMessage() const {return shortErrMsg_;}
protected:
- void init();
+ static void init();
void logConnect();
void logFailed();
void logDisconnect();
diff --git a/Viewer/src/CustomCommandDialog.cpp b/Viewer/src/CustomCommandDialog.cpp
index ebd7245..010bd9c 100644
--- a/Viewer/src/CustomCommandDialog.cpp
+++ b/Viewer/src/CustomCommandDialog.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/CustomCommandDialog.hpp b/Viewer/src/CustomCommandDialog.hpp
index e74f399..cd0dde7 100644
--- a/Viewer/src/CustomCommandDialog.hpp
+++ b/Viewer/src/CustomCommandDialog.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/CustomCommandHandler.cpp b/Viewer/src/CustomCommandHandler.cpp
index 3031cfb..45c7949 100644
--- a/Viewer/src/CustomCommandHandler.cpp
+++ b/Viewer/src/CustomCommandHandler.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -18,11 +18,9 @@
#include "VSettings.hpp"
-CustomCommand::CustomCommand(const std::string &name, const std::string &command, bool context)
+CustomCommand::CustomCommand(const std::string &name, const std::string &command, bool context) :
+ name_(name), command_(command), inContextMenu_(context)
{
- name_ = name;
- command_ = command;
- inContextMenu_ = context;
}
@@ -34,28 +32,22 @@ void CustomCommand::set(const std::string &name, const std::string &command, boo
}
-void CustomCommand::save(VSettings *vs)
+void CustomCommand::save(VSettings *vs) const
{
vs->put("name", name());
vs->put("command", command());
vs->put("context", contextString());
}
-
-
CustomCommandHandler::CustomCommandHandler()
{
}
-
void CustomCommandHandler::init()
{
readSettings();
}
-
-
-
CustomCommand* CustomCommandHandler::replace(int index, const std::string& name, const std::string& command, bool context)
{
assert(index >= 0);
@@ -168,11 +160,7 @@ void CustomCommandHandler::writeSettings()
}
void CustomCommandHandler::readSettings()
-{
- std::vector<VSettings> vsItems;
- std::string dummyFileName="dummy";
- std::string key="commands";
-
+{
std::string settingsFilePath = settingsFile();
VSettings vs(settingsFilePath);
@@ -221,19 +209,8 @@ CustomSavedCommandHandler* CustomSavedCommandHandler::instance()
CustomCommand* CustomSavedCommandHandler::add(const std::string& name, const std::string& command, bool context, bool saveSettings)
{
- CustomCommand *item;
- //int index = findIndex(name);
-
- //if (index == -1) // not already in the list
- {
- item=new CustomCommand(name, command, context);
- items_.push_back(item);
- }
- //else // already in the list - just update it
- //{
- // item = items_[index];
- // item->set(name, command, context);
- //}
+ CustomCommand *item=new CustomCommand(name, command, context);
+ items_.push_back(item);
if (saveSettings)
writeSettings();
@@ -274,12 +251,11 @@ CustomCommandHistoryHandler* CustomCommandHistoryHandler::instance()
CustomCommand* CustomCommandHistoryHandler::add(const std::string& name, const std::string& command, bool context, bool saveSettings)
{
- CustomCommand *item;
int index = findIndexFromName(name);
if (index == -1) // not already in the list
{
- item=new CustomCommand(name, command, context);
+ CustomCommand *item=new CustomCommand(name, command, context);
items_.push_front(item); // add it to the front
if (items_.size() > maxCommands_) // too many commands?
diff --git a/Viewer/src/CustomCommandHandler.hpp b/Viewer/src/CustomCommandHandler.hpp
index 6d69555..22847f8 100644
--- a/Viewer/src/CustomCommandHandler.hpp
+++ b/Viewer/src/CustomCommandHandler.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -20,12 +20,12 @@ class CustomCommand
{
public:
CustomCommand(const std::string &name, const std::string &command, bool context);
- std::string name() const {return name_;};
- std::string command() const {return command_;};
- bool inContextMenu() const {return inContextMenu_;};
- std::string contextString() const {return (inContextMenu_ ? "yes" : "no");};
+ const std::string& name() const {return name_;}
+ const std::string& command() const {return command_;}
+ bool inContextMenu() const {return inContextMenu_;}
+ std::string contextString() const {return (inContextMenu_ ? "yes" : "no");}
void set(const std::string &name, const std::string &command, bool context);
- void save(VSettings *vs);
+ void save(VSettings *vs) const;
private:
@@ -55,7 +55,7 @@ public:
//const std::vector<NodeQuery*>& items() const {return items_;}
CustomCommand* find(const std::string& name) const;
int findIndexFromName(const std::string& name) const;
- int numCommands() {return items_.size();};
+ int numCommands() const {return items_.size();}
CustomCommand *commandFromIndex(int i) {return items_[i];};
bool stringToBool(std::string &str);
void swapCommandsByIndex(int i1, int i2);
diff --git a/Viewer/src/CustomListWidget.cpp b/Viewer/src/CustomListWidget.cpp
index dcf4074..358e34b 100644
--- a/Viewer/src/CustomListWidget.cpp
+++ b/Viewer/src/CustomListWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/CustomListWidget.hpp b/Viewer/src/CustomListWidget.hpp
index caa0285..22e9ea8 100644
--- a/Viewer/src/CustomListWidget.hpp
+++ b/Viewer/src/CustomListWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/CustomTabWidget.cpp b/Viewer/src/CustomTabWidget.cpp
index 4004ef5..66c1fb9 100644
--- a/Viewer/src/CustomTabWidget.cpp
+++ b/Viewer/src/CustomTabWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/CustomTabWidget.hpp b/Viewer/src/CustomTabWidget.hpp
index ef9a644..99c853f 100644
--- a/Viewer/src/CustomTabWidget.hpp
+++ b/Viewer/src/CustomTabWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/Dashboard.cpp b/Viewer/src/Dashboard.cpp
index 2be1cba..497f41f 100644
--- a/Viewer/src/Dashboard.cpp
+++ b/Viewer/src/Dashboard.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -24,6 +24,7 @@
#include "VSettings.hpp"
#include "WidgetNameProvider.hpp"
+#include <QContextMenuEvent>
#include <QDebug>
#include <QVBoxLayout>
#include <QLabel>
@@ -113,6 +114,9 @@ DashboardWidget* Dashboard::addWidgetCore(const std::string& type)
{
connect(w,SIGNAL(selectionChanged(VInfo_ptr)),
this,SLOT(slotSelectionChanged(VInfo_ptr)));
+
+ connect(w,SIGNAL(maximisedChanged(DashboardWidget*)),
+ this,SLOT(slotMaximisedChanged(DashboardWidget*)));
}
return w;
@@ -143,6 +147,11 @@ DashboardWidget* Dashboard::addWidget(const std::string& type)
//Get a unique dockId stored as objectName
QString dockId=uniqueDockId();
+ if(hasMaximised())
+ {
+ resetMaximised();
+ }
+
DashboardWidget* w=addWidget(type,dockId.toStdString());
//At this point the widgets can be inactive. Reload will make them active!!!
@@ -190,6 +199,8 @@ DashboardWidget* Dashboard::addWidget(const std::string& type,const std::string&
connect(dw,SIGNAL(closeRequested()),
this,SLOT(slotDockClose()));
+ checkMaximisedState();
+
return w;
}
@@ -274,8 +285,15 @@ void Dashboard::slotDockClose()
{
widgets_.removeOne(dw);
disconnect(this,0,dw,0);
- dw->deleteLater();
+
+ if(dw->isMaximised())
+ resetMaximised();
+
+ checkMaximisedState();
+
+ dw->deleteLater();
}
+ dock->deleteLater();
}
}
@@ -310,7 +328,7 @@ void Dashboard::slotPopInfoPanel(VInfo_ptr info,QString name)
{
if(InfoPanel* ip=static_cast<InfoPanel*>(dw))
{
- ip->setDetached(true);
+ //ip->setDetached(true);
ip->slotReload(info);
ip->setCurrent(name.toStdString());
}
@@ -330,6 +348,88 @@ void Dashboard::slotCommand(VInfo_ptr info,QString cmd)
}
}
+//-------------------------------
+// Maximise panel
+//-------------------------------
+
+void Dashboard::slotMaximisedChanged(DashboardWidget* w)
+{
+ QList<DashboardDock*> dLst=findChildren<DashboardDock*>(QString());
+
+ //maximise the given panel
+ if(w->isMaximised())
+ {
+ bool hasMaxApp=hasMaximisedApplied();
+ //nothing can be maximised in practice at this point
+ Q_ASSERT(hasMaxApp == false);
+ savedDockState_=saveState();
+
+ Q_FOREACH(DashboardDock* d,dLst)
+ {
+ if(d->widget() == w)
+ d->setVisible(true);
+ else
+ {
+ DashboardWidget* dw=static_cast<DashboardWidget*>(d->widget());
+ Q_ASSERT(dw);
+ dw->resetMaximised();
+ d->setVisible(false);
+ }
+ }
+ }
+ //restore the previous state
+ else
+ {
+ resetMaximised();
+ }
+}
+
+bool Dashboard::hasMaximised() const
+{
+ for(int i=0; i < widgets_.count(); i++)
+ {
+ if(widgets_[i]->isMaximised())
+ return true;
+ }
+ return false;
+}
+
+bool Dashboard::hasMaximisedApplied() const
+{
+ QList<DashboardDock*> dLst=findChildren<DashboardDock*>(QString());
+ Q_FOREACH(DashboardDock* d,dLst)
+ {
+ if(d->isVisible() == false)
+ return true;
+ }
+ return false;
+}
+
+void Dashboard::resetMaximised()
+{
+ QList<DashboardDock*> dLst=findChildren<DashboardDock*>(QString());
+ Q_FOREACH(DashboardDock* d,dLst)
+ {
+ DashboardWidget* dw=static_cast<DashboardWidget*>(d->widget());
+ Q_ASSERT(dw);
+ dw->resetMaximised();
+ d->setVisible(true);
+ }
+
+ if(!savedDockState_.isEmpty())
+ {
+ restoreState(savedDockState_);
+ savedDockState_.clear();
+ }
+}
+
+void Dashboard::checkMaximisedState()
+{
+ bool st=(widgets_.count() > 1);
+ for(int i=0; i < widgets_.count(); i++)
+ widgets_.at(i)->setEnableMaximised(st);
+}
+
//------------------------
// Dialogs
//------------------------
@@ -394,7 +494,10 @@ void Dashboard::writeSettings(VComboSettings* vs)
serverFilter_->writeSettings(vs);
//Qt settings
- vs->putQs("state",saveState());
+ if(savedDockState_.isEmpty() == false)
+ vs->putQs("state",savedDockState_);
+ else
+ vs->putQs("state",saveState());
//Other setting
vs->put("widgetCount",findChildren<QDockWidget*>().count());
@@ -453,7 +556,7 @@ void Dashboard::readSettings(VComboSettings* vs)
restoreState(vs->getQs("state").toByteArray());
}
- selectFirstServerInView();
+ initialSelectionInView();
settingsAreRead_=false;
}
@@ -466,11 +569,11 @@ void Dashboard::slotInfoPanelSelection(VInfo_ptr info)
#endif
-void Dashboard::selectFirstServerInView()
+void Dashboard::initialSelectionInView()
{
Q_FOREACH(DashboardWidget* w,widgets_)
{
- if(w->selectFirstServerInView())
+ if(w->initialSelectionInView())
{
return;
}
@@ -559,4 +662,11 @@ void Dashboard::notifyServerFilterDelete()
// Q_EMIT contentsChanged();
}
+//We need to do this in order to prevent the dock window context menu from popping up.
+//See ECFLOW-894
+void Dashboard::contextMenuEvent(QContextMenuEvent * e)
+{
+ e->accept();
+}
+
diff --git a/Viewer/src/Dashboard.hpp b/Viewer/src/Dashboard.hpp
index 6472529..b52dabe 100644
--- a/Viewer/src/Dashboard.hpp
+++ b/Viewer/src/Dashboard.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -42,10 +42,11 @@ public:
ServerFilter* serverFilter() const {return serverFilter_;}
VInfo_ptr currentSelection();
void currentSelection(VInfo_ptr n);
- void selectFirstServer();
bool selectInTreeView(VInfo_ptr);
void addSearchDialog();
DashboardTitle* titleHandler() const {return titleHandler_;}
+ bool hasMaximised() const;
+ bool hasMaximisedApplied() const;
void notifyServerFilterAdded(ServerItem* item);
void notifyServerFilterRemoved(ServerItem* item);
@@ -69,23 +70,29 @@ protected Q_SLOTS:
void slotDialogFinished(int);
void slotDialogClosed();
void slotPopInfoPanel(QString);
- //void slotInfoPanelSelection(VInfo_ptr);
void slotSelectionChanged(VInfo_ptr info);
+ void slotMaximisedChanged(DashboardWidget* w);
+
+protected:
+ void contextMenuEvent(QContextMenuEvent* e);
private:
DashboardWidget* addWidgetCore(const std::string& type);
DashboardWidget* addWidget(const std::string& type,const std::string& dockId);
QString uniqueDockId();
static std::string widgetSettingsId(int i);
- void selectFirstServerInView();
+ void initialSelectionInView();
VInfo_ptr currentSelectionInView();
void addSearchDialog(VInfo_ptr);
+ void resetMaximised();
+ void checkMaximisedState();
ServerFilter* serverFilter_;
DashboardTitle* titleHandler_;
QList<DashboardWidget*> widgets_;
QList<DashboardWidget*> popupWidgets_;
- bool settingsAreRead_;
+ QByteArray savedDockState_;
+ bool settingsAreRead_;
static int maxWidgetNum_;
};
diff --git a/Viewer/src/DashboardDialog.cpp b/Viewer/src/DashboardDialog.cpp
index 8998b52..d72ecdc 100644
--- a/Viewer/src/DashboardDialog.cpp
+++ b/Viewer/src/DashboardDialog.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -53,26 +53,33 @@ void DashboardDialog::add(DashboardWidget* dw)
layout_->insertWidget(0,dw_,1);
- connect(dw_,SIGNAL(titleUpdated(QString)),
- this,SLOT(slotUpdateTitle(QString)));
+ connect(dw_,SIGNAL(titleUpdated(QString,QString)),
+ this,SLOT(slotUpdateTitle(QString,QString)));
dw_->populateDialog();
+ dw_->readSettingsForDialog();
}
void DashboardDialog::reject()
{
- writeSettings();
+ if(dw_)
+ dw_->writeSettingsForDialog();
+
+ writeSettings();
QDialog::reject();
}
void DashboardDialog::closeEvent(QCloseEvent * event)
{
+ if(dw_)
+ dw_->writeSettingsForDialog();
+
Q_EMIT aboutToClose();
event->accept();
writeSettings();
}
-void DashboardDialog::slotUpdateTitle(QString txt)
+void DashboardDialog::slotUpdateTitle(QString txt,QString /*type*/)
{
setWindowTitle(txt.remove("<b>").remove("</b>"));
}
diff --git a/Viewer/src/DashboardDialog.hpp b/Viewer/src/DashboardDialog.hpp
index 38a41bb..f9e5d21 100644
--- a/Viewer/src/DashboardDialog.hpp
+++ b/Viewer/src/DashboardDialog.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -29,7 +29,7 @@ public:
public Q_SLOTS:
void reject();
- void slotUpdateTitle(QString);
+ void slotUpdateTitle(QString,QString);
void slotOwnerDelete();
Q_SIGNALS:
diff --git a/Viewer/src/DashboardDialog.ui b/Viewer/src/DashboardDialog.ui
index b1c4f9c..c55c7ac 100644
--- a/Viewer/src/DashboardDialog.ui
+++ b/Viewer/src/DashboardDialog.ui
@@ -23,6 +23,18 @@
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="layout_" stretch="0">
+ <property name="leftMargin">
+ <number>4</number>
+ </property>
+ <property name="topMargin">
+ <number>2</number>
+ </property>
+ <property name="rightMargin">
+ <number>4</number>
+ </property>
+ <property name="bottomMargin">
+ <number>4</number>
+ </property>
<item>
<widget class="QDialogButtonBox" name="buttonBox_">
<property name="orientation">
diff --git a/Viewer/src/DashboardDock.cpp b/Viewer/src/DashboardDock.cpp
index 85f7d8b..33a1d49 100644
--- a/Viewer/src/DashboardDock.cpp
+++ b/Viewer/src/DashboardDock.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -14,9 +14,11 @@
#include <QPalette>
#include "DashboardWidget.hpp"
+#include "IconProvider.hpp"
DashboardDockTitleWidget::DashboardDockTitleWidget(QWidget *parent) :
- QWidget(parent)
+ QWidget(parent),
+ titleBc_(0)
{
setupUi(this);
@@ -33,25 +35,44 @@ DashboardDockTitleWidget::DashboardDockTitleWidget(QWidget *parent) :
p.setBrush(QPalette::Window,gr);
setPalette(p);
+ //Add warning icon
+ IconProvider::add(":viewer/warning.svg","warning");
+
+ //Title icon + text
p=titleLabel_->palette();
p.setColor(QPalette::WindowText,Qt::white);
titleLabel_->setPalette(p);
+ titleLabel_->hide();
+ titleIconLabel_->hide();
detachedTb_->setProperty("docktitle","1");
+ maxTb_->setProperty("docktitle","1");
optionsTb_->setProperty("docktitle","1");
closeTb_->setProperty("docktitle","1");
+}
+void DashboardDockTitleWidget::setBcWidget(QWidget *w)
+{
+ Q_ASSERT(mainLayout->count() > 1);
+ Q_ASSERT(w);
+ titleBc_=w;
+ mainLayout->insertWidget(1,titleBc_,1);
#if 0
- //Set the initial state of the float tool button
- if(QDockWidget *dw = qobject_cast<QDockWidget*>(parentWidget()))
- {
- if(!dw->features().testFlag(QDockWidget::DockWidgetFloatable))
- {
- //floatTb_->setEnabled(false);
- floatTb_->hide();
- }
- }
+ for(int i=0; i < mainLayout->count(); i++)
+ {
+ if(QLayoutItem* item=mainLayout->itemAt(i))
+ {
+ if(item->widget() == titleIconLabel_)
+ {
+ titleBc_=w;
+ mainLayout->insertWidget(i,titleBc_,1);
+ return;
+ }
+ }
+ }
#endif
+
+ Q_ASSERT(titleBc_);
}
void DashboardDockTitleWidget::setDetachedAction(QAction *ac)
@@ -59,6 +80,11 @@ void DashboardDockTitleWidget::setDetachedAction(QAction *ac)
detachedTb_->setDefaultAction(ac);
}
+void DashboardDockTitleWidget::setMaximisedAction(QAction *ac)
+{
+ maxTb_->setDefaultAction(ac);
+}
+
void DashboardDockTitleWidget::addActions(QList<QAction*> lst)
{
Q_FOREACH(QAction* ac,lst)
@@ -70,13 +96,10 @@ void DashboardDockTitleWidget::addActions(QList<QAction*> lst)
tb->setPopupMode(QToolButton::InstantPopup);
//tb->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
-
QPalette p=tb->palette();
p.setColor(QPalette::ButtonText,Qt::white);
tb->setPalette(p);
-
-
actionLayout_->addWidget(tb);
if(!ac->isEnabled())
@@ -150,9 +173,30 @@ void DashboardDockTitleWidget::on_closeTb__clicked(bool)
}
}
-void DashboardDockTitleWidget::slotUpdateTitle(QString txt)
+void DashboardDockTitleWidget::slotUpdateTitle(QString txt,QString type)
{
- titleLabel_->setText(txt);
+ if(txt.isEmpty())
+ {
+ titleLabel_->hide();
+ titleIconLabel_->hide();
+ }
+ else
+ {
+ if(type == "warning")
+ {
+ titleIconLabel_->setPixmap(IconProvider::pixmap("warning",16));
+ titleIconLabel_->show();
+ txt.prepend(" ");
+ txt.append(" ");
+ }
+ else
+ {
+ titleIconLabel_->show();
+ }
+
+ titleLabel_->show();
+ titleLabel_->setText(txt);
+ }
}
//============================================================
@@ -171,10 +215,11 @@ DashboardDock::DashboardDock(DashboardWidget *dw,QWidget * parent) :
setTitleBarWidget(dt);
dt->setDetachedAction(dw->detachedAction());
+ dt->setMaximisedAction(dw->maximisedAction());
dt->addActions(dw->dockTitleActions());
- connect(dw,SIGNAL(titleUpdated(QString)),
- dt,SLOT(slotUpdateTitle(QString)));
+ connect(dw,SIGNAL(titleUpdated(QString,QString)),
+ dt,SLOT(slotUpdateTitle(QString,QString)));
dw->populateDockTitleBar(dt);
diff --git a/Viewer/src/DashboardDock.hpp b/Viewer/src/DashboardDock.hpp
index ee40251..0ca9604 100644
--- a/Viewer/src/DashboardDock.hpp
+++ b/Viewer/src/DashboardDock.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -28,11 +28,13 @@ public:
QSize sizeHint() const;
QSize minimumSizeHint() const;
QToolButton* optionsTb() const;
+ void setBcWidget(QWidget *w);
void addActions(QList<QAction*> lst);
void setDetachedAction(QAction *ac);
+ void setMaximisedAction(QAction *ac);
public Q_SLOTS:
- void slotUpdateTitle(QString txt);
+ void slotUpdateTitle(QString txt,QString type);
protected Q_SLOTS:
#if 0
@@ -46,6 +48,8 @@ Q_SIGNALS:
protected:
QList<QToolButton*> actionTbList_;
+ QWidget* titleBc_;
+ QPixmap warnPix_;
};
class DashboardDock : public QDockWidget
diff --git a/Viewer/src/DashboardDockTitleWidget.ui b/Viewer/src/DashboardDockTitleWidget.ui
index d4242ab..741b77a 100644
--- a/Viewer/src/DashboardDockTitleWidget.ui
+++ b/Viewer/src/DashboardDockTitleWidget.ui
@@ -25,7 +25,7 @@
<property name="autoFillBackground">
<bool>true</bool>
</property>
- <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,0,0,0,0,0">
+ <layout class="QHBoxLayout" name="mainLayout" stretch="0,0,0,0,0,0,0,0,0">
<property name="spacing">
<number>2</number>
</property>
@@ -45,7 +45,7 @@
<number>2</number>
</property>
<item>
- <spacer name="horizontalSpacer">
+ <spacer name="firstSpacer_">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@@ -54,6 +54,19 @@
</property>
<property name="sizeHint" stdset="0">
<size>
+ <width>2</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
<width>15</width>
<height>20</height>
</size>
@@ -61,6 +74,13 @@
</spacer>
</item>
<item>
+ <widget class="QLabel" name="titleIconLabel_">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QLabel" name="titleLabel_">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
@@ -85,19 +105,6 @@
</widget>
</item>
<item>
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>15</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
<layout class="QHBoxLayout" name="actionLayout_">
<property name="spacing">
<number>0</number>
@@ -113,7 +120,7 @@
<string/>
</property>
<property name="icon">
- <iconset>
+ <iconset resource="viewer.qrc">
<normaloff>:/viewer/images/dock_float.svg</normaloff>:/viewer/images/dock_float.svg</iconset>
</property>
<property name="checkable">
@@ -133,7 +140,7 @@
<string/>
</property>
<property name="icon">
- <iconset>
+ <iconset resource="viewer.qrc">
<normaloff>:/viewer/dock_config.svg</normaloff>:/viewer/dock_config.svg</iconset>
</property>
<property name="checkable">
@@ -148,6 +155,29 @@
</widget>
</item>
<item>
+ <widget class="QToolButton" name="maxTb_">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="icon">
+ <iconset resource="viewer.qrc">
+ <normaloff>:/viewer/dock_max.svg</normaloff>:/viewer/dock_max.svg</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonIconOnly</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QToolButton" name="closeTb_">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@@ -162,13 +192,13 @@
</size>
</property>
<property name="toolTip">
- <string>Close</string>
+ <string>Close panel</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
- <iconset>
+ <iconset resource="viewer.qrc">
<normaloff>:/viewer/images/dock_close.svg</normaloff>:/viewer/images/dock_close.svg</iconset>
</property>
<property name="iconSize">
@@ -184,6 +214,8 @@
</item>
</layout>
</widget>
- <resources/>
+ <resources>
+ <include location="viewer.qrc"/>
+ </resources>
<connections/>
</ui>
diff --git a/Viewer/src/DashboardTitle.cpp b/Viewer/src/DashboardTitle.cpp
index d7ddab6..cb1dcab 100644
--- a/Viewer/src/DashboardTitle.cpp
+++ b/Viewer/src/DashboardTitle.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -162,7 +162,7 @@ void DashboardTitle::updateTitle()
QList<QColor> fillColors;
QList<QColor> textColors;
- const std::vector<ServerItem*> items=filter_->items();
+ const std::vector<ServerItem*>& items=filter_->items();
for(std::vector<ServerItem*>::const_iterator it=items.begin(); it != items.end(); ++it)
{
//Get text
@@ -196,8 +196,7 @@ void DashboardTitle::updateTitle()
Q_ASSERT(num>0);
{
- const int marginX=0;
- const int marginY=0;
+ const int marginX=0;
const int gap=1;
int maxBandH=2;
diff --git a/Viewer/src/DashboardTitle.hpp b/Viewer/src/DashboardTitle.hpp
index ad906d7..d22146b 100644
--- a/Viewer/src/DashboardTitle.hpp
+++ b/Viewer/src/DashboardTitle.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/DashboardWidget.cpp b/Viewer/src/DashboardWidget.cpp
index cfc2816..8252b02 100644
--- a/Viewer/src/DashboardWidget.cpp
+++ b/Viewer/src/DashboardWidget.cpp
@@ -1,6 +1,6 @@
/***************************** LICENSE START ***********************************
- Copyright 2016 ECMWF and INPE. This software is distributed under the terms
+ Copyright 2009-2017 ECMWF and INPE. This software is distributed under the terms
of the Apache License version 2.0. In applying this license, ECMWF does not
waive the privileges and immunities granted to it by virtue of its status as
an Intergovernmental Organization or submit itself to any jurisdiction.
@@ -14,11 +14,18 @@
static QString tooltipUnchk("This panel is <b>linked</b> and will respond to selections made in other panels. Click to toggle.") ;
static QString tooltipChk("This panel is <b>detached</b> and will not respond to selections made in other panels. Click to toggle.");
+static QString tooltipMaxChk("This panel is <b>maximised</b> and hides other panels. Click to restore its original size.") ;
+static QString tooltipMaxUnchk("Maximise panel");
+
DashboardWidget::DashboardWidget(const std::string& type, QWidget* parent) :
QWidget(parent),
type_(type),
- acceptSetCurrent_(false)
+ acceptSetCurrent_(false),
+ bcWidget_(0),
+ ignoreMaximisedChange_(false),
+ inDialog_(false)
{
+ //detach
detachedAction_=new QAction("Detached",this);
QIcon ic(QPixmap(":viewer/dock_chain_closed.svg"));
ic.addPixmap(QPixmap(":viewer/dock_chain_open.svg"),QIcon::Normal,QIcon::On);
@@ -30,6 +37,20 @@ DashboardWidget::DashboardWidget(const std::string& type, QWidget* parent) :
this,SLOT(slotDetachedToggled(bool)));
detachedAction_->setToolTip(tooltipUnchk);
+
+ //maximise
+ maximisedAction_=new QAction("Maximise",this);
+ QIcon icM(QPixmap(":viewer/dock_max.svg"));
+ icM.addPixmap(QPixmap(":viewer/dock_restore.svg"),QIcon::Normal,QIcon::On);
+ icM.addPixmap(QPixmap(":viewer/dock_max_disabled.svg"),QIcon::Disabled,QIcon::Off);
+ maximisedAction_->setIcon(icM);
+ maximisedAction_->setCheckable(true);
+ maximisedAction_->setChecked(false);
+ maximisedAction_->setToolTip("max");
+ connect(maximisedAction_,SIGNAL(toggled(bool)),
+ this,SLOT(slotMaximisedToggled(bool)));
+
+ maximisedAction_->setToolTip(tooltipMaxUnchk);
}
void DashboardWidget::slotDetachedToggled(bool b)
@@ -51,6 +72,55 @@ bool DashboardWidget::detached() const
return detachedAction_->isChecked();
}
+void DashboardWidget::slotMaximisedToggled(bool b)
+{
+ if(!ignoreMaximisedChange_)
+ Q_EMIT maximisedChanged(this);
+
+ if(b)
+ Q_EMIT titleUpdated("Panel maximised!","warning");
+ else
+ Q_EMIT titleUpdated("");
+
+ maximisedAction_->setToolTip((isMaximised())?tooltipMaxChk:tooltipMaxUnchk);
+}
+
+bool DashboardWidget::isMaximised() const
+{
+ return maximisedAction_->isChecked();
+}
+
+//reset the state of the maximised actione without emitting a change signal
+void DashboardWidget::resetMaximised()
+{
+ ignoreMaximisedChange_=true;
+ maximisedAction_->setChecked(false);
+ ignoreMaximisedChange_=false;
+}
+
+void DashboardWidget::setEnableMaximised(bool st)
+{
+ resetMaximised();
+ maximisedAction_->setEnabled(st);
+}
+
+void DashboardWidget::setInDialog(bool b)
+{
+ if(inDialog_ != b)
+ {
+ inDialog_=b;
+ QIcon ic(QPixmap(":viewer/chain_closed.svg"));
+ ic.addPixmap(QPixmap(":viewer/chain_open.svg"),QIcon::Normal,QIcon::On);
+ detachedAction_->setIcon(ic);
+ }
+
+ if(b)
+ {
+ maximisedAction_->setEnabled(false);
+ maximisedAction_->setVisible(false);
+ }
+}
+
void DashboardWidget::writeSettings(VSettings* vs)
{
vs->putAsBool("detached",detached());
diff --git a/Viewer/src/DashboardWidget.hpp b/Viewer/src/DashboardWidget.hpp
index 2d1f26d..f1865f2 100644
--- a/Viewer/src/DashboardWidget.hpp
+++ b/Viewer/src/DashboardWidget.hpp
@@ -1,6 +1,6 @@
/***************************** LICENSE START ***********************************
- Copyright 2016 ECMWF and INPE. This software is distributed under the terms
+ Copyright 2009-2017 ECMWF and INPE. This software is distributed under the terms
of the Apache License version 2.0. In applying this license, ECMWF does not
waive the privileges and immunities granted to it by virtue of its status as
an Intergovernmental Organization or submit itself to any jurisdiction.
@@ -19,6 +19,7 @@
#include "VInfo.hpp"
class DashboardDockTitleWidget;
+class NodePathWidget;
class ServerFilter;
class VSettings;
@@ -34,16 +35,23 @@ public:
virtual void populateDialog()=0;
virtual void reload()=0;
virtual void rerender()=0;
- virtual bool selectFirstServerInView() {return false;}
+ virtual bool initialSelectionInView() {return false;}
virtual VInfo_ptr currentSelection() {return VInfo_ptr(); }
QAction* detachedAction() const {return detachedAction_;}
+ QAction* maximisedAction() const {return maximisedAction_;}
virtual QList<QAction*> dockTitleActions() {return QList<QAction*>();}
bool detached() const;
void setDetached(bool b);
+ bool isMaximised() const;
+ void resetMaximised();
+ void setEnableMaximised(bool st);
+ bool isInDialog() const {return inDialog_;}
virtual void writeSettings(VSettings*);
virtual void readSettings(VSettings*);
+ virtual void writeSettingsForDialog() {}
+ virtual void readSettingsForDialog() {}
const std::string type() const {return type_;}
void id(const std::string& id) {id_=id;}
@@ -52,19 +60,28 @@ public Q_SLOTS:
virtual void setCurrentSelection(VInfo_ptr)=0;
Q_SIGNALS:
- void titleUpdated(QString);
+ void titleUpdated(QString,QString type=QString());
void selectionChanged(VInfo_ptr);
+ void maximisedChanged(DashboardWidget*);
protected Q_SLOTS:
void slotDetachedToggled(bool);
+ void slotMaximisedToggled(bool);
protected:
virtual void detachedChanged()=0;
+ void setInDialog(bool);
std::string id_;
std::string type_;
bool acceptSetCurrent_;
QAction *detachedAction_;
+ QAction *maximisedAction_;
+ bool ignoreMaximisedChange_;
+ NodePathWidget* bcWidget_;
+
+private:
+ bool inDialog_;
};
diff --git a/Viewer/src/DirectoryHandler.cpp b/Viewer/src/DirectoryHandler.cpp
index a1aff8e..01cc24d 100644
--- a/Viewer/src/DirectoryHandler.cpp
+++ b/Viewer/src/DirectoryHandler.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -398,7 +398,7 @@ bool DirectoryHandler::removeFile(const std::string &path, std::string &errorMes
try
{
boost::filesystem::path f(path);
- bool ok = remove(f);
+ remove(f);
}
catch (const boost::filesystem::filesystem_error& err)
{
diff --git a/Viewer/src/DirectoryHandler.hpp b/Viewer/src/DirectoryHandler.hpp
index cbd78f4..9696942 100644
--- a/Viewer/src/DirectoryHandler.hpp
+++ b/Viewer/src/DirectoryHandler.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/EditItemWidget.cpp b/Viewer/src/EditItemWidget.cpp
index c9f938d..9536890 100644
--- a/Viewer/src/EditItemWidget.cpp
+++ b/Viewer/src/EditItemWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/EditItemWidget.hpp b/Viewer/src/EditItemWidget.hpp
index 5ad6c3c..c608624 100644
--- a/Viewer/src/EditItemWidget.hpp
+++ b/Viewer/src/EditItemWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/EditProvider.cpp b/Viewer/src/EditProvider.cpp
index c5d1daf..12c470f 100644
--- a/Viewer/src/EditProvider.cpp
+++ b/Viewer/src/EditProvider.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -11,7 +11,6 @@
#include "NodeFwd.hpp"
-#include "LogServer.hpp"
#include "VNode.hpp"
#include "VReply.hpp"
#include "ServerHandler.hpp"
@@ -28,6 +27,7 @@ void EditProvider::visit(VInfoNode* info)
if(!info)
{
owner_->infoFailed(reply_);
+ return;
}
ServerHandler* server=info_->server();
@@ -36,6 +36,7 @@ void EditProvider::visit(VInfoNode* info)
if(!n || !n->node())
{
owner_->infoFailed(reply_);
+ return;
}
if (preproc_)
diff --git a/Viewer/src/EditProvider.hpp b/Viewer/src/EditProvider.hpp
index 611a233..fd53659 100644
--- a/Viewer/src/EditProvider.hpp
+++ b/Viewer/src/EditProvider.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/EditorInfoLabel.cpp b/Viewer/src/EditorInfoLabel.cpp
index ce9c762..90d9ee6 100644
--- a/Viewer/src/EditorInfoLabel.cpp
+++ b/Viewer/src/EditorInfoLabel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/EditorInfoLabel.hpp b/Viewer/src/EditorInfoLabel.hpp
index 545dbda..73b4058 100644
--- a/Viewer/src/EditorInfoLabel.hpp
+++ b/Viewer/src/EditorInfoLabel.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ExpandState.cpp b/Viewer/src/ExpandState.cpp
index 8c05c0d..434e6df 100644
--- a/Viewer/src/ExpandState.cpp
+++ b/Viewer/src/ExpandState.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -7,55 +7,25 @@
// nor does it submit to any jurisdiction.
//============================================================================
-#include "ExpandState.hpp"
-
-#include <QTreeView>
-
+#include "ExpandStateNode.hpp"
#include "TreeNodeModel.hpp"
#include "VNode.hpp"
#include "VTree.hpp"
-//-------------------------------------
-// ExapandStateNode
-//-------------------------------------
-
-ExpandStateNode::~ExpandStateNode()
-{
- clear();
-}
-
-void ExpandStateNode::clear()
-{
- name_.clear();
- for(unsigned int i=0; i < children_.size(); i++)
- {
- delete children_.at(i);
- }
- children_.clear();
-}
-
-ExpandStateNode* ExpandStateNode::add(const std::string& name)
-{
- ExpandStateNode *n=new ExpandStateNode(name);
- children_.push_back(n);
- return n;
-}
-
-//-------------------------------------
-// ExapandStateTree
-//-------------------------------------
-
-ExpandStateTree::ExpandStateTree(QTreeView * view,TreeNodeModel* model) :
+template <typename View>
+ExpandState<View>::ExpandState(View * view,TreeNodeModel* model) :
view_(view), model_(model), root_(0)
{
}
-ExpandStateTree::~ExpandStateTree()
+template <typename View>
+ExpandState<View>::~ExpandState()
{
clear();
}
-void ExpandStateTree::clear()
+template <typename View>
+void ExpandState<View>::clear()
{
if(root_)
delete root_;
@@ -63,12 +33,14 @@ void ExpandStateTree::clear()
root_=0;
}
-bool ExpandStateTree::rootSameAs(const std::string& name) const
+template <typename View>
+bool ExpandState<View>::rootSameAs(const std::string& name) const
{
return (root_ && root_->name_ == name);
}
-ExpandStateNode* ExpandStateTree::setRoot(const std::string& name)
+template <typename View>
+ExpandStateNode* ExpandState<View>::setRoot(const std::string& name)
{
if(root_)
clear();
@@ -79,21 +51,13 @@ ExpandStateNode* ExpandStateTree::setRoot(const std::string& name)
//Save the expand state for the given node (it can be a server as well)
-void ExpandStateTree::save(const VTreeNode *root)
+template <typename View>
+void ExpandState<View>::save(const VTreeNode *root)
{
assert(root);
clear();
-#if 0
- VInfo_ptr s=currentSelection();
- if(s)
- {
- if(node->server() == s->server())
- expandState_->selection_=s;
- }
-#endif
-
QModelIndex rootIdx=model_->nodeToIndex(root);
if(view_->isExpanded(rootIdx))
{
@@ -102,7 +66,8 @@ void ExpandStateTree::save(const VTreeNode *root)
}
}
-void ExpandStateTree::save(ExpandStateNode *parentExpand,const QModelIndex& parentIdx)
+template <typename View>
+void ExpandState<View>::save(ExpandStateNode *parentExpand,const QModelIndex& parentIdx)
{
for(int i=0; i < model_->rowCount(parentIdx); i++)
{
@@ -118,10 +83,9 @@ void ExpandStateTree::save(ExpandStateNode *parentExpand,const QModelIndex& pare
}
}
-
-
//Save the expand state for the given node (it can be a server as well)
-void ExpandStateTree::restore(const VTreeNode* node)
+template <typename View>
+void ExpandState<View>::restore(const VTreeNode* node)
{
if(!root_)
return;
@@ -133,23 +97,11 @@ void ExpandStateTree::restore(const VTreeNode* node)
}
restore(root_,node);
-
-#if 0
- if(expandState_->selection_)
- {
- VInfo_ptr s=currentSelection();
- if(!s)
- {
- expandState_->selection_->regainData();
- currentSelection(expandState_->selection_);
- }
- }
-#endif
-
clear();
}
-void ExpandStateTree::restore(ExpandStateNode *expand,const VTreeNode* node)
+template <typename View>
+void ExpandState<View>::restore(ExpandStateNode *expand,const VTreeNode* node)
{
//Lookup the node in the model
QModelIndex nodeIdx=model_->nodeToIndex(node);
@@ -178,40 +130,55 @@ void ExpandStateTree::restore(ExpandStateNode *expand,const VTreeNode* node)
}
}
}
-//-------------------------------------
-// ExapandState
-//-------------------------------------
-ExpandState::ExpandState(QTreeView* view,TreeNodeModel* model) : view_(view), model_(model)
+template <typename View>
+void ExpandState<View>::collectExpanded(const VTreeNode* node,QSet<QPersistentModelIndex>& theSet)
{
+ if(!root_)
+ return;
-}
-
+ if(node->vnode()->strName() != root_->name_)
+ {
+ clear();
+ return;
+ }
-ExpandState::~ExpandState()
-{
+ QModelIndex nodeIdx=model_->nodeToIndex(node);
+ collectExpanded(root_,node,nodeIdx,theSet);
clear();
}
-ExpandStateTree* ExpandState::add()
-{
- ExpandStateTree* et=new ExpandStateTree(view_,model_);
- items_ << et;
- return et;
-}
-void ExpandState::remove(ExpandStateTree* es)
+template <typename View>
+void ExpandState<View>::collectExpanded(ExpandStateNode *expand,const VTreeNode* node,const QModelIndex& nodeIdx,
+ QSet<QPersistentModelIndex>& theSet)
{
- items_.removeOne(es);
- delete es;
-}
+ //Lookup the node in the model
+ //QModelIndex nodeIdx=model_->nodeToIndex(node);
+ if(nodeIdx != QModelIndex())
+ {
+ theSet.insert(nodeIdx);
+ //view_->setExpanded(nodeIdx,true);
+ }
+ else
+ {
+ return;
+ }
-void ExpandState::clear()
-{
- Q_FOREACH(ExpandStateTree* et,items_)
+ for(int i=0; i < expand->children_.size(); i++)
{
- delete et;
+ ExpandStateNode *chExpand=expand->children_[i];
+ std::string name=chExpand->name_;
+
+ if(VTreeNode *chNode=node->findChild(name))
+ {
+ QModelIndex chIdx=model_->nodeToIndex(chNode);
+ if(chIdx != QModelIndex())
+ {
+ //setExpanded(chIdx,true);
+ collectExpanded(chExpand,chNode,chIdx,theSet);
+ }
+ }
}
- items_.clear();
- selection_.reset();
}
+
diff --git a/Viewer/src/ExpandState.hpp b/Viewer/src/ExpandState.hpp
index 93d9207..d4c3a1a 100644
--- a/Viewer/src/ExpandState.hpp
+++ b/Viewer/src/ExpandState.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -8,81 +8,51 @@
//
//============================================================================
-#ifndef EXPANDNODE_HPP_
-#define EXPANDNODE_HPP_
+#ifndef EXPANDSTATE_HPP_
+#define EXPANDSTATE_HPP_
#include <string>
-#include <vector>
-#include <QList>
-
-#include "VInfo.hpp"
+#include <QPersistentModelIndex>
class TreeNodeModel;
class QModelIndex;
-class QTreeView;
class VTreeNode;
+class ExpandStateNode;
-class ExpandStateNode
-{
- friend class TreeNodeView;
-
-public:
- explicit ExpandStateNode(const std::string& name) : name_(name) {}
- ExpandStateNode() : name_("") {}
- ~ExpandStateNode();
-
- void clear();
- ExpandStateNode* add(const std::string&);
-
- std::vector<ExpandStateNode*> children_;
- std::string name_;
-
-};
+template <typename View> class ExpandState;
-class ExpandStateTree
+template <typename View>
+class ExpandState
{
- friend class TreeNodeView;
+ friend class TreeNodeView;
+ friend class CompactNodeView;
public:
- explicit ExpandStateTree(QTreeView*,TreeNodeModel*);
- ~ExpandStateTree();
+ explicit ExpandState(View*,TreeNodeModel*);
+ ~ExpandState();
bool rootSameAs(const std::string&) const;
void save(const VTreeNode*);
void restore(const VTreeNode*);
+ void collectExpanded(const VTreeNode* node,QSet<QPersistentModelIndex>&);
+
protected:
void clear();
ExpandStateNode* setRoot(const std::string&);
ExpandStateNode* root() const {return root_;}
void save(ExpandStateNode*,const QModelIndex&);
void restore(ExpandStateNode*,const VTreeNode*);
+ void collectExpanded(ExpandStateNode *expand,const VTreeNode* node,
+ const QModelIndex& nodeIdx,QSet<QPersistentModelIndex>& theSet);
- QTreeView* view_;
+ View* view_;
TreeNodeModel* model_;
ExpandStateNode* root_;
};
-class ExpandState
-{
- friend class TreeNodeView;
-
-public:
- ExpandState(QTreeView*,TreeNodeModel*);
- ~ExpandState();
- ExpandStateTree* add();
- void remove(ExpandStateTree*);
- void clear();
- QList<ExpandStateTree*> items() const {return items_;}
-
-protected:
- QTreeView* view_;
- TreeNodeModel* model_;
- VInfo_ptr selection_;
- QList<ExpandStateTree*> items_;
-
-};
+#include "ExpandState.cpp"
#endif
diff --git a/Viewer/src/VItem.cpp b/Viewer/src/ExpandStateNode.cpp
similarity index 55%
copy from Viewer/src/VItem.cpp
copy to Viewer/src/ExpandStateNode.cpp
index 7619dda..b13cdd5 100644
--- a/Viewer/src/VItem.cpp
+++ b/Viewer/src/ExpandStateNode.cpp
@@ -1,28 +1,33 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
// granted to it by virtue of its status as an intergovernmental organisation
// nor does it submit to any jurisdiction.
-//
//============================================================================
-#include "VItem.hpp"
-#include "VNode.hpp"
+#include "ExpandStateNode.hpp"
-bool VItem::isAncestor(const VItem* n) const
+
+ExpandStateNode::~ExpandStateNode()
{
- if(n == this)
- return true;
+ clear();
+}
- VNode* nd=parent();
- while(nd)
+void ExpandStateNode::clear()
+{
+ name_.clear();
+ for(unsigned int i=0; i < children_.size(); i++)
{
- if(const_cast<VItem*>(n) == nd)
- return true;
-
- nd=nd->parent();
+ delete children_.at(i);
}
- return false;
+ children_.clear();
+}
+
+ExpandStateNode* ExpandStateNode::add(const std::string& name)
+{
+ ExpandStateNode *n=new ExpandStateNode(name);
+ children_.push_back(n);
+ return n;
}
diff --git a/Viewer/src/Palette.hpp b/Viewer/src/ExpandStateNode.hpp
similarity index 52%
copy from Viewer/src/Palette.hpp
copy to Viewer/src/ExpandStateNode.hpp
index 880cd02..8e0d576 100644
--- a/Viewer/src/Palette.hpp
+++ b/Viewer/src/ExpandStateNode.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -8,17 +8,28 @@
//
//============================================================================
-#ifndef VIEWER_SRC_PALETTE_HPP_
-#define VIEWER_SRC_PALETTE_HPP_
+#ifndef EXPANDSTATENODE_HPP
+#define EXPANDSTATENODE_HPP
#include <string>
+#include <vector>
-class Palette
+class ExpandStateNode
{
+ friend class TreeNodeView;
+ friend class CompactNodeView;
+
public:
- Palette();
- static void load(const std::string& parFile);
-};
+ explicit ExpandStateNode(const std::string& name) : name_(name) {}
+ ExpandStateNode() : name_("") {}
+ ~ExpandStateNode();
+
+ void clear();
+ ExpandStateNode* add(const std::string&);
+ std::vector<ExpandStateNode*> children_;
+ std::string name_;
+
+};
-#endif /* VIEWER_SRC_PALETTE_HPP_ */
+#endif // EXPANDSTATENODE_HPP
diff --git a/Viewer/src/FileInfoLabel.cpp b/Viewer/src/FileInfoLabel.cpp
index 8634c79..dc435e7 100644
--- a/Viewer/src/FileInfoLabel.cpp
+++ b/Viewer/src/FileInfoLabel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -45,7 +45,10 @@ FileInfoLabel::FileInfoLabel(QWidget* parent) : QLabel(parent)
void FileInfoLabel::update(VReply* reply,QString extraText)
{
if(!reply)
- clear();
+ {
+ clear();
+ return;
+ }
QString labelText;
QString ttText;
@@ -71,8 +74,6 @@ void FileInfoLabel::update(VReply* reply,QString extraText)
labelText="<b><font color=" + col.name() + ">File: </font></b>";
labelText+="<font color=" +colText.name() + ">" + fileName + "</font>";
- //VFileInfo f(fileName);
-
s="";
//Local read
diff --git a/Viewer/src/FileInfoLabel.hpp b/Viewer/src/FileInfoLabel.hpp
index 54c3c33..e2ca144 100644
--- a/Viewer/src/FileInfoLabel.hpp
+++ b/Viewer/src/FileInfoLabel.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/FileWatcher.cpp b/Viewer/src/FileWatcher.cpp
index 85f4a15..7508647 100644
--- a/Viewer/src/FileWatcher.cpp
+++ b/Viewer/src/FileWatcher.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/FileWatcher.hpp b/Viewer/src/FileWatcher.hpp
index 2e33bf6..6ce733b 100644
--- a/Viewer/src/FileWatcher.hpp
+++ b/Viewer/src/FileWatcher.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/FilterWidget.cpp b/Viewer/src/FilterWidget.cpp
index 7e59c74..b61bdfa 100644
--- a/Viewer/src/FilterWidget.cpp
+++ b/Viewer/src/FilterWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -48,7 +48,7 @@ VParamFilterMenu::VParamFilterMenu(QMenu * parent,VParamSet* filter,QString titl
menu_->addAction(acSep);
//Param name must be unique
- for(std::set<VParam*>::const_iterator it=filter_->all().begin(); it != filter_->all().end(); ++it)
+ for(std::vector<VParam*>::const_iterator it=filter_->all().begin(); it != filter_->all().end(); ++it)
{
addAction((*it)->label(),
(*it)->name());
@@ -236,18 +236,18 @@ void VParamFilterMenu::slotUnselectAll(bool)
void VParamFilterMenu::slotChanged(bool)
{
- std::set<std::string> items;
+ std::vector<std::string> items;
Q_FOREACH(QAction* ac,menu_->actions())
{
if(!ac->isSeparator() &&
ac->isCheckable() && ac->isChecked())
{
- items.insert(ac->data().toString().toStdString());
+ items.push_back(ac->data().toString().toStdString());
}
}
if(filter_)
- filter_->current(items);
+ filter_->setCurrent(items);
checkActionState();
}
@@ -266,8 +266,11 @@ void VParamFilterMenu::reload()
void VParamFilterMenu::checkActionState()
{
- selectAllAc_->setEnabled(!filter_->isComplete());
- unselectAllAc_->setEnabled(!filter_->isEmpty());
+ if(filter_)
+ {
+ selectAllAc_->setEnabled(!filter_->isComplete());
+ unselectAllAc_->setEnabled(!filter_->isEmpty());
+ }
}
//===========================================
diff --git a/Viewer/src/FilterWidget.hpp b/Viewer/src/FilterWidget.hpp
index dd9bce3..1511bdc 100644
--- a/Viewer/src/FilterWidget.hpp
+++ b/Viewer/src/FilterWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/FlagSet.hpp b/Viewer/src/FlagSet.hpp
index 645c2f5..8ef424c 100644
--- a/Viewer/src/FlagSet.hpp
+++ b/Viewer/src/FlagSet.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/FontMetrics.cpp b/Viewer/src/FontMetrics.cpp
new file mode 100644
index 0000000..844abd0
--- /dev/null
+++ b/Viewer/src/FontMetrics.cpp
@@ -0,0 +1,58 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "FontMetrics.hpp"
+
+#include <QImage>
+#include <QPainter>
+
+FontMetrics::FontMetrics(const QFont &font) :
+ QFontMetrics(font),
+ realHeight_(height()),
+ topPadding_(0),
+ bottomPadding_(0)
+{
+ computeRealHeight(font);
+}
+
+void FontMetrics::computeRealHeight(QFont f)
+{
+ QFontMetrics fm(f);
+ QString txt="Ayfgl";
+ QImage img(fm.width(txt)+6,fm.height(),QImage::Format_ARGB32_Premultiplied);
+ img.fill(Qt::white);
+ QPainter p(&img);
+ p.setPen(Qt::black);
+ f.setBold(true);
+ p.setFont(f);
+ p.drawText(QRect(0,0,img.width(),img.height()),Qt::AlignCenter,txt);
+
+ int minRow=img.height()+100;
+ int maxRow=-1;
+ for(int i=0; i < img.height(); i++)
+ for(int j=0; j < img.width(); j++)
+ {
+ QRgb c=img.pixel(j,i);
+ if(qRed(c) != 255 || qGreen(c) != 255 || qBlue(c) != 255)
+ {
+ if(i > maxRow)
+ maxRow=i;
+ if(i < minRow)
+ minRow=i;
+ }
+ }
+
+ if(minRow >=0 && maxRow < img.height())
+ {
+ realHeight_=maxRow-minRow+1;
+ topPadding_=minRow;
+ bottomPadding_=img.height()-1-maxRow;
+ }
+}
diff --git a/Viewer/src/FileWatcher.hpp b/Viewer/src/FontMetrics.hpp
similarity index 53%
copy from Viewer/src/FileWatcher.hpp
copy to Viewer/src/FontMetrics.hpp
index 2e33bf6..801187e 100644
--- a/Viewer/src/FileWatcher.hpp
+++ b/Viewer/src/FontMetrics.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -8,30 +8,27 @@
//
//============================================================================
-#ifndef VIEWER_SRC_FILEWATCHER_HPP_
-#define VIEWER_SRC_FILEWATCHER_HPP_
+#ifndef FONTMETRICS_HPP
+#define FONTMETRICS_HPP
-#include <QFileSystemWatcher>
-#include <QFile>
-#include <QStringList>
+#include <QFontMetrics>
-class FileWatcher : public QFileSystemWatcher
+class FontMetrics : public QFontMetrics
{
-Q_OBJECT
-
public:
- FileWatcher(const std::string& filePath,qint64 offset,QObject* parent);
-
-protected Q_SLOTS:
- void slotChanged(const QString& path);
-
-Q_SIGNALS:
- void linesAppended(QStringList);
+ FontMetrics(const QFont &font);
+ int realHeight() const {return realHeight_;}
+ int topPaddingForCentre() const {return topPadding_;}
+ int bottomPaddingForCentre() const {return bottomPadding_;}
protected:
- QFile file_;
- qint64 offset_;
+ int realHeight_;
+ int topPadding_;
+ int bottomPadding_;
+
+private:
+ void computeRealHeight(QFont f);
};
-#endif /* VIEWER_SRC_FILEWATCHER_HPP_ */
+#endif // FONTMETRICS_HPP
diff --git a/Viewer/src/GotoLineDialog.cpp b/Viewer/src/GotoLineDialog.cpp
index d9b16d8..269ddfe 100644
--- a/Viewer/src/GotoLineDialog.cpp
+++ b/Viewer/src/GotoLineDialog.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/GotoLineDialog.hpp b/Viewer/src/GotoLineDialog.hpp
index cbd256c..e2b40fb 100644
--- a/Viewer/src/GotoLineDialog.hpp
+++ b/Viewer/src/GotoLineDialog.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/Highlighter.cpp b/Viewer/src/Highlighter.cpp
index 24493fe..69751cc 100644
--- a/Viewer/src/Highlighter.cpp
+++ b/Viewer/src/Highlighter.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/Highlighter.hpp b/Viewer/src/Highlighter.hpp
index fc38333..67f8fca 100644
--- a/Viewer/src/Highlighter.hpp
+++ b/Viewer/src/Highlighter.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/HistoryItemWidget.cpp b/Viewer/src/HistoryItemWidget.cpp
index 082718a..f65c6e6 100644
--- a/Viewer/src/HistoryItemWidget.cpp
+++ b/Viewer/src/HistoryItemWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/HistoryItemWidget.hpp b/Viewer/src/HistoryItemWidget.hpp
index 7ca1d9a..905e32c 100644
--- a/Viewer/src/HistoryItemWidget.hpp
+++ b/Viewer/src/HistoryItemWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/HtmlItemWidget.cpp b/Viewer/src/HtmlItemWidget.cpp
new file mode 100644
index 0000000..4e82101
--- /dev/null
+++ b/Viewer/src/HtmlItemWidget.cpp
@@ -0,0 +1,67 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "HtmlItemWidget.hpp"
+
+#include <QDebug>
+#include <QFontDatabase>
+
+HtmlItemWidget::HtmlItemWidget(QWidget *parent) :
+ QWidget(parent)
+{
+ setupUi(this);
+
+ externalTb_->hide();
+
+ fileLabel_->setProperty("fileInfo","1");
+
+ searchLine_->setEditor(textEdit_);
+ searchLine_->setVisible(false);
+
+ textEdit_->setOpenExternalLinks(false);
+ textEdit_->setOpenLinks(false);
+ textEdit_->setReadOnly(true);
+}
+
+HtmlItemWidget::~HtmlItemWidget()
+{
+}
+
+void HtmlItemWidget::removeSpacer()
+{
+ //Remove the first spacer item!!
+ for(int i=0; horizontalLayout->count(); i++)
+ {
+ if(QSpacerItem* sp=horizontalLayout->itemAt(i)->spacerItem())
+ {
+ horizontalLayout->takeAt(i);
+ delete sp;
+ break;
+ }
+ }
+}
+
+void HtmlItemWidget::on_searchTb__clicked()
+{
+ searchLine_->setVisible(true);
+ searchLine_->setFocus();
+ searchLine_->selectAll();
+}
+
+
+void HtmlItemWidget::on_fontSizeUpTb__clicked()
+{
+ textEdit_->slotZoomIn();
+}
+
+void HtmlItemWidget::on_fontSizeDownTb__clicked()
+{
+ textEdit_->slotZoomOut();
+}
diff --git a/Viewer/src/CodeItemWidget.hpp b/Viewer/src/HtmlItemWidget.hpp
similarity index 57%
copy from Viewer/src/CodeItemWidget.hpp
copy to Viewer/src/HtmlItemWidget.hpp
index 0f2b839..ff74d13 100644
--- a/Viewer/src/CodeItemWidget.hpp
+++ b/Viewer/src/HtmlItemWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -8,33 +8,31 @@
//
//============================================================================
-#ifndef CODEITEMWIDGET_HPP_
-#define CODEITEMWIDGET_HPP_
+#ifndef HTMLITEMWIDGET_HPP
+#define HTMLITEMWIDGET_HPP
#include <QWidget>
-#include "ui_CodeItemWidget.h"
+#include "ui_HtmlItemWidget.h"
-class CodeItemWidget : public QWidget, protected Ui::CodeItemWidget
+class HtmlItemWidget : public QWidget, protected Ui::HtmlItemWidget
{
Q_OBJECT
public:
- explicit CodeItemWidget(QWidget *parent=0);
- ~CodeItemWidget();
+ explicit HtmlItemWidget(QWidget *parent=0);
+ ~HtmlItemWidget();
protected Q_SLOTS:
- void on_searchTb__clicked();
- void on_gotoLineTb__clicked();
- void on_fontSizeUpTb__clicked();
- void on_fontSizeDownTb__clicked();
+ void on_searchTb__clicked();
+ void on_fontSizeUpTb__clicked();
+ void on_fontSizeDownTb__clicked();
Q_SIGNALS:
- void editorFontSizeChanged();
+ void editorFontSizeChanged();
protected:
- void removeSpacer();
+ void removeSpacer();
};
-#endif
-
+#endif // HTMLITEMWIDGET_HPP
diff --git a/Viewer/src/CodeItemWidget.ui b/Viewer/src/HtmlItemWidget.ui
similarity index 75%
copy from Viewer/src/CodeItemWidget.ui
copy to Viewer/src/HtmlItemWidget.ui
index 3cfdc32..fa22a07 100644
--- a/Viewer/src/CodeItemWidget.ui
+++ b/Viewer/src/HtmlItemWidget.ui
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
- <class>CodeItemWidget</class>
- <widget class="QWidget" name="CodeItemWidget">
+ <class>HtmlItemWidget</class>
+ <widget class="QWidget" name="HtmlItemWidget">
<property name="geometry">
<rect>
<x>0</x>
@@ -17,11 +17,20 @@
<property name="spacing">
<number>1</number>
</property>
- <property name="margin">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
<number>0</number>
</property>
<item>
- <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,0,0,0,0,0,0">
+ <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,0,0,0,0,0">
<property name="spacing">
<number>1</number>
</property>
@@ -127,74 +136,41 @@
</property>
</widget>
</item>
- <item>
- <widget class="QToolButton" name="gotoLineTb_">
- <property name="toolTip">
- <string>Goto line number (CTRL-L)</string>
- </property>
- <property name="text">
- <string>...</string>
- </property>
- <property name="icon">
- <iconset resource="viewer.qrc">
- <normaloff>:/viewer/images/goto_line.svg</normaloff>:/viewer/images/goto_line.svg</iconset>
- </property>
- <property name="shortcut">
- <string>Ctrl+L</string>
- </property>
- <property name="autoRaise">
- <bool>true</bool>
- </property>
- </widget>
- </item>
</layout>
</item>
<item>
<widget class="MessageLabel" name="messageLabel_" native="true"/>
</item>
<item>
- <widget class="PlainTextEdit" name="textEdit_">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>1</verstretch>
- </sizepolicy>
- </property>
- <property name="lineWrapMode">
- <enum>QPlainTextEdit::NoWrap</enum>
- </property>
- <property name="readOnly">
- <bool>true</bool>
- </property>
- </widget>
+ <widget class="RichTextEdit" name="textEdit_"/>
</item>
<item>
- <widget class="PlainTextSearchLine" name="searchLine_" native="true"/>
+ <widget class="RichTextSearchLine" name="searchLine_" native="true"/>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
- <class>PlainTextSearchLine</class>
+ <class>MessageLabel</class>
<extends>QWidget</extends>
- <header>PlainTextSearchLine.hpp</header>
+ <header>MessageLabel.hpp</header>
<container>1</container>
</customwidget>
<customwidget>
- <class>PlainTextEdit</class>
- <extends>QPlainTextEdit</extends>
- <header>PlainTextEdit.hpp</header>
+ <class>FileInfoLabel</class>
+ <extends>QLabel</extends>
+ <header>FileInfoLabel.hpp</header>
</customwidget>
<customwidget>
- <class>MessageLabel</class>
+ <class>RichTextSearchLine</class>
<extends>QWidget</extends>
- <header>MessageLabel.hpp</header>
+ <header location="global">RichTextSearchLine.hpp</header>
<container>1</container>
</customwidget>
<customwidget>
- <class>FileInfoLabel</class>
- <extends>QLabel</extends>
- <header>FileInfoLabel.hpp</header>
+ <class>RichTextEdit</class>
+ <extends>QTextBrowser</extends>
+ <header>RichTextEdit.hpp</header>
</customwidget>
</customwidgets>
<resources>
diff --git a/Viewer/src/IconProvider.cpp b/Viewer/src/IconProvider.cpp
index fc30528..fe4f68e 100644
--- a/Viewer/src/IconProvider.cpp
+++ b/Viewer/src/IconProvider.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/IconProvider.hpp b/Viewer/src/IconProvider.hpp
index 535555a..7bb2a58 100644
--- a/Viewer/src/IconProvider.hpp
+++ b/Viewer/src/IconProvider.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/InfoPanel.cpp b/Viewer/src/InfoPanel.cpp
index 4871b1d..18fd151 100644
--- a/Viewer/src/InfoPanel.cpp
+++ b/Viewer/src/InfoPanel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -17,11 +17,15 @@
#include "DashboardDock.hpp"
#include "InfoPanelItem.hpp"
#include "InfoPanelHandler.hpp"
+#include "NodePathWidget.hpp"
#include "ServerHandler.hpp"
+#include "SessionHandler.hpp"
#include "UiLog.hpp"
#include "VSettings.hpp"
#include "WidgetNameProvider.hpp"
+//#define _UI_INFOPANEL_DEBUG
+
//==============================================
//
// InfoPanelItemHandler
@@ -57,6 +61,8 @@ InfoPanel::InfoPanel(QWidget* parent) :
{
setupUi(this);
+ bcWidget_=new NodePathWidget(this);
+
connect(tab_,SIGNAL(currentChanged(int)),
this,SLOT(slotCurrentWidgetChanged(int)));
@@ -68,7 +74,7 @@ InfoPanel::InfoPanel(QWidget* parent) :
messageLabel_->hide();
//Initialise action state
- actionBreadcrumbs_->setChecked(bcWidget_->active());
+ actionBreadcrumbs_->setChecked(bcWidget_->isGuiMode());
actionFrozen_->setChecked(false);
WidgetNameProvider::nameChildren(this);
@@ -76,7 +82,7 @@ InfoPanel::InfoPanel(QWidget* parent) :
InfoPanel::~InfoPanel()
{
- clear();
+ localClear();
Q_FOREACH(InfoPanelItemHandler *d,items_)
delete d;
@@ -102,26 +108,42 @@ void InfoPanel::populateDockTitleBar(DashboardDockTitleWidget* tw)
//Sets the menu on the toolbutton
tw->optionsTb()->setMenu(menu);
- //This will set the title
- updateTitle();
+ //Add the bc to the titlebar. This will reparent the bcWidget!!! So we must not
+ //access it in the destructor!!!
+ tw->setBcWidget(bcWidget_);
}
//When the infopanel is in a dialog we need to add the optionsTb to the dialog.
void InfoPanel::populateDialog()
{
+ setInDialog(true);
+
+ //Add the bcWidget_ to the top of the dialogue
+ bcWidget_->useTransparentBg(false);
+ verticalLayout_->insertWidget(0,bcWidget_);
+
QMenu *menu=buildOptionsMenu();
- detachedAction_->setIcon(QIcon());
- menu->addAction(detachedAction_);
+ QWidget *cornerW=new QWidget(this);
+ QHBoxLayout *hb=new QHBoxLayout(cornerW);
+ hb->setContentsMargins(0,0,0,0);
+ hb->setSpacing(1);
+
+ QToolButton *detachedTb=new QToolButton(this);
+ detachedTb->setAutoRaise(true);
+ detachedTb->setDefaultAction(detachedAction_);
+ hb->addWidget(detachedTb);
+ setDetached(true); //by default a dialog is detached!
QToolButton* optionsTb=new QToolButton(this);
optionsTb->setAutoRaise(true);
- optionsTb->setIcon(QPixmap(":/viewer/configure.svg"));
+ optionsTb->setIcon(QPixmap(":/viewer/cogwheel.svg"));
optionsTb->setPopupMode(QToolButton::InstantPopup);
optionsTb->setToolTip(tr("Options"));
optionsTb->setMenu(menu);
+ hb->addWidget(optionsTb);
- tab_->setCornerWidget(optionsTb);
+ tab_->setCornerWidget(cornerW);
//This will set the dialog title
updateTitle();
@@ -144,6 +166,15 @@ void InfoPanel::setCurrent(const std::string& name)
void InfoPanel::clear()
{
+ localClear();
+
+ //Clear the breadcrumbs
+ bcWidget_->clear();
+}
+
+//This is safe to call from the destructor
+void InfoPanel::localClear()
+{
messageLabel_->hide();
messageLabel_->clear();
@@ -172,9 +203,6 @@ void InfoPanel::clear()
}
//Clear the tabs
clearTab();
-
- //Clear the breadcrumbs
- bcWidget_->clear();
}
//TODO: It should be the slot
@@ -233,7 +261,6 @@ void InfoPanel::slotReload(VInfo_ptr info)
}
}
-
void InfoPanel::slotReloadFromBc(VInfo_ptr info)
{
reset(info);
@@ -306,10 +333,12 @@ void InfoPanel::adjustTabs(VInfo_ptr info)
std::vector<InfoPanelDef*> ids;
InfoPanelHandler::instance()->visible(info,ids);
+#ifdef _UI_INFOPANEL_DEBUG
for(int i=0; i < ids.size(); i++)
{
UiLog().dbg() << "InfoPanel --> tab: " << ids[i]->name();
}
+#endif
int match=0;
for(int i=0; i < tab_->count(); i++)
@@ -497,15 +526,21 @@ void InfoPanel::detachedChanged()
void InfoPanel::on_actionBreadcrumbs__toggled(bool b)
{
- if(b)
- {
- bcWidget_->active(true);
- bcWidget_->setPath(info_);
- }
- else
- {
- bcWidget_->active(false);
- }
+ if(isInDialog())
+ {
+ bcWidget_->setVisible(b);
+ }
+ else
+ {
+ if(b)
+ {
+ bcWidget_->setMode(NodePathWidget::GuiMode);
+ }
+ else
+ {
+ bcWidget_->setMode(NodePathWidget::TextMode);
+ }
+ }
}
void InfoPanel::on_actionFrozen__toggled(bool b)
@@ -524,27 +559,19 @@ bool InfoPanel::frozen() const
void InfoPanel::updateTitle()
{
- QString baseTxt="<b>Info panel</b>";
-
- QString txt;
- if(frozen())
- txt+="frozen";
+ if(isInDialog())
+ {
+ QString txt;
+ if(frozen())
+ txt+="(frozen) ";
- if(!txt.isEmpty())
- {
- txt=baseTxt + " (" + txt + ")";
- }
- else
- {
- txt=baseTxt;
- }
+ if(info_)
+ {
+ txt+=QString::fromStdString(info_->path());
+ }
- if(info_ && info_.get())
- {
- txt+=" - " + QString::fromStdString(info_->path());
+ Q_EMIT titleUpdated(txt);
}
-
- Q_EMIT titleUpdated(txt);
}
void InfoPanel::notifyDataLost(VInfo* info)
@@ -731,7 +758,7 @@ void InfoPanel::readSettings(VSettings* vs)
//Synchronise the action and the breadcrumbs state
//This will not emit the trigered signal of the action!!
- actionBreadcrumbs_->setChecked(bcWidget_->active());
+ actionBreadcrumbs_->setChecked(bcWidget_->isGuiMode());
actionFrozen_->setChecked(vs->getAsBool("frozen",frozen()));
@@ -744,3 +771,28 @@ void InfoPanel::readSettings(VSettings* vs)
}
}
+void InfoPanel::writeSettingsForDialog()
+{
+ SessionItem* cs=SessionHandler::instance()->current();
+ assert(cs);
+ VSettings vs(cs->infoPanelDialogFile());
+
+ vs.putAsBool("breadcrumbs",bcWidget_->isVisible());
+ vs.putAsBool("frozen",frozen());
+ vs.putAsBool("detached",detached());
+ vs.write();
+}
+
+void InfoPanel::readSettingsForDialog()
+{
+ SessionItem* cs=SessionHandler::instance()->current();
+ assert(cs);
+ VSettings vs(cs->infoPanelDialogFile());
+ vs.read(false);
+
+ actionBreadcrumbs_->setChecked(vs.getAsBool("breadcrumbs",true));
+ bcWidget_->setVisible(actionBreadcrumbs_->isChecked());
+
+ actionFrozen_->setChecked(vs.getAsBool("frozen",frozen()));
+ detachedAction_->setChecked(vs.getAsBool("detached",detached()));
+}
diff --git a/Viewer/src/InfoPanel.hpp b/Viewer/src/InfoPanel.hpp
index 401af82..f536e2b 100644
--- a/Viewer/src/InfoPanel.hpp
+++ b/Viewer/src/InfoPanel.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -56,7 +56,7 @@ public:
explicit InfoPanel(QWidget* parent=0);
virtual ~InfoPanel();
bool frozen() const;
- void clear();
+ void clear();
void setCurrent(const std::string& name);
void linkSelected(VInfo_ptr);
@@ -68,6 +68,8 @@ public:
void rerender();
void writeSettings(VSettings*);
void readSettings(VSettings*);
+ void writeSettingsForDialog();
+ void readSettingsForDialog();
//From VInfoObserver
void notifyDelete(VInfo*) {}
@@ -101,7 +103,8 @@ protected:
void detachedChanged();
private:
- void reset(VInfo_ptr node);
+ void localClear();
+ void reset(VInfo_ptr node);
void adjustInfo(VInfo_ptr node);
void adjustTabs(VInfo_ptr node);
InfoPanelItemHandler* findHandler(QWidget* w);
diff --git a/Viewer/src/InfoPanel.ui b/Viewer/src/InfoPanel.ui
index 111a593..34640f9 100644
--- a/Viewer/src/InfoPanel.ui
+++ b/Viewer/src/InfoPanel.ui
@@ -13,7 +13,7 @@
<property name="windowTitle">
<string>Form</string>
</property>
- <layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,1">
+ <layout class="QVBoxLayout" name="verticalLayout_" stretch="0,1">
<property name="spacing">
<number>1</number>
</property>
@@ -30,9 +30,6 @@
<number>0</number>
</property>
<item>
- <widget class="NodePathWidget" name="bcWidget_" native="true"/>
- </item>
- <item>
<widget class="MessageLabel" name="messageLabel_" native="true"/>
</item>
<item>
@@ -70,15 +67,9 @@
</widget>
<customwidgets>
<customwidget>
- <class>NodePathWidget</class>
- <extends>QWidget</extends>
- <header>NodePathWidget.hpp</header>
- <container>1</container>
- </customwidget>
- <customwidget>
<class>MessageLabel</class>
<extends>QWidget</extends>
- <header location="global">MessageLabel.hpp</header>
+ <header>MessageLabel.hpp</header>
<container>1</container>
</customwidget>
</customwidgets>
diff --git a/Viewer/src/InfoPanelHandler.cpp b/Viewer/src/InfoPanelHandler.cpp
index 22f15dc..df8ebb3 100644
--- a/Viewer/src/InfoPanelHandler.cpp
+++ b/Viewer/src/InfoPanelHandler.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -22,17 +22,15 @@ InfoPanelHandler* InfoPanelHandler::instance_=0;
InfoPanelDef::InfoPanelDef(const std::string& name) :
- name_(name),
+ name_(name),
+ hidden_(false),
visibleCondition_(0),
- enabledCondition_(0),
- hidden_(false)
+ enabledCondition_(0)
{
-
}
InfoPanelHandler::InfoPanelHandler()
{
-
}
InfoPanelHandler* InfoPanelHandler::instance()
@@ -87,6 +85,7 @@ void InfoPanelHandler::init(const std::string &configFile)
def->setDockIcon(panelPt.get("dock_icon",""));
def->setShow(panelPt.get("show",""));
def->setTooltip(panelPt.get("tooltip",""));
+ def->setButtonTooltip(panelPt.get("button_tooltip",""));
std::string enabled = panelPt.get("enabled_for", "");
std::string visible = panelPt.get("visible_for", "");
diff --git a/Viewer/src/InfoPanelHandler.hpp b/Viewer/src/InfoPanelHandler.hpp
index f037d9d..74f1c60 100644
--- a/Viewer/src/InfoPanelHandler.hpp
+++ b/Viewer/src/InfoPanelHandler.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -27,7 +27,8 @@ public:
std::string icon() const {return icon_;}
std::string dockIcon() const {return dockIcon_;}
std::string show() const {return show_;}
- std::string tooltip() const {return tooltip_;}
+ std::string tooltip() const {return tooltip_;}
+ std::string buttonTooltip() const {return buttonTooltip_;}
bool hidden() const {return hidden_;}
BaseNodeCondition* visibleCondition() const {return visibleCondition_;}
@@ -35,7 +36,8 @@ public:
void setIcon(const std::string& s) {icon_=s;}
void setDockIcon(const std::string& s) {dockIcon_=s;}
void setShow(const std::string& s) {show_=s;}
- void setTooltip(const std::string& tooltip) {tooltip_=tooltip;}
+ void setTooltip(const std::string& tooltip) {tooltip_=tooltip;}
+ void setButtonTooltip(const std::string& tooltip) {buttonTooltip_=tooltip;}
void setVisibleCondition(BaseNodeCondition *visibleCond) {visibleCondition_=visibleCond;}
void setEnabledCondition(BaseNodeCondition *enabledCond) {enabledCondition_=enabledCond;}
void setHidden(bool b) {hidden_=b;}
@@ -46,7 +48,8 @@ protected:
std::string icon_;
std::string dockIcon_;
std::string show_;
- std::string tooltip_;
+ std::string tooltip_;
+ std::string buttonTooltip_;
bool hidden_;
BaseNodeCondition *visibleCondition_;
diff --git a/Viewer/src/InfoPanelItem.cpp b/Viewer/src/InfoPanelItem.cpp
index 3cd91f1..903cee5 100644
--- a/Viewer/src/InfoPanelItem.cpp
+++ b/Viewer/src/InfoPanelItem.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -251,8 +251,11 @@ void InfoPanelItem::linkSelected(const std::string& path)
{
VInfo_ptr info=VInfo::createFromPath(info_->server(),path);
- assert(owner_);
- owner_->linkSelected(info);
+ if(info)
+ {
+ assert(owner_);
+ owner_->linkSelected(info);
+ }
}
}
diff --git a/Viewer/src/InfoPanelItem.hpp b/Viewer/src/InfoPanelItem.hpp
index dbc9955..4b4b306 100644
--- a/Viewer/src/InfoPanelItem.hpp
+++ b/Viewer/src/InfoPanelItem.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/InfoPresenter.hpp b/Viewer/src/InfoPresenter.hpp
index 0a5c268..2e0ec6f 100644
--- a/Viewer/src/InfoPresenter.hpp
+++ b/Viewer/src/InfoPresenter.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/InfoProvider.cpp b/Viewer/src/InfoProvider.cpp
index f6182a0..190a62a 100644
--- a/Viewer/src/InfoProvider.cpp
+++ b/Viewer/src/InfoProvider.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -282,6 +282,10 @@ ZombieProvider::ZombieProvider(InfoPresenter* owner) :
}
+WhyProvider::WhyProvider(InfoPresenter* owner) :
+ InfoProvider(owner,VTask::WhyTask)
+{
+}
diff --git a/Viewer/src/InfoProvider.hpp b/Viewer/src/InfoProvider.hpp
index c79bc30..bef591a 100644
--- a/Viewer/src/InfoProvider.hpp
+++ b/Viewer/src/InfoProvider.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -103,4 +103,10 @@ public:
explicit ZombieProvider(InfoPresenter* owner);
};
+class WhyProvider : public InfoProvider
+{
+public:
+ explicit WhyProvider(InfoPresenter* owner);
+};
+
#endif
diff --git a/Viewer/src/InputEventLog.cpp b/Viewer/src/InputEventLog.cpp
index ab8a510..d19611d 100644
--- a/Viewer/src/InputEventLog.cpp
+++ b/Viewer/src/InputEventLog.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/InputEventLog.hpp b/Viewer/src/InputEventLog.hpp
index a299a1a..5b4dc1a 100644
--- a/Viewer/src/InputEventLog.hpp
+++ b/Viewer/src/InputEventLog.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/JobItemWidget.cpp b/Viewer/src/JobItemWidget.cpp
index 4795ac9..b682d90 100644
--- a/Viewer/src/JobItemWidget.cpp
+++ b/Viewer/src/JobItemWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -53,6 +53,7 @@ void JobItemWidget::reload(VInfo_ptr info)
//Info must be a node
if(info_ && info_->isNode() && info_->node())
{
+ reloadTb_->setEnabled(false);
infoProvider_->info(info_);
}
}
@@ -62,6 +63,7 @@ void JobItemWidget::clearContents()
InfoPanelItem::clear();
textEdit_->clear();
messageLabel_->hide();
+ reloadTb_->setEnabled(true);
}
void JobItemWidget::infoReady(VReply* reply)
@@ -79,6 +81,7 @@ void JobItemWidget::infoReady(VReply* reply)
}
fileLabel_->update(reply);
+ reloadTb_->setEnabled(true);
}
void JobItemWidget::infoProgress(VReply* reply)
@@ -91,6 +94,36 @@ void JobItemWidget::infoFailed(VReply* reply)
{
QString s=QString::fromStdString(reply->errorText());
messageLabel_->showError(s);
+ reloadTb_->setEnabled(true);
+}
+
+void JobItemWidget::reloadRequested()
+{
+ reload(info_);
+}
+
+void JobItemWidget::updateState(const FlagSet<ChangeFlag>& flags)
+{
+ if(flags.isSet(SuspendedChanged))
+ {
+ //Suspend
+ if(suspended_)
+ {
+ reloadTb_->setEnabled(false);
+ }
+ //Resume
+ else
+ {
+ if(info_ && info_->node())
+ {
+ reloadTb_->setEnabled(true);
+ }
+ else
+ {
+ clearContents();
+ }
+ }
+ }
}
static InfoPanelItemMaker<JobItemWidget> maker1("job");
diff --git a/Viewer/src/JobItemWidget.hpp b/Viewer/src/JobItemWidget.hpp
index 75780fb..5a55aca 100644
--- a/Viewer/src/JobItemWidget.hpp
+++ b/Viewer/src/JobItemWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -36,7 +36,8 @@ public:
void defsChanged(const std::vector<ecf::Aspect::Type>&) {}
protected:
- void updateState(const ChangeFlags&) {}
+ void updateState(const ChangeFlags&);
+ void reloadRequested();
};
#endif
diff --git a/Viewer/src/LabelEditor.cpp b/Viewer/src/LabelEditor.cpp
index 1d797c6..24770ed 100644
--- a/Viewer/src/LabelEditor.cpp
+++ b/Viewer/src/LabelEditor.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/LabelEditor.hpp b/Viewer/src/LabelEditor.hpp
index 8bcbe65..a7c1901 100644
--- a/Viewer/src/LabelEditor.hpp
+++ b/Viewer/src/LabelEditor.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/LimitEditor.cpp b/Viewer/src/LimitEditor.cpp
index 2bc2d89..fd15e12 100644
--- a/Viewer/src/LimitEditor.cpp
+++ b/Viewer/src/LimitEditor.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -10,20 +10,30 @@
#include "LimitEditor.hpp"
+#include <QItemSelectionModel>
#include <QSettings>
+#include <QStringListModel>
+
+#include "Aspect.hpp"
#include "AttributeEditorFactory.hpp"
#include "VAttribute.hpp"
#include "VAttributeType.hpp"
+#include "VLimitAttr.hpp"
#include "ServerHandler.hpp"
#include "SessionHandler.hpp"
LimitEditorWidget::LimitEditorWidget(QWidget* parent) : QWidget(parent)
{
setupUi(this);
+ removeTb_->setDefaultAction(actionRemove_);
+ removeAllTb_->setDefaultAction(actionRemoveAll_);
+ pathView_->addAction(actionRemove_);
+ pathView_->setSelectionMode(QAbstractItemView::ExtendedSelection);
+ pathView_->setContextMenuPolicy(Qt::ActionsContextMenu);
}
-LimitEditor::LimitEditor(VInfo_ptr info,QWidget* parent) : AttributeEditor(info,"limit",parent)
+LimitEditor::LimitEditor(VInfo_ptr info,QWidget* parent) : AttributeEditor(info,"limit",parent), model_(0)
{
w_=new LimitEditorWidget(this);
addForm(w_);
@@ -33,44 +43,80 @@ LimitEditor::LimitEditor(VInfo_ptr info,QWidget* parent) : AttributeEditor(info,
Q_ASSERT(a);
Q_ASSERT(a->type());
Q_ASSERT(a->type()->name() == "limit");
+ QStringList aData=a->data();
- if(a->data().count() < 4)
+ if(aData.count() < 4)
return;
- QString name=a->data().at(1);
- oriVal_=a->data().at(2).toInt();
- oriMax_=a->data().at(3).toInt();
+ QString name=aData[1];
+ oriVal_=aData[2].toInt();
+ oriMax_=aData[3].toInt();
w_->nameLabel_->setText(name);
- w_->valueSpin_->setValue(oriVal_);
+ w_->valueLabel_->setText(QString::number(oriVal_));
w_->maxSpin_->setValue(oriMax_);
- w_->valueSpin_->setRange(0,10000);
- w_->maxSpin_->setRange(1,10000);
-
- w_->valueSpin_->setFocus();
+ w_->maxSpin_->setRange(0,10000);
+ w_->maxSpin_->setFocus();
- if(a->data().at(2).isEmpty() || a->data().at(3).isEmpty())
+ if(aData[2].isEmpty() || aData[3].isEmpty())
{
return;
}
- connect(w_->valueSpin_,SIGNAL(valueChanged(int)),
- this,SLOT(slotValueChanged(int)));
+ buildList(a);
connect(w_->maxSpin_,SIGNAL(valueChanged(int)),
this,SLOT(slotMaxChanged(int)));
+ connect(w_->actionRemove_,SIGNAL(triggered()),
+ this,SLOT(slotRemove()));
+
+ connect(w_->actionRemoveAll_,SIGNAL(triggered()),
+ this,SLOT(slotRemoveAll()));
+
header_->setInfo(QString::fromStdString(info_->path()),"Limit");
checkButtonStatus();
readSettings();
+
+ //No reset button is allowed because we can perform irreversible changes!
+ doNotUseReset();
+}
+
+LimitEditor::~LimitEditor()
+{
+ writeSettings();
+}
+
+void LimitEditor::buildList(VAttribute *a)
+{
+ VLimitAttr* lim=static_cast<VLimitAttr*>(a);
+ Q_ASSERT(lim);
+
+ modelData_.clear();
+ modelData_=lim->paths();
+
+ if(modelData_.count() > 0)
+ {
+ model_=new QStringListModel(this);
+ model_->setStringList(modelData_);
+
+ w_->pathView_->setModel(model_);
+ w_->pathView_->setCurrentIndex(model_->index(0,0));
+ w_->pathView_->setFocus(Qt::MouseFocusReason);
+ }
+ else
+ {
+ w_->actionRemove_->setEnabled(false);
+ w_->actionRemoveAll_->setEnabled(false);
+ }
}
void LimitEditor::apply()
{
- int intVal=w_->valueSpin_->value();
+ int intVal=w_->valueLabel_->text().toInt();
int intMax=w_->maxSpin_->value();
std::string val=QString::number(intVal).toStdString();
std::string max=QString::number(intMax).toStdString();
@@ -108,24 +154,85 @@ void LimitEditor::apply()
void LimitEditor::resetValue()
{
- w_->valueSpin_->setValue(oriVal_);
- w_->maxSpin_->setValue(oriMax_);
- checkButtonStatus();
}
-void LimitEditor::slotValueChanged(int)
+void LimitEditor::slotMaxChanged(int)
{
checkButtonStatus();
}
-void LimitEditor::slotMaxChanged(int)
+bool LimitEditor::isValueChanged()
{
- checkButtonStatus();
+ return (oriVal_ != w_->valueLabel_->text().toInt() || oriMax_ != w_->maxSpin_->value());
}
-bool LimitEditor::isValueChanged()
+void LimitEditor::slotRemove()
+{
+ remove(false);
+}
+
+void LimitEditor::slotRemoveAll()
{
- return (oriVal_ != w_->valueSpin_->value() || oriMax_ != w_->maxSpin_->value());
+ remove(true);
+}
+
+void LimitEditor::remove(bool all)
+{
+ if(!info_)
+ return;
+
+ //We cannot cancle the setting after remove is callled
+ disableCancel();
+
+ Q_ASSERT(model_);
+
+ VAttribute* a=info_->attribute();
+ Q_ASSERT(a);
+ VLimitAttr* lim=static_cast<VLimitAttr*>(a);
+ Q_ASSERT(lim);
+
+ if(all)
+ {
+ std::vector<std::string> valCmd;
+ VAttribute::buildAlterCommand(valCmd,"change","limit_value",a->strName(),"0");
+ ServerHandler::command(info_,valCmd);
+ }
+ else
+ {
+ std::vector<std::string> paths;
+ Q_FOREACH(QModelIndex idx,w_->pathView_->selectionModel()->selectedRows())
+ {
+ std::vector<std::string> valCmd;
+ VAttribute::buildAlterCommand(valCmd,"delete","limit_path",a->strName(),
+ model_->data(idx,Qt::DisplayRole).toString().toStdString());
+ ServerHandler::command(info_,valCmd);
+ }
+ }
+
+ //Updating the gui with the new state will happen later
+ //because command() is asynchronous
+}
+
+void LimitEditor::nodeChanged(const std::vector<ecf::Aspect::Type>& aspect)
+{
+ bool limitCh=(std::find(aspect.begin(),aspect.end(),ecf::Aspect::LIMIT) != aspect.end());
+ if(limitCh && info_)
+ {
+ VAttribute* a=info_->attribute();
+ Q_ASSERT(a);
+ VLimitAttr* lim=static_cast<VLimitAttr*>(a);
+ Q_ASSERT(lim);
+
+ QStringList aData=a->data();
+ if(aData.count() < 4)
+ return;
+
+ oriVal_=aData[2].toInt();
+ w_->valueLabel_->setText(QString::number(oriVal_));
+ modelData_.clear();
+ modelData_=lim->paths();
+ model_->setStringList(modelData_);
+ }
}
void LimitEditor::writeSettings()
@@ -157,7 +264,7 @@ void LimitEditor::readSettings()
}
else
{
- resize(QSize(310,200));
+ resize(QSize(420,400));
}
settings.endGroup();
diff --git a/Viewer/src/LimitEditor.hpp b/Viewer/src/LimitEditor.hpp
index 836c9d3..37a06af 100644
--- a/Viewer/src/LimitEditor.hpp
+++ b/Viewer/src/LimitEditor.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -16,7 +16,10 @@
#include "AttributeEditor.hpp"
#include "VInfo.hpp"
+#include <QStringList>
+
class LimitEditor;
+class QStringListModel;
class LimitEditorWidget : public QWidget, protected Ui::LimitEditorWidget
{
@@ -30,21 +33,28 @@ class LimitEditor : public AttributeEditor
Q_OBJECT
public:
LimitEditor(VInfo_ptr,QWidget* parent=0);
+ ~LimitEditor();
protected Q_SLOTS:
- void slotValueChanged(int);
void slotMaxChanged(int);
+ void slotRemove();
+ void slotRemoveAll();
protected:
void resetValue();
void apply();
bool isValueChanged();
+ void buildList(VAttribute *a);
+ void remove(bool all);
+ void nodeChanged(const std::vector<ecf::Aspect::Type>& a);
void readSettings();
void writeSettings();
LimitEditorWidget* w_;
int oriVal_;
int oriMax_;
+ QStringListModel* model_;
+ QStringList modelData_;
};
#endif // LIMITEDITOR_HPP
diff --git a/Viewer/src/LimitEditorWidget.ui b/Viewer/src/LimitEditorWidget.ui
index aa54449..1654d05 100644
--- a/Viewer/src/LimitEditorWidget.ui
+++ b/Viewer/src/LimitEditorWidget.ui
@@ -13,7 +13,10 @@
<property name="windowTitle">
<string>Form</string>
</property>
- <layout class="QFormLayout" name="formLayout_2">
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>1</number>
+ </property>
<property name="leftMargin">
<number>0</number>
</property>
@@ -26,41 +29,132 @@
<property name="bottomMargin">
<number>0</number>
</property>
- <item row="0" column="0">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Name:</string>
- </property>
- </widget>
+ <item>
+ <layout class="QFormLayout" name="formLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Name:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="nameLabel_">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Value:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Maximum:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QSpinBox" name="maxSpin_"/>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="valueLabel_">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
- <item row="0" column="1">
- <widget class="QLabel" name="nameLabel_">
- <property name="text">
- <string>TextLabel</string>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
</property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Value:</string>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
</property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Maximum:</string>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>5</height>
+ </size>
</property>
- </widget>
+ </spacer>
</item>
- <item row="1" column="1">
- <widget class="QSpinBox" name="valueSpin_"/>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Nodes consuming the limit:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QToolButton" name="removeTb_">
+ <property name="toolTip">
+ <string>Remove</string>
+ </property>
+ <property name="text">
+ <string>Remove</string>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="removeAllTb_">
+ <property name="text">
+ <string>Reset</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
- <item row="2" column="1">
- <widget class="QSpinBox" name="maxSpin_"/>
+ <item>
+ <widget class="QListView" name="pathView_">
+ <property name="selectionMode">
+ <enum>QAbstractItemView::ExtendedSelection</enum>
+ </property>
+ </widget>
</item>
</layout>
+ <action name="actionRemove_">
+ <property name="text">
+ <string>Remove</string>
+ </property>
+ <property name="toolTip">
+ <string>Remove selected node paths</string>
+ </property>
+ </action>
+ <action name="actionRemoveAll_">
+ <property name="text">
+ <string>Reset</string>
+ </property>
+ <property name="toolTip">
+ <string>Remove all node paths and reset the limit value to <b>zero</b></string>
+ </property>
+ </action>
</widget>
<resources/>
<connections/>
diff --git a/Viewer/src/LineEdit.cpp b/Viewer/src/LineEdit.cpp
index 7b8c24d..106bf4a 100644
--- a/Viewer/src/LineEdit.cpp
+++ b/Viewer/src/LineEdit.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/LineEdit.hpp b/Viewer/src/LineEdit.hpp
index 9ea6504..5bcd128 100644
--- a/Viewer/src/LineEdit.hpp
+++ b/Viewer/src/LineEdit.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/LogModel.cpp b/Viewer/src/LogModel.cpp
index fae2ed9..a2baba2 100644
--- a/Viewer/src/LogModel.cpp
+++ b/Viewer/src/LogModel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -79,7 +79,7 @@ void LogModel::setData(const std::vector<std::string>& data)
data_.clear();
- for(std::vector<std::string>::const_iterator it=data.begin(); it != data.end(); it++)
+ for(std::vector<std::string>::const_iterator it=data.begin(); it != data.end(); ++it)
{
QString s=QString::fromStdString(*it);
if(!s.simplified().isEmpty())
@@ -94,7 +94,7 @@ void LogModel::appendData(const std::vector<std::string>& data)
{
int num=0;
- for(std::vector<std::string>::const_iterator it=data.begin(); it != data.end(); it++)
+ for(std::vector<std::string>::const_iterator it=data.begin(); it != data.end(); ++it)
{
QString s=QString::fromStdString(*it);
if(!s.simplified().isEmpty())
@@ -107,7 +107,7 @@ void LogModel::appendData(const std::vector<std::string>& data)
{
beginInsertRows(QModelIndex(),rowCount(),rowCount()+num-1);
- for(std::vector<std::string>::const_iterator it=data.begin(); it != data.end(); it++)
+ for(std::vector<std::string>::const_iterator it=data.begin(); it != data.end(); ++it)
{
QString s=QString::fromStdString(*it);
if(!s.simplified().isEmpty())
@@ -328,7 +328,7 @@ void LogDelegate::paint(QPainter *painter,const QStyleOptionViewItem &option,
/*if(index.column()==11)
{
- QStyleOptionViewItemV4 vopt(option);
+ QStyleOptionViewItem vopt(option);
initStyleOption(&vopt, index);
const QStyle *style = vopt.widget ? vopt.widget->style() : QApplication::style();
diff --git a/Viewer/src/LogModel.hpp b/Viewer/src/LogModel.hpp
index 19d4776..5038b81 100644
--- a/Viewer/src/LogModel.hpp
+++ b/Viewer/src/LogModel.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/LogProvider.cpp b/Viewer/src/LogProvider.cpp
index 8793b52..37bfe4c 100644
--- a/Viewer/src/LogProvider.cpp
+++ b/Viewer/src/LogProvider.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -11,7 +11,6 @@
#include "LogProvider.hpp"
#include "FileWatcher.hpp"
-#include "LogServer.hpp"
#include "VNode.hpp"
#include "VReply.hpp"
#include "ServerHandler.hpp"
@@ -123,7 +122,6 @@ void LogProvider::fetchFile(ServerHandler *server,const std::string& fileName)
//Try to track the changes in the log file
watchFile(fileName,size);
-
return;
}
}
@@ -137,10 +135,11 @@ void LogProvider::fetchFile(ServerHandler *server,const std::string& fileName)
//Run the task in the server. When it finish taskFinished() is called. The text returned
//in the reply will be prepended to the string we generated above.
server->run(task_);
- return;
+#if 0
//If we are we could not get the file
- owner_->infoFailed(reply_);
+ //owner_->infoFailed(reply_);
+#endif
}
void LogProvider::watchFile(const std::string& fileName,size_t offset)
@@ -210,7 +209,7 @@ std::string LogProvider::readLastLines(const std::string& filename,int last_n_li
size = static_cast<size_t>( source.tellg() );
std::vector<char> buffer;
int newlineCount = 0;
- while ( source
+ while (source
&& buffer.size() != size
&& newlineCount < last_n_lines ) {
buffer.resize( std::min( buffer.size() + granularity, size ) );
diff --git a/Viewer/src/LogProvider.hpp b/Viewer/src/LogProvider.hpp
index 9a79f5a..db9e991 100644
--- a/Viewer/src/LogProvider.hpp
+++ b/Viewer/src/LogProvider.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/LogServer.cpp b/Viewer/src/LogServer.cpp
deleted file mode 100644
index 58e5e48..0000000
--- a/Viewer/src/LogServer.cpp
+++ /dev/null
@@ -1,252 +0,0 @@
-//============================================================================
-// Copyright 2014 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not waive the privileges and immunities
-// granted to it by virtue of its status as an intergovernmental organisation
-// nor does it submit to any jurisdiction.
-//============================================================================
-
-#include "LogServer.hpp"
-
-#include <string.h>
-#include <strings.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-
-#include "setjmp.h"
-
-#ifdef AIX
-#include <memory.h>
-#endif
-
-#include <boost/filesystem/operations.hpp>
-#include <boost/filesystem/path.hpp>
-
-#define FAIL(a) do { perror(a); exit(1); } while(0)
-
-LogServer::LogServer(std::string host,std::string cport) :
- soc_(-1),
- host_(host),
- port_(cport)
-{
- struct hostent *ht = gethostbyname( host.c_str() );
-
- if (ht == NULL)
- {
- soc_ = -1;
- return;
- }
- connect(host,!cport.empty() ? atoi(cport.c_str()) : 19999);
-}
-
-static jmp_buf env;
-/* static void (*old_alarm)(int); */
-
-static void catch_alarm(int)
-{
- printf("got alarm\n");
- /* longjmp(env,1); */
-}
-
-void LogServer::connect(std::string host,int port)
-{
- //typedef unsigned long addr_type;
- typedef in_addr_t addr_type;
-
- //ddr_type none = (addr_type)-1;
- addr_type addr;
-
- struct sockaddr_in s_in;
- struct hostent *him;
-
- soc_ = socket(AF_INET, SOCK_STREAM, 0);
- if(soc_ < 0)
- {
- //gui::syserr("Cannot create socket");
- return;
- }
-
- bzero(&s_in,sizeof(s_in));
-
- s_in.sin_port = htons(port);
- s_in.sin_family = AF_INET;
- addr = inet_addr(host.c_str());
- s_in.sin_addr.s_addr = addr;
-
-#ifdef SVR4
- if(addr == (in_addr_t) 0xffffffff)
-#else
- if(addr == INADDR_NONE)
-#endif
- {
- if ((him=gethostbyname(host.c_str()))==NULL)
- {
- //gui::error("Unknown Host %s",host.c_str());
- return;
- }
- s_in.sin_family = him->h_addrtype;
- bcopy(him->h_addr_list[0],&s_in.sin_addr,him->h_length);
- }
-
- char* timeout = getenv ("ECFLOWVIEW_LOGTIMEOUT");
- int time_out = timeout ? atoi(timeout) : 3;
-
- struct sigaction sa = { { 0, }, };
- struct sigaction old;
- sa.sa_handler = catch_alarm;
- sigemptyset(&sa.sa_mask);
-
- if(sigaction(SIGALRM, &sa, &old))
- perror("sigaction");
-
- ::alarm(time_out);
- perror("alarm");
-
- if(setjmp(env) == 0)
- {
- printf("connect %s\n",host.c_str());
- if(::connect(soc_,(struct sockaddr*)&s_in,sizeof(s_in)) < 0)
- {
- perror("connect");
- close(soc_);
- soc_ = -1;
- }
- }
- else
- {
- printf("cleanup up\n");
- close(soc_);
- soc_ = -1;
- }
- ::alarm(0);
- sigaction(SIGALRM, &old, &sa);
-}
-
-LogServer::~LogServer()
-{
- close(soc_);
-}
-
-VFile_ptr LogServer::getFile(std::string name)
-{
- VFile_ptr empty;
-
- if(soc_ < 0)
- return empty;
-
- write(soc_,"get ",4);
- write(soc_,name.c_str(),name.size());
- write(soc_,"\n",1);
-
- const int size = 64*1024;
- char buf[size];
- unsigned int len = 0;
- int total = 0;
-
- VFile_ptr out(VFile::create(false));
- FILE *f = fopen(out->path().c_str(),"w");
-
- printf("outFile: %s\n",out->path().c_str());
-
-
- if(!f)
- {
- char buf_loc[2048];
- sprintf(buf_loc,"Cannot create %s",out->path().c_str());
- //gui::syserr(buf);
- return empty;
- }
-
- while( (len = read(soc_,buf,size)) > 0)
- {
- if(fwrite(buf,1,len,f) != len)
- {
- char buf_loc[2048];
- sprintf(buf_loc,"Write error on %s",out->path().c_str());
- //gui::syserr(buf);
- fclose(f);
- return empty;
- }
- total += len;
- }
-
- //fwrite(buf,1,size,f);
-
- if(fclose(f))
- {
- char buf_loc[2048];
- sprintf(buf_loc,"Write error on %s",out->path().c_str());
- //gui::syserr(buf);
- return empty;
- }
-
- if(total)
- return out;
-
- return empty;
-}
-
-VDir_ptr LogServer::getDir(const char* name)
-{
- VDir_ptr empty;
-
- if(soc_ < 0)
- return empty;
-
- write(soc_,"list ",5);
- write(soc_,name,strlen(name));
- write(soc_,"\n",1);
-
- FILE* f = fdopen(soc_,"r");
-
- char buf[2048];
-
- //We suppose name is a file name!
- //Create the resulting directory object. We might need to
- //adjust its path later.
- boost::filesystem::path fp(name);
- std::string dirName=fp.parent_path().string();
- VDir_ptr dir(new VDir(dirName));
-
- //indicates the source of the files
- dir->where(host_ + "@" + port_);
-
- while(fgets(buf,sizeof(buf),f))
- {
- int mode,uid,gid;
- unsigned int size;
- unsigned int atime,mtime,ctime;
- char name[1024];
-
- sscanf(buf,"%d %d %d %u %u %u %u %s",
- &mode,&uid,&gid,
- &size,
- &atime,&mtime,&ctime,
- name);
-
- boost::filesystem::path p(name);
- std::string fileDirName=fp.parent_path().string();
- std::string fileName=p.leaf().string();
-
- //Adjust the path in the dir
- if(fileDirName != dirName)
- {
- dir->path(fileDirName,false);
- }
-
- dir->addItem(fileName,size,mtime);
- }
-
- return dir;
-}
diff --git a/Viewer/src/LogServer.hpp b/Viewer/src/LogServer.hpp
deleted file mode 100644
index 086b2ea..0000000
--- a/Viewer/src/LogServer.hpp
+++ /dev/null
@@ -1,43 +0,0 @@
-//============================================================================
-// Copyright 2014 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not waive the privileges and immunities
-// granted to it by virtue of its status as an intergovernmental organisation
-// nor does it submit to any jurisdiction.
-//============================================================================
-
-#ifndef LOGSERVER_H
-#define LOGSERVER_H
-
-#include "VFile.hpp"
-#include "VDir.hpp"
-
-class LogServer;
-typedef boost::shared_ptr<LogServer> LogServer_ptr;
-
-class LogServer
-{
-
-public:
- LogServer(std::string host,std::string port);
- ~LogServer();
-
- const std::string host() const {return host_;}
- const std::string port() const {return port_;}
-
- VFile_ptr getFile(std::string name);
- VDir_ptr getDir(const char* name);
- bool ok() const { return soc_ >= 0; }
-
-private:
- LogServer(const LogServer&);
- LogServer& operator=(const LogServer&);
- void connect(std::string,int);
-
- int soc_;
- std::string host_;
- std::string port_;
-};
-
-#endif
diff --git a/Viewer/src/LogTruncator.cpp b/Viewer/src/LogTruncator.cpp
index b5f4dfd..af96926 100644
--- a/Viewer/src/LogTruncator.cpp
+++ b/Viewer/src/LogTruncator.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -9,6 +9,7 @@
#include "LogTruncator.hpp"
+#include <QtGlobal>
#include <QFileInfo>
#include <QTime>
#include <QTimer>
@@ -25,7 +26,11 @@ LogTruncator::LogTruncator(QString path, int timeout,int sizeLimit,int lineNum,Q
{
timer_=new QTimer(this);
connect(timer_,SIGNAL(timeout()),this,SLOT(truncate()));
+#if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
int secToM=86400-QTime::currentTime().msecsSinceStartOfDay()/1000;
+#else
+ int secToM=86400-QTime(0,0).secsTo(QTime::currentTime());
+#endif
if(secToM > 5*60)
timer_->start(secToM*1000);
else
diff --git a/Viewer/src/LogTruncator.hpp b/Viewer/src/LogTruncator.hpp
index 183caa1..51a7219 100644
--- a/Viewer/src/LogTruncator.hpp
+++ b/Viewer/src/LogTruncator.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/MainWindow.cpp b/Viewer/src/MainWindow.cpp
index d45ee8f..e787c9c 100644
--- a/Viewer/src/MainWindow.cpp
+++ b/Viewer/src/MainWindow.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -156,7 +156,7 @@ void MainWindow::init(MainWindow *win)
void MainWindow::addInfoPanelActions(QToolBar *toolbar)
{
for(std::vector<InfoPanelDef*>::const_iterator it=InfoPanelHandler::instance()->panels().begin();
- it != InfoPanelHandler::instance()->panels().end(); it++)
+ it != InfoPanelHandler::instance()->panels().end(); ++it)
{
if((*it)->show().find("toolbar") != std::string::npos)
{
@@ -165,7 +165,7 @@ void MainWindow::addInfoPanelActions(QToolBar *toolbar)
ac->setObjectName(QString::fromStdString((*it)->label()));
ac->setIcon(QIcon(pix));
ac->setData(QString::fromStdString((*it)->name()));
- ac->setToolTip(QString::fromStdString((*it)->tooltip()));
+ ac->setToolTip(QString::fromStdString((*it)->buttonTooltip()));
connect(ac,SIGNAL(triggered()),
this,SLOT(slotOpenInfoPanel()));
@@ -361,7 +361,7 @@ void MainWindow::slotSelectionChanged(VInfo_ptr info)
std::string name=ac->data().toString().toStdString();
- for(std::vector<InfoPanelDef*>::const_iterator it=ids.begin(); it != ids.end(); it++)
+ for(std::vector<InfoPanelDef*>::const_iterator it=ids.begin(); it != ids.end(); ++it)
{
if((*it)->name() == name)
{
diff --git a/Viewer/src/MainWindow.hpp b/Viewer/src/MainWindow.hpp
index bca1991..6d81f09 100644
--- a/Viewer/src/MainWindow.hpp
+++ b/Viewer/src/MainWindow.hpp
@@ -2,7 +2,7 @@
#define MAINWINDOW_HPP_
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ManualItemWidget.cpp b/Viewer/src/ManualItemWidget.cpp
index 7fac4de..6400cf4 100644
--- a/Viewer/src/ManualItemWidget.cpp
+++ b/Viewer/src/ManualItemWidget.cpp
@@ -1,6 +1,6 @@
//============================================================================
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -54,6 +54,7 @@ void ManualItemWidget::reload(VInfo_ptr info)
//Info must be a node
if(info_ && info_->isNode() && info_->node())
{
+ reloadTb_->setEnabled(false);
infoProvider_->info(info_);
}
}
@@ -63,7 +64,7 @@ void ManualItemWidget::clearContents()
InfoPanelItem::clear();
textEdit_->clear();
messageLabel_->hide();
-
+ reloadTb_->setEnabled(true);
}
void ManualItemWidget::infoReady(VReply* reply)
@@ -85,6 +86,7 @@ void ManualItemWidget::infoReady(VReply* reply)
}
fileLabel_->update(reply);
+ reloadTb_->setEnabled(true);
}
void ManualItemWidget::infoProgress(VReply* reply)
@@ -97,7 +99,38 @@ void ManualItemWidget::infoFailed(VReply* reply)
{
QString s=QString::fromStdString(reply->errorText());
messageLabel_->showError(s);
+ reloadTb_->setEnabled(true);
+}
+
+void ManualItemWidget::reloadRequested()
+{
+ reload(info_);
+}
+
+void ManualItemWidget::updateState(const FlagSet<ChangeFlag>& flags)
+{
+ if(flags.isSet(SuspendedChanged))
+ {
+ //Suspend
+ if(suspended_)
+ {
+ reloadTb_->setEnabled(false);
+ }
+ //Resume
+ else
+ {
+ if(info_ && info_->node())
+ {
+ reloadTb_->setEnabled(true);
+ }
+ else
+ {
+ clearContents();
+ }
+ }
+ }
}
+
static InfoPanelItemMaker<ManualItemWidget> maker1("manual");
diff --git a/Viewer/src/ManualItemWidget.hpp b/Viewer/src/ManualItemWidget.hpp
index 9a79379..48f6711 100644
--- a/Viewer/src/ManualItemWidget.hpp
+++ b/Viewer/src/ManualItemWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -33,7 +33,8 @@ public:
void defsChanged(const std::vector<ecf::Aspect::Type>&) {}
protected:
- void updateState(const ChangeFlags&) {}
+ void updateState(const ChangeFlags&);
+ void reloadRequested();
};
#endif
diff --git a/Viewer/src/MenuConfigDialog.cpp b/Viewer/src/MenuConfigDialog.cpp
index c8ca317..51f4988 100644
--- a/Viewer/src/MenuConfigDialog.cpp
+++ b/Viewer/src/MenuConfigDialog.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -67,7 +67,10 @@ void MenuConfigDialog::updateMenuTree(Menu *menu)
void MenuConfigDialog::addChildrenToMenuTree(Menu *menu, QTreeWidgetItem *parent)
{
- std::vector<MenuItem *>&items = menu->items();
+ if(!menu)
+ return;
+
+ std::vector<MenuItem *>&items = menu->items();
for (std::vector<MenuItem*>::iterator itItems = items.begin(); itItems != items.end(); ++itItems)
{
@@ -78,7 +81,7 @@ void MenuConfigDialog::addChildrenToMenuTree(Menu *menu, QTreeWidgetItem *parent
if ((*itItems)->isSubMenu())
{
Menu *submenu = MenuHandler::findMenu((*itItems)->name());
- if (menu)
+ if(menu)
{
addChildrenToMenuTree(submenu, item);
}
diff --git a/Viewer/src/MenuConfigDialog.hpp b/Viewer/src/MenuConfigDialog.hpp
index 80aa64c..b53dce5 100644
--- a/Viewer/src/MenuConfigDialog.hpp
+++ b/Viewer/src/MenuConfigDialog.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/MenuHandler.cpp b/Viewer/src/MenuHandler.cpp
index a0e4f63..43ea32b 100644
--- a/Viewer/src/MenuHandler.cpp
+++ b/Viewer/src/MenuHandler.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -30,7 +30,6 @@
#include "ServerHandler.hpp"
#include "UiLog.hpp"
#include "UserMessage.hpp"
-#include "NodeExpression.hpp"
#include "VConfig.hpp"
#include "VNode.hpp"
#include "CustomCommandHandler.hpp"
@@ -39,6 +38,9 @@ int MenuItem::idCnt_=0;
std::vector<Menu *> MenuHandler::menus_;
MenuHandler::ConfirmationMap MenuHandler::commandsWhichRequireConfirmation_;
+TrueNodeCondition MenuHandler::trueCond_;
+FalseNodeCondition MenuHandler::falseCond_;
+
MenuHandler::MenuHandler()
{
@@ -261,13 +263,11 @@ bool MenuHandler::readMenuConfigFile(const std::string &configFile)
void MenuHandler::refreshCustomMenuCommands()
{
- BaseNodeCondition *trueCond = new TrueNodeCondition();
- BaseNodeCondition *falseCond = new FalseNodeCondition();
CustomCommandHistoryHandler *customRecentCmds = CustomCommandHistoryHandler::instance();
CustomSavedCommandHandler *customSavedCmds = CustomSavedCommandHandler::instance();
Menu *menu = findMenu("Custom");
- if (menu)
+ if(menu)
{
menu->clearFixedList();
@@ -275,17 +275,17 @@ void MenuHandler::refreshCustomMenuCommands()
MenuItem *item1 = new MenuItem("Manage commands...");
item1->setCommand("custom");
addItemToMenu(item1, "Custom");
- item1->setEnabledCondition(trueCond);
- item1->setVisibleCondition(trueCond);
- item1->setQuestionCondition(falseCond);
+ item1->setEnabledCondition(&trueCond_);
+ item1->setVisibleCondition(&trueCond_);
+ item1->setQuestionCondition(&falseCond_);
item1->setIcon("configure.svg");
// Saved commands
MenuItem *item2 = new MenuItem("-");
addItemToMenu(item2, "Custom");
- item2->setEnabledCondition(trueCond);
- item2->setVisibleCondition(trueCond);
- item2->setQuestionCondition(falseCond);
+ item2->setEnabledCondition(&trueCond_);
+ item2->setVisibleCondition(&trueCond_);
+ item2->setQuestionCondition(&falseCond_);
int numSavedCommands = customSavedCmds->numCommands();
@@ -296,9 +296,9 @@ void MenuHandler::refreshCustomMenuCommands()
{
MenuItem *item = new MenuItem(cmd->name());
item->setCommand(cmd->command());
- item->setEnabledCondition(trueCond);
- item->setVisibleCondition(trueCond);
- item->setQuestionCondition(trueCond);
+ item->setEnabledCondition(&trueCond_);
+ item->setVisibleCondition(&trueCond_);
+ item->setQuestionCondition(&trueCond_);
item->setCustom(true);
item->setStatustip("__cmd__");
addItemToMenu(item, "Custom");
@@ -309,15 +309,15 @@ void MenuHandler::refreshCustomMenuCommands()
// Recently executed commands
MenuItem *item3 = new MenuItem("-");
addItemToMenu(item3, "Custom");
- item3->setEnabledCondition(trueCond);
- item3->setVisibleCondition(trueCond);
- item3->setQuestionCondition(falseCond);
+ item3->setEnabledCondition(&trueCond_);
+ item3->setVisibleCondition(&trueCond_);
+ item3->setQuestionCondition(&falseCond_);
MenuItem *item4 = new MenuItem("Recent");
addItemToMenu(item4, "Custom");
- item4->setEnabledCondition(falseCond);
- item4->setVisibleCondition(trueCond);
- item4->setQuestionCondition(falseCond);
+ item4->setEnabledCondition(&falseCond_);
+ item4->setVisibleCondition(&trueCond_);
+ item4->setQuestionCondition(&falseCond_);
int numRecentCommands = customRecentCmds->numCommands();
@@ -327,9 +327,9 @@ void MenuHandler::refreshCustomMenuCommands()
MenuItem *item = new MenuItem(cmd->name());
item->setCommand(cmd->command());
- item->setEnabledCondition(trueCond);
- item->setVisibleCondition(trueCond);
- item->setQuestionCondition(trueCond);
+ item->setEnabledCondition(&trueCond_);
+ item->setVisibleCondition(&trueCond_);
+ item->setQuestionCondition(&trueCond_);
item->setCustom(true);
item->setStatustip("__cmd__");
addItemToMenu(item, "Custom");
@@ -535,11 +535,6 @@ QMenu *Menu::generateMenu(std::vector<VInfo_ptr> nodes, QWidget *parent,QMenu* p
//qmenu->setWindowFlags(Qt::Tool);
//qmenu->setWindowTitle("my title");
- // add an inactive action(!) to the top of the menu in order to show which
- // node has been selected
-
- buildMenuTitle(nodes,qmenu);
-
//TypeNodeCondition typeCondFamily (MenuItem::FAMILY);
//TypeNodeCondition typeCondTask (MenuItem::TASK);
//StateNodeCondition stateCondUnknown ("unknown");
@@ -555,6 +550,27 @@ QMenu *Menu::generateMenu(std::vector<VInfo_ptr> nodes, QWidget *parent,QMenu* p
//}
+
+
+ // add an inactive action(!) to the top of the menu in order to show which
+ // node has been selected
+
+ buildMenuTitle(nodes, qmenu);
+
+
+
+ // if multiple attributes are selected, then tell the user we can't help them
+ // NOTE that ActionHandler.cpp ensures that we cannot have a mix of attr and non-attr nodes
+ if (nodes[0]->isAttribute() && nodes.size() > 1)
+ {
+ QAction *noAction = new QAction("No action for multiple attributes", parent);
+ noAction->setEnabled(false);
+ qmenu->addAction(noAction);
+ return qmenu;
+ }
+
+
+
// merge the fixed menu items (from the config file) with the dynamic ones
itemsCombined_ = itemsFixed_;
itemsCombined_.insert(itemsCombined_.end(), itemsCustom_.begin(), itemsCustom_.end());
@@ -655,7 +671,12 @@ void Menu::buildMenuTitle(std::vector<VInfo_ptr> nodes, QMenu* qmenu)
{
QLabel *nodeLabel = NULL;
- if (nodes.size() == 1)
+
+ // we will only create a multiple-entry context menu if we have multiple non-attribute nodes
+ // it is already ensured that if we have multiple nodes, they will be non-attribute nodes
+ bool multiple = (nodes.size() > 1);
+
+ if (!multiple)
{
VNode *node=nodes.at(0)->node();
@@ -716,7 +737,7 @@ void Menu::buildMenuTitle(std::vector<VInfo_ptr> nodes, QMenu* qmenu)
nodeLabel->setParent(titleW);
QWidgetAction *wAction = new QWidgetAction(qmenu);
- wAction->setObjectName("title");
+ wAction->setObjectName("title");
//Qt doc says: the ownership of the widget is passed to the widgetaction.
//So when the action is deleted it will be deleted as well.
wAction->setDefaultWidget(titleW);
diff --git a/Viewer/src/MenuHandler.hpp b/Viewer/src/MenuHandler.hpp
index bb05824..f658912 100644
--- a/Viewer/src/MenuHandler.hpp
+++ b/Viewer/src/MenuHandler.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -18,6 +18,7 @@
#include <QPoint>
#include "VInfo.hpp"
+#include "NodeExpression.hpp"
class QMenu;
class QAction;
@@ -43,28 +44,28 @@ public:
//void addValidType(std::string type);
//void addValidState(std::string type);
void setHandler(const std::string &handler);
- void setViews(const std::vector<std::string> &views) {views_=views;};
+ void setViews(const std::vector<std::string> &views) {views_=views;}
void setQuestion(const std::string &question) {question_=question;}
void setIcon(const std::string &icon);
void setStatustip(const std::string &statustip) {statustip_=statustip;}
void setHidden(bool b) {hidden_=b;}
- void setAsSubMenu() {isSubMenu_ = true;};
- void setVisibleCondition(BaseNodeCondition *cond) {visibleCondition_ = cond;};
- void setEnabledCondition(BaseNodeCondition *cond) {enabledCondition_ = cond;};
- void setQuestionCondition(BaseNodeCondition *cond) {questionCondition_ = cond;};
- void setCustom(bool b) {isCustom_ = b;};
- BaseNodeCondition *visibleCondition() {return visibleCondition_;};
- BaseNodeCondition *enabledCondition() {return enabledCondition_;};
- BaseNodeCondition *questionCondition() {return questionCondition_;};
+ void setAsSubMenu() {isSubMenu_ = true;}
+ void setVisibleCondition(BaseNodeCondition *cond) {visibleCondition_ = cond;}
+ void setEnabledCondition(BaseNodeCondition *cond) {enabledCondition_ = cond;}
+ void setQuestionCondition(BaseNodeCondition *cond) {questionCondition_ = cond;}
+ void setCustom(bool b) {isCustom_ = b;}
+ BaseNodeCondition *visibleCondition() const {return visibleCondition_;}
+ BaseNodeCondition *enabledCondition() const {return enabledCondition_;}
+ BaseNodeCondition *questionCondition() const {return questionCondition_;}
bool shouldAskQuestion(std::vector<VInfo_ptr> &nodes);
- bool isSubMenu() {return isSubMenu_;};
- bool isDivider() {return isDivider_;};
- bool isCustom() {return isCustom_;};
- std::string &name() {return name_;};
- const std::string handler() const {return handler_;}
+ bool isSubMenu() const {return isSubMenu_;}
+ bool isDivider() const {return isDivider_;}
+ bool isCustom() const {return isCustom_;}
+ const std::string& name() const {return name_;}
+ const std::string& handler() const {return handler_;}
bool isValidView(const std::string&) const;
- const std::string command() const {return command_;}
- const std::string question() const {return question_;}
+ const std::string& command() const {return command_;}
+ const std::string& question() const {return question_;}
bool hidden() const {return hidden_;}
int id() const {return id_;}
QAction* createAction(QWidget* parent);
@@ -166,6 +167,8 @@ private:
static std::vector<Menu *> menus_;
static ConfirmationMap commandsWhichRequireConfirmation_;
+ static TrueNodeCondition trueCond_;
+ static FalseNodeCondition falseCond_;
//static std::vector<MenuItem> items_;
};
diff --git a/Viewer/src/MessageItemWidget.cpp b/Viewer/src/MessageItemWidget.cpp
index 24e9c0b..e32ae3b 100644
--- a/Viewer/src/MessageItemWidget.cpp
+++ b/Viewer/src/MessageItemWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/MessageItemWidget.hpp b/Viewer/src/MessageItemWidget.hpp
index 2d7dbc8..33b8888 100644
--- a/Viewer/src/MessageItemWidget.hpp
+++ b/Viewer/src/MessageItemWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/MessageLabel.cpp b/Viewer/src/MessageLabel.cpp
index 873361a..404be74 100644
--- a/Viewer/src/MessageLabel.cpp
+++ b/Viewer/src/MessageLabel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -49,8 +49,8 @@ static std::map<MessageLabel::Type,MessageLabelData> typeData;
MessageLabel::MessageLabel(QWidget *parent) :
QWidget(parent),
- currentType_(NoType),
showTypeTitle_(true),
+ currentType_(NoType),
narrowMode_(false)
{
setProperty("base","1");
diff --git a/Viewer/src/MessageLabel.hpp b/Viewer/src/MessageLabel.hpp
index 878eabf..f35563e 100644
--- a/Viewer/src/MessageLabel.hpp
+++ b/Viewer/src/MessageLabel.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/MeterEditor.cpp b/Viewer/src/MeterEditor.cpp
index 35e06f5..5839c5f 100644
--- a/Viewer/src/MeterEditor.cpp
+++ b/Viewer/src/MeterEditor.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/MeterEditor.hpp b/Viewer/src/MeterEditor.hpp
index e6ef276..10dfbf4 100644
--- a/Viewer/src/MeterEditor.hpp
+++ b/Viewer/src/MeterEditor.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ModelColumn.cpp b/Viewer/src/ModelColumn.cpp
index a81f199..bcff5a5 100644
--- a/Viewer/src/ModelColumn.cpp
+++ b/Viewer/src/ModelColumn.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ModelColumn.hpp b/Viewer/src/ModelColumn.hpp
index 40c3284..84582b3 100644
--- a/Viewer/src/ModelColumn.hpp
+++ b/Viewer/src/ModelColumn.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeExpression.cpp b/Viewer/src/NodeExpression.cpp
index a547f64..c47ba5d 100644
--- a/Viewer/src/NodeExpression.cpp
+++ b/Viewer/src/NodeExpression.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -240,18 +240,16 @@ BaseNodeCondition *NodeExpressionParser::parseExpression(bool caseSensitiveStrin
// short-circuit - if empty, then return a True condition
- if (tokens_.size() == 0)
+ if(tokens_.size() == 0)
{
- result = new TrueNodeCondition();
+ result=new TrueNodeCondition();
}
-
while (!returnEarly && i_ != tokens_.end())
{
bool tokenOk = true;
bool updatedOperands = false;
-
if (i_ != tokens_.end())
{
@@ -440,7 +438,7 @@ BaseNodeCondition *NodeExpressionParser::parseExpression(bool caseSensitiveStrin
if(operandStack.size() >= funcStack.back()->numOperands())
{
std::vector<BaseNodeCondition *> operands;
- result = funcStack.back(); // last function is the current result
+ result = funcStack.back(); // last function is the current result
operands = popLastNOperands(operandStack, result->numOperands()); // pop its operands off the stack
result->setOperands(operands);
funcStack.pop_back(); // remove the last function from the stack
@@ -449,7 +447,8 @@ BaseNodeCondition *NodeExpressionParser::parseExpression(bool caseSensitiveStrin
}
- UiLog().dbg() << " " << result->print();
+ if(result)
+ UiLog().dbg() << " " << result->print();
return result;
}
diff --git a/Viewer/src/NodeExpression.hpp b/Viewer/src/NodeExpression.hpp
index b866af2..9d5c6df 100644
--- a/Viewer/src/NodeExpression.hpp
+++ b/Viewer/src/NodeExpression.hpp
@@ -2,7 +2,7 @@
#define NODEEXPRESSION_HPP_
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -101,7 +101,7 @@ public:
void setOperands(std::vector<BaseNodeCondition *> ops) {operands_ = ops;}
bool containsAttributeSearch();
- bool delayUnwinding() {return delayUnwinding_;}
+ bool delayUnwinding() const {return delayUnwinding_;}
protected:
virtual bool searchInAttributes() {return false;}
@@ -280,7 +280,7 @@ private:
class StateNodeCondition : public BaseNodeCondition
{
public:
- explicit StateNodeCondition(QString stateName) {stateName_ = stateName;}
+ explicit StateNodeCondition(QString stateName) : stateName_(stateName) {}
~StateNodeCondition() {}
bool execute(VItem* node);
@@ -299,7 +299,7 @@ private:
class UserLevelCondition : public BaseNodeCondition
{
public:
- explicit UserLevelCondition(QString userLevelName) {userLevelName_ = userLevelName;}
+ explicit UserLevelCondition(QString userLevelName) : userLevelName_(userLevelName) {}
~UserLevelCondition() {}
bool execute(VItem*);
@@ -318,7 +318,7 @@ private:
class UIStateCondition : public BaseNodeCondition
{
public:
- explicit UIStateCondition(std::string uiStateName) {uiStateName_ = uiStateName;}
+ explicit UIStateCondition(const std::string& uiStateName) : uiStateName_(uiStateName) {}
~UIStateCondition() {}
bool execute(VItem*);
@@ -338,7 +338,7 @@ private:
class NodeAttributeCondition : public BaseNodeCondition
{
public:
- explicit NodeAttributeCondition(QString nodeAttrName) {nodeAttrName_ = nodeAttrName;}
+ explicit NodeAttributeCondition(QString nodeAttrName) : nodeAttrName_(nodeAttrName) {}
~NodeAttributeCondition() {}
bool execute(VItem*);
@@ -357,7 +357,7 @@ private:
class NodeFlagCondition : public BaseNodeCondition
{
public:
- explicit NodeFlagCondition(QString nodeFlagName) {nodeFlagName_ = nodeFlagName;}
+ explicit NodeFlagCondition(QString nodeFlagName) : nodeFlagName_(nodeFlagName) {}
~NodeFlagCondition() {}
bool execute(VItem*);
@@ -378,16 +378,15 @@ public:
explicit WhatToSearchInOperand(std::string what, bool &attr);
~WhatToSearchInOperand();
- std::string name() {return what_;}
- bool execute(VItem* node) {return false;} // not called
+ const std::string& name() const {return what_;}
+ bool execute(VItem* node) {return false;} // not called
std::string print() {return what_;}
- std::string what() {return what_;}
+ const std::string& what() const {return what_;}
private:
std::string what_; // TODO XXX: optimise - we should store an enum here
bool searchInAttributes_;
- void searchInAttributes(bool attr) {searchInAttributes_ = attr;}
bool searchInAttributes() {return searchInAttributes_;}
};
@@ -396,7 +395,7 @@ private:
class WhatToSearchForOperand : public BaseNodeCondition
{
public:
- explicit WhatToSearchForOperand(std::string what) {what_ = what;}
+ explicit WhatToSearchForOperand(const std::string& what) : what_(what) {}
~WhatToSearchForOperand();
std::string name() {return what_;}
@@ -435,7 +434,7 @@ private:
class AttributeStateCondition : public BaseNodeCondition
{
public:
- explicit AttributeStateCondition(QString attrState) {attrState_ = attrState;}
+ explicit AttributeStateCondition(QString attrState) : attrState_(attrState) {}
~AttributeStateCondition() {}
bool execute(VItem*);
diff --git a/Viewer/src/NodeFilterDialog.cpp b/Viewer/src/NodeFilterDialog.cpp
index 9813a85..d6aad17 100644
--- a/Viewer/src/NodeFilterDialog.cpp
+++ b/Viewer/src/NodeFilterDialog.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeFilterDialog.hpp b/Viewer/src/NodeFilterDialog.hpp
index 78364b5..fe9810c 100644
--- a/Viewer/src/NodeFilterDialog.hpp
+++ b/Viewer/src/NodeFilterDialog.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeObserver.hpp b/Viewer/src/NodeObserver.hpp
index 4deab1d..4c4e7c2 100644
--- a/Viewer/src/NodeObserver.hpp
+++ b/Viewer/src/NodeObserver.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodePanel.cpp b/Viewer/src/NodePanel.cpp
index b7ff8e0..f4a077a 100644
--- a/Viewer/src/NodePanel.cpp
+++ b/Viewer/src/NodePanel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodePanel.hpp b/Viewer/src/NodePanel.hpp
index a686af5..e54e914 100644
--- a/Viewer/src/NodePanel.hpp
+++ b/Viewer/src/NodePanel.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodePathWidget.cpp b/Viewer/src/NodePathWidget.cpp
index 34f12e4..5fbdcc4 100644
--- a/Viewer/src/NodePathWidget.cpp
+++ b/Viewer/src/NodePathWidget.cpp
@@ -1,6 +1,6 @@
/***************************** LICENSE START ***********************************
- Copyright 2014 ECMWF and INPE. This software is distributed under the terms
+ Copyright 2009-2017 ECMWF and INPE. This software is distributed under the terms
of the Apache License version 2.0. In applying this license, ECMWF does not
waive the privileges and immunities granted to it by virtue of its status as
an Intergovernmental Organization or submit itself to any jurisdiction.
@@ -9,11 +9,11 @@
#include "NodePathWidget.hpp"
-#include <QDebug>
#include <QHBoxLayout>
#include <QMenu>
#include <QMouseEvent>
#include <QPainter>
+#include <QPalette>
#include <QPolygon>
#include <QSizePolicy>
#include <QStyleOption>
@@ -22,6 +22,7 @@
#include "VNode.hpp"
#include "VProperty.hpp"
+#include "Palette.hpp"
#include "PropertyMapper.hpp"
#include "ServerHandler.hpp"
#include "UiLog.hpp"
@@ -37,7 +38,7 @@ QColor NodePathItem::disabledFontCol_;
int NodePathItem::triLen_=10;
int NodePathItem::height_=0;
int NodePathItem::hPadding_=2;
-int NodePathItem::vPadding_=1;
+int NodePathItem::vPadding_=0;
//#define _UI_NODEPATHWIDGET_DEBUG
@@ -49,16 +50,19 @@ BcWidget::BcWidget(QWidget* parent) :
width_(0),
maxWidth_(0),
itemHeight_(0),
- emptyText_("No selection"),
+ text_("No selection"),
+ textCol_(Qt::white),
+ textDisabledCol_(QColor(220,220,220)),
useGrad_(true),
gradLighter_(150),
hovered_(-1),
elided_(false)
{
font_=QFont();
+ font_.setPointSize(font_.pointSize()-1);
QFontMetrics fm(font_);
- itemHeight_=NodePathItem::height();
+ itemHeight_=NodePathItem::height(font_);
height_=itemHeight_+2*vMargin_;
setMouseTracking(true);
@@ -77,10 +81,15 @@ BcWidget::BcWidget(QWidget* parent) :
setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Minimum);
setMinimumSize(width_,height_);
- ellipsisItem_ = new NodePathEllipsisItem();
+ ellipsisItem_ = new NodePathEllipsisItem(this);
ellipsisItem_->visible_=false;
reset(items_,100);
+
+ //setAutoFillBackground(true);
+ //QPalette pal=palette();
+ //pal.setColor(QPalette::Window,Qt::transparent);
+ //setPalette(pal);
}
BcWidget::~BcWidget()
@@ -89,7 +98,6 @@ BcWidget::~BcWidget()
delete ellipsisItem_;
}
-
void BcWidget::notifyChange(VProperty *p)
{
updateSettings();
@@ -122,6 +130,35 @@ void BcWidget::resetBorder(int idx)
}
}
+void BcWidget::reset(QString txt, int maxWidth)
+{
+ maxWidth_=maxWidth;
+ hovered_=-1;
+ ellipsisItem_->visible_=false;
+ elided_=false;
+
+ QFontMetrics fm(font_);
+ int xp=hMargin_;
+ int yp=vMargin_;
+
+ if(!txt.isEmpty())
+ {
+ text_=txt;
+ }
+ else
+ {
+ text_="No selection";
+ }
+
+ int len=fm.width(text_);
+ textRect_=QRect(xp,yp,len,itemHeight_);
+ width_=xp+len+4;
+
+ crePixmap();
+ resize(width_,height_);
+ update();
+}
+
void BcWidget::reset(int idx,QString text,QColor bgCol,QColor fontCol)
{
if(idx >=0 && idx < items_.count())
@@ -143,7 +180,7 @@ void BcWidget::reset(QList<NodePathItem*> items, int maxWidth)
{
#ifdef _UI_NODEPATHWIDGET_DEBUG
UiLog().dbg() << "BcWidget::reset -->";
- qDebug() << " maxWidth" << maxWidth;
+ UiLog().dbg() << " maxWidth=" << maxWidth;
#endif
maxWidth_=maxWidth;
@@ -158,8 +195,8 @@ void BcWidget::reset(QList<NodePathItem*> items, int maxWidth)
if(items_.count() ==0)
{
- int len=fm.width(emptyText_);
- emptyRect_=QRect(xp,yp,len,itemHeight_);
+ int len=fm.width(text_);
+ textRect_=QRect(xp,yp,len,itemHeight_);
width_=xp+len+4;
}
else
@@ -202,7 +239,7 @@ void BcWidget::reset(QList<NodePathItem*> items, int maxWidth)
width_=xp+NodePathItem::triLen_+hMargin_;
#ifdef _UI_NODEPATHWIDGET_DEBUG
- qDebug() << " full width" << width_;
+ UiLog().dbg() << " full width=" << width_;
#endif
//maxWidth-=2*hMargin_;
@@ -213,7 +250,7 @@ void BcWidget::reset(QList<NodePathItem*> items, int maxWidth)
if(width_ > maxWidth)
{
#ifdef _UI_NODEPATHWIDGET_DEBUG
- qDebug() << " try elided text";
+ UiLog().dbg() << " try elided text";
#endif
//Try different elided text lenghts
for(int i=20; i >= 3; i--)
@@ -254,8 +291,8 @@ void BcWidget::reset(QList<NodePathItem*> items, int maxWidth)
if(width_ > maxWidth)
{
#ifdef _UI_NODEPATHWIDGET_DEBUG
- qDebug() << " insert ellipsis to front + remove items";
- qDebug() << " redTextLen=" << redTextLen;
+ UiLog().dbg() << " insert ellipsis to front + remove items";
+ UiLog().dbg() << " redTextLen=" << redTextLen;
#endif
Q_ASSERT(elided_==false);
@@ -273,11 +310,11 @@ void BcWidget::reset(QList<NodePathItem*> items, int maxWidth)
xp=xpAfterEllipsis;
items_[i]->visible_=false;
#ifdef _UI_NODEPATHWIDGET_DEBUG
- qDebug() << " omit item" << i;
+ UiLog().dbg() << " omit item " << i;
#endif
estWidth=estimateWidth(i+1,xp,redTextLen);
#ifdef _UI_NODEPATHWIDGET_DEBUG
- qDebug() << " estWidth" << estWidth;
+ UiLog().dbg() << " estWidth " << estWidth;
#endif
if(estWidth < maxWidth)
{
@@ -434,11 +471,16 @@ void BcWidget::crePixmap()
QPainter painter(&pix_);
painter.setRenderHints(QPainter::Antialiasing,true);
+ painter.setFont(font_);
+
if(items_.count() == 0)
{
- painter.setPen(Qt::black);
- //qDebug() << "crePixmap" << emptyRect_ << emptyText_;
- painter.drawText(emptyRect_,Qt::AlignHCenter | Qt::AlignVCenter, emptyText_);
+ if(isEnabled())
+ painter.setPen(textCol_);
+ else
+ painter.setPen(textDisabledCol_);
+
+ painter.drawText(textRect_,Qt::AlignHCenter | Qt::AlignVCenter, text_);
}
else
{
@@ -462,6 +504,7 @@ void BcWidget::updatePixmap(int idx)
{
QPainter painter(&pix_);
painter.setRenderHints(QPainter::Antialiasing,true);
+ painter.setFont(font_);
items_.at(idx)->draw(&painter,useGrad_,gradLighter_);
}
}
@@ -500,8 +543,9 @@ void BcWidget::mouseMoveEvent(QMouseEvent *event)
int prev=hovered_;
hovered_=-1;
resetBorder(prev);
-
}
+
+ QWidget::mouseMoveEvent(event);
}
void BcWidget::mousePressEvent(QMouseEvent *event)
@@ -526,6 +570,8 @@ void BcWidget::mousePressEvent(QMouseEvent *event)
}
}
}
+
+ QWidget::mousePressEvent(event);
}
void BcWidget::changeEvent(QEvent* event)
@@ -545,7 +591,8 @@ void BcWidget::changeEvent(QEvent* event)
//
//=====================================================
-NodePathItem::NodePathItem(int index,QString text,QColor bgCol,QColor fontCol,bool hasMenu,bool current) :
+NodePathItem::NodePathItem(BcWidget* owner,int index,QString text,QColor bgCol,QColor fontCol,bool hasMenu,bool current) :
+ owner_(owner),
index_(index),
text_(text),
bgCol_(bgCol),
@@ -555,7 +602,7 @@ NodePathItem::NodePathItem(int index,QString text,QColor bgCol,QColor fontCol,bo
visible_(false),
enabled_(true)
{
- height();
+ height(owner_->font());
if(!disabledBgCol_.isValid())
{
@@ -569,11 +616,10 @@ NodePathItem::NodePathItem(int index,QString text,QColor bgCol,QColor fontCol,bo
grad_.setFinalStop(0,1);
}
-int NodePathItem::height()
+int NodePathItem::height(QFont f)
{
if(height_==0)
- {
- QFont f;
+ {
QFontMetrics fm(f);
height_=fm.height()+2*vPadding_;
}
@@ -586,8 +632,7 @@ void NodePathItem::setCurrent(bool)
int NodePathItem::textLen() const
{
- QFont f;
- QFontMetrics fm(f);
+ QFontMetrics fm(owner_->font());
return fm.width(text_);
}
@@ -610,8 +655,7 @@ int NodePathItem::adjust(int xp,int yp,int elidedLen)
{
visible_=true;
- QFont f;
- QFontMetrics fm(f);
+ QFontMetrics fm(owner_->font());
int len;
if(elidedLen == 0)
{
@@ -642,8 +686,7 @@ int NodePathItem::rightPos(int xp,int len) const
//It returns the x position of the top right corner!
int NodePathItem::estimateRightPos(int xp,int elidedLen)
{
- QFont f;
- QFontMetrics fm(f);
+ QFontMetrics fm(owner_->font());
int len;
if(elidedLen==0)
@@ -684,7 +727,7 @@ void NodePathItem::draw(QPainter *painter,bool useGrad,int lighter)
{
border=borderCol_;
bg=bgCol_;
- fontCol=fontCol_;
+ fontCol=fontCol_;
}
else
{
@@ -693,13 +736,13 @@ void NodePathItem::draw(QPainter *painter,bool useGrad,int lighter)
fontCol=disabledFontCol_;
}
- painter->setPen(QPen(border,0));
-
- QBrush bgBrush;
-
+ QBrush bgBrush;
if(useGrad)
- {
- QColor bgLight=bg.lighter(lighter);
+ {
+ QColor bgLight;
+ Palette::statusColours(bg,bgLight,border);
+
+ //QColor bgLight=bg.lighter(lighter);
grad_.setColorAt(0,bgLight);
grad_.setColorAt(1,bg);
bgBrush=QBrush(grad_);
@@ -707,6 +750,7 @@ void NodePathItem::draw(QPainter *painter,bool useGrad,int lighter)
else
bgBrush=QBrush(bg);
+ painter->setPen(QPen(border,0));
painter->setBrush(bgBrush);
painter->drawPolygon(shape_);
@@ -752,8 +796,8 @@ void NodePathServerItem::makeShape(int xp,int yp,int len)
//
//=====================================================
-NodePathEllipsisItem::NodePathEllipsisItem() :
- NodePathItem(-1,QString(0x2026),QColor(240,240,240),QColor(Qt::black),false,false)
+NodePathEllipsisItem::NodePathEllipsisItem(BcWidget* owner) :
+ NodePathItem(owner,-1,QString(0x2026),QColor(240,240,240),QColor(Qt::black),false,false)
{
borderCol_=QColor(190,190,190);
}
@@ -766,13 +810,8 @@ NodePathEllipsisItem::NodePathEllipsisItem() :
NodePathWidget::NodePathWidget(QWidget *parent) :
QWidget(parent),
-#if 0
- reloadTb_(0),
-#endif
- active_(true)
+ mode_(GuiMode)
{
- setProperty("breadcrumbs","1");
-
layout_=new QHBoxLayout(this);
layout_->setSpacing(0);
layout_->setContentsMargins(2,2,3,2);
@@ -786,20 +825,12 @@ NodePathWidget::NodePathWidget(QWidget *parent) :
connect(bc_,SIGNAL(menuSelected(int,QPoint)),
this,SLOT(slotMenuSelected(int,QPoint)));
-#if 0
- reloadTb_=new QToolButton(this);
- //reloadTb_->setDefaultAction(actionReload_);
- reloadTb_->setIcon(QPixmap(":/viewer/reload_one.svg"));
- reloadTb_->setToolTip(tr("Refresh server"));
- reloadTb_->setAutoRaise(true);
- //reloadTb_->setIconSize(QSize(20,20));
- reloadTb_->setObjectName("pathIconTb");
-
- connect(reloadTb_,SIGNAL(clicked()),
- this,SLOT(slotRefreshServer()));
-
- layout_->addWidget(reloadTb_);
-#endif
+ setAutoFillBackground(true);
+
+ //We make the background transparent
+ QPalette pal=palette();
+ pal.setColor(QPalette::Window,Qt::transparent);
+ setPalette(pal);
}
NodePathWidget::~NodePathWidget()
@@ -807,6 +838,25 @@ NodePathWidget::~NodePathWidget()
clear(true);
}
+void NodePathWidget::useTransparentBg(bool b)
+{
+ QPalette pal=palette();
+
+ if(b)
+ {
+ pal.setColor(QPalette::Window,Qt::transparent);
+ bc_->setTextColour(Qt::white);
+ bc_->setTextDisabledColour(QColor(220,220,220));
+ }
+ else
+ {
+ pal.setColor(QPalette::Window,Qt::white);
+ bc_->setTextColour(Qt::black);
+ bc_->setTextDisabledColour(QColor(60,60,60));
+ }
+ setPalette(pal);
+}
+
void NodePathWidget::clear(bool detachObservers)
{
setEnabled(true);
@@ -830,11 +880,6 @@ void NodePathWidget::clear(bool detachObservers)
clearItems();
setEnabled(true);
-
-#if 0
- reloadTb_->setEnabled(false);
- reloadTb_->setToolTip("");
-#endif
}
void NodePathWidget::clearItems()
@@ -849,31 +894,24 @@ void NodePathWidget::clearItems()
nodeItems_.clear();
}
-void NodePathWidget::active(bool active)
+void NodePathWidget::setMode(Mode mode)
{
- if(active_ != active)
- active_=active;
-
- if(active_)
- {
- setVisible(true);
- }
- else
- {
- setVisible(false);
- clear();
- }
+ if(mode_ != mode)
+ {
+ mode_=mode;
+ VInfo_ptr info=info_;
+ clear(true);
+ setPath(info);
+ }
}
-
void NodePathWidget::slotContextMenu(const QPoint& pos)
{
-
}
void NodePathWidget::adjust(VInfo_ptr info,ServerHandler** serverOut,bool &sameServer)
{
- ServerHandler* server=0;
+ ServerHandler* server=0;
//Check if there is data in info
if(info)
@@ -947,11 +985,6 @@ void NodePathWidget::reset()
setPath(info_);
}
-void NodePathWidget::setPath(QString)
-{
- if(!active_)
- return;
-}
void NodePathWidget::setPath(VInfo_ptr info)
{
@@ -961,9 +994,6 @@ void NodePathWidget::setPath(VInfo_ptr info)
setEnabled(true);
- if(!active_)
- return;
-
ServerHandler *server=0;
bool sameServer=false;
@@ -980,7 +1010,28 @@ void NodePathWidget::setPath(VInfo_ptr info)
{
clearItems();
}
-
+
+ //------------------------------------
+ // Only text is displayed
+ //------------------------------------
+
+ if(mode_ == TextMode)
+ {
+ info_=info;
+ QString pt;
+ if(info_)
+ pt=QString::fromStdString(info_->path());
+
+ bc_->reset(pt,bcWidth());
+ return;
+ }
+
+ //------------------------------------
+ // Interactive breadcrumsbs
+ //------------------------------------
+
+ Q_ASSERT(mode_ = GuiMode);
+
//Get the node list including the server
std::vector<VNode*> lst;
if(info_->node())
@@ -1013,11 +1064,11 @@ void NodePathWidget::setPath(VInfo_ptr info)
if(i==0)
{
- nodeItem=new NodePathServerItem(i,name,col,fontCol,hasChildren,(i == lst.size()-1)?true:false);
+ nodeItem=new NodePathServerItem(bc_,i,name,col,fontCol,hasChildren,(i == lst.size()-1)?true:false);
}
else
{
- nodeItem=new NodePathItem(i,name,col,fontCol,hasChildren,(i == lst.size()-1)?true:false);
+ nodeItem=new NodePathItem(bc_,i,name,col,fontCol,hasChildren,(i == lst.size()-1)?true:false);
}
nodeItems_ << nodeItem;
}
@@ -1037,7 +1088,8 @@ int NodePathWidget::bcWidth()
void NodePathWidget::slotNodeSelected(int idx)
{
- if(idx != -1)
+ Q_ASSERT(mode_ == GuiMode);
+ if(idx != -1)
{
Q_EMIT selected(nodeAt(idx));
}
@@ -1045,7 +1097,8 @@ void NodePathWidget::slotNodeSelected(int idx)
void NodePathWidget::slotMenuSelected(int idx,QPoint bcPos)
{
- if(idx != -1)
+ Q_ASSERT(mode_ == GuiMode);
+ if(idx != -1)
{
loadMenu(bc_->mapToGlobal(bcPos),nodeAt(idx));
}
@@ -1064,6 +1117,11 @@ VInfo_ptr NodePathWidget::nodeAt(int idx)
#ifdef _UI_NODEPATHWIDGET_DEBUG
UiLog().dbg() << "NodePathWidget::nodeAt idx=" << idx;
#endif
+
+ Q_ASSERT(mode_ == GuiMode);
+ if(mode_ == TextMode)
+ return VInfo_ptr();
+
ServerHandler* server=info_->server();
if(info_ && server)
@@ -1084,7 +1142,11 @@ VInfo_ptr NodePathWidget::nodeAt(int idx)
void NodePathWidget::loadMenu(const QPoint& pos,VInfo_ptr p)
{
- if(p && p->node())
+ Q_ASSERT(mode_ == GuiMode);
+ if(mode_ == TextMode)
+ return;
+
+ if(p && p->node())
{
QList<QAction*> acLst;
VNode* node=p->node();
@@ -1117,11 +1179,16 @@ void NodePathWidget::loadMenu(const QPoint& pos,VInfo_ptr p)
}
}
-
void NodePathWidget::notifyBeginNodeChange(const VNode* node, const std::vector<ecf::Aspect::Type>& aspect,const VNodeChange&)
{
- if(!active_)
+ Q_ASSERT(mode_ == GuiMode);
+ if(mode_ == TextMode)
+ return;
+
+#if 0
+ if(!active_)
return;
+#endif
//Check if there is data in info
if(info_ && !info_->isServer() && info_->node())
@@ -1159,24 +1226,27 @@ void NodePathWidget::notifyBeginNodeChange(const VNode* node, const std::vector<
}
}
}
-
}
}
-
void NodePathWidget::notifyDefsChanged(ServerHandler* server,const std::vector<ecf::Aspect::Type>& aspect)
{
#ifdef _UI_NODEPATHWIDGET_DEBUG
UiLog().dbg() << "NodePathWidget::notifyDefsChanged -->";
#endif
+ Q_ASSERT(mode_ == GuiMode);
+ if(mode_ == TextMode)
+ return;
+#if 0
if(!active_)
return;
+#endif
//Check if there is data in info
if(info_ && info_->server() && info_->server() == server)
{
- qDebug() << "Server change";
+ UiLog().dbg() << "Server change";
//State changed
for(std::vector<ecf::Aspect::Type>::const_iterator it=aspect.begin(); it != aspect.end(); ++it)
@@ -1225,7 +1295,6 @@ void NodePathWidget::notifyEndServerScan(ServerHandler* server)
#ifdef _UI_NODEPATHWIDGET_DEBUG
UiLog().dbg() << "NodePathWidget::notifyEndServerScan -->";
#endif
-
if(info_)
{
if(info_->server() && info_->server() == server)
@@ -1233,7 +1302,6 @@ void NodePathWidget::notifyEndServerScan(ServerHandler* server)
#ifdef _UI_NODEPATHWIDGET_DEBUG
UiLog().dbg() << " setEnabled(true)";
#endif
-
setEnabled(true);
#ifdef _UI_NODEPATHWIDGET_DEBUG
@@ -1265,7 +1333,7 @@ void NodePathWidget::notifyEndServerScan(ServerHandler* server)
void NodePathWidget::notifyServerDelete(ServerHandler* server)
{
- if(info_ && info_->server() == server)
+ if(info_ && info_->server() == server)
{
//We do not want to detach ourselves as an observer the from the server. When this function is
//called the server actually loops through its observers and notify them.
@@ -1292,6 +1360,7 @@ void NodePathWidget::notifyDataLost(VInfo* info)
#ifdef _UI_NODEPATHWIDGET_DEBUG
UiLog().dbg() << "NodePathWidget::notifyDataLost -->";
#endif
+
if(info_ && info_.get() == info)
{
#ifdef _UI_NODEPATHWIDGET_DEBUG
@@ -1306,7 +1375,11 @@ void NodePathWidget::notifyDataLost(VInfo* info)
void NodePathWidget::slotRefreshServer()
{
- if(info_ && info_->server())
+ Q_ASSERT(mode_ == GuiMode);
+ if(mode_ == TextMode)
+ return;
+
+ if(info_ && info_->server())
{
info_->server()->refresh();
}
@@ -1333,17 +1406,19 @@ void NodePathWidget::resizeEvent(QResizeEvent *)
void NodePathWidget::writeSettings(VSettings *vs)
{
vs->beginGroup("breadcrumbs");
- vs->put("active",active_);
+ vs->put("mode",(mode_==TextMode)?"text":"gui");
vs->endGroup();
}
void NodePathWidget::readSettings(VSettings* vs)
{
vs->beginGroup("breadcrumbs");
- int ival;
+ std::string modeStr=vs->get<std::string>("mode","");
- ival=vs->get<int>("active",1);
- active((ival==1)?true:false);
+ if(modeStr == "text")
+ setMode(TextMode);
+ else
+ setMode(GuiMode);
vs->endGroup();
}
diff --git a/Viewer/src/NodePathWidget.hpp b/Viewer/src/NodePathWidget.hpp
index 6094965..e608e13 100644
--- a/Viewer/src/NodePathWidget.hpp
+++ b/Viewer/src/NodePathWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -36,18 +36,22 @@ class NodePathEllipsisItem;
class BcWidget : public QWidget, public VPropertyObserver
{
-
+
Q_OBJECT
public:
explicit BcWidget(QWidget *parent=0);
~BcWidget();
+ void reset(QString txt, int maxWidth);
void reset(QList<NodePathItem*>,int);
void reset(int idx,QString text,QColor bgCol,QColor fontCol);
void clear();
void adjustSize(int);
-
+ QFont font() const {return font_;}
+ void setTextColour(QColor c) {textCol_=c;}
+ void setTextDisabledColour(QColor c) {textDisabledCol_=c;}
+
void notifyChange(VProperty*);
Q_SIGNALS:
@@ -59,7 +63,7 @@ protected:
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent* event);
void changeEvent(QEvent* event);
-
+
void updateSettings();
void reset(int);
void resetBorder(int);
@@ -79,8 +83,10 @@ protected:
int maxWidth_;
int height_;
int itemHeight_;
- QString emptyText_;
- QRect emptyRect_;
+ QString text_;
+ QRect textRect_;
+ QColor textCol_;
+ QColor textDisabledCol_;
QList<NodePathItem*> items_;
NodePathEllipsisItem* ellipsisItem_;
@@ -97,7 +103,7 @@ class NodePathItem
friend class BcWidget;
public:
- NodePathItem(int index,QString text,QColor bgCol,QColor fontCol,bool hasMenu,bool current);
+ NodePathItem(BcWidget* owner,int index,QString text,QColor bgCol,QColor fontCol,bool hasMenu,bool current);
void setCurrent(bool);
virtual void draw(QPainter*,bool,int);
int adjust(int xp,int yp, int elidedLen=0);
@@ -105,12 +111,13 @@ public:
void resetBorder(bool hovered);
void reset(QString text,QColor bgCol,QColor fontCol,bool hovered);
int textLen() const;
- static int height();
+ static int height(QFont);
protected:
virtual void makeShape(int xp,int yp,int len);
virtual int rightPos(int xp,int len) const;
+ BcWidget* owner_;
int index_;
QString text_;
QString elidedText_;
@@ -119,6 +126,7 @@ protected:
QColor fontCol_;
QPolygon shape_;
QRect textRect_;
+ QFont font_;
bool current_;
bool hasMenu_;
@@ -141,8 +149,8 @@ class NodePathServerItem : public NodePathItem
friend class BcWidget;
public:
- NodePathServerItem(int index,QString text,QColor bgCol,QColor fontCol,bool hasMenu,bool current) :
- NodePathItem(index,text,bgCol,fontCol,hasMenu,current) {}
+ NodePathServerItem(BcWidget* owner,int index,QString text,QColor bgCol,QColor fontCol,bool hasMenu,bool current) :
+ NodePathItem(owner,index,text,bgCol,fontCol,hasMenu,current) {}
protected:
void makeShape(int xp,int yp,int len);
int rightPos(int xp,int len) const;
@@ -155,11 +163,10 @@ class NodePathEllipsisItem : public NodePathItem
friend class BcWidget;
public:
- NodePathEllipsisItem();
+ NodePathEllipsisItem(BcWidget* owner);
};
-
class NodePathWidget : public QWidget, public NodeObserver, public ServerObserver, public VInfoObserver
{
Q_OBJECT
@@ -168,9 +175,12 @@ public:
explicit NodePathWidget(QWidget* parent=0);
~NodePathWidget();
- bool active() const {return active_;}
- void active(bool);
+ enum Mode {TextMode,GuiMode};
+
void clear(bool detachObservers=true);
+ void setMode(Mode mode);
+ bool isGuiMode() const {return mode_==GuiMode;}
+ void useTransparentBg(bool b);
//From NodeObserver
void notifyBeginNodeChange(const VNode*, const std::vector<ecf::Aspect::Type>&,const VNodeChange&);
@@ -196,7 +206,6 @@ public:
void readSettings(VSettings *vs);
public Q_SLOTS:
- void setPath(QString);
void setPath(VInfo_ptr);
protected Q_SLOTS:
@@ -207,6 +216,7 @@ protected Q_SLOTS:
Q_SIGNALS:
void selected(VInfo_ptr);
+ void activeStateChanged();
protected:
void clearItems();
@@ -225,15 +235,8 @@ protected:
QHBoxLayout* layout_;
VInfo_ptr info_;
VInfo_ptr infoFull_;
-#if 0
- QToolButton* reloadTb_;
-#endif
- BcWidget* bc_;
-
-
- //When active_ is "true" the widget is visible and can receive and display data. When it
- //is "false" the widget is hidden and cannot hold any data.
- bool active_;
+ BcWidget* bc_;
+ Mode mode_;
};
#endif
diff --git a/Viewer/src/NodeQuery.cpp b/Viewer/src/NodeQuery.cpp
index 9eeb177..e37cbed 100644
--- a/Viewer/src/NodeQuery.cpp
+++ b/Viewer/src/NodeQuery.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -10,8 +10,6 @@
#include "NodeQuery.hpp"
-#include <QDebug>
-
#include "NodeQueryOption.hpp"
#include "UiLog.hpp"
#include "VAttributeType.hpp"
@@ -19,7 +17,7 @@
int NodeQuery::defaultMaxNum_=50000;
-//#define _UI_NODEQUERY_DEBUG
+#define _UI_NODEQUERY_DEBUG
QString NodeQueryAttrGroup::query() const
{
@@ -87,10 +85,6 @@ NodeQuery::NodeQuery(const std::string& name,bool ignoreMaxNum) :
NodeQueryOption::build(this);
#ifdef _UI_NODEQUERY_DEBUG
- qDebug() << options_;
-#endif
-
-#ifdef _UI_NODEQUERY_DEBUG
UiLog().dbg() << "<-- NodeQuery";
#endif
}
@@ -140,7 +134,6 @@ bool NodeQuery::hasServer(const std::string& name) const
{
#ifdef _UI_NODEQUERY_DEBUG
UiLog().dbg() << "NodeQuery::hasServer -->";
- qDebug() << " servers=" << servers_;
#endif
if(servers_.empty())
@@ -341,10 +334,6 @@ void NodeQuery::buildQueryString()
if(!opPart.isEmpty())
extQuery_["options"]=opPart;
-#ifdef _UI_NODEQUERY_DEBUG
- qDebug() << extQuery_;
-#endif
-
//SQL-like query
sqlQuery_.clear();
QStringList selectPart;
diff --git a/Viewer/src/NodeQuery.hpp b/Viewer/src/NodeQuery.hpp
index 9f9c997..de02e26 100644
--- a/Viewer/src/NodeQuery.hpp
+++ b/Viewer/src/NodeQuery.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryCombo.cpp b/Viewer/src/NodeQueryCombo.cpp
index 4fbda1a..e515535 100644
--- a/Viewer/src/NodeQueryCombo.cpp
+++ b/Viewer/src/NodeQueryCombo.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryCombo.hpp b/Viewer/src/NodeQueryCombo.hpp
index fb0fd33..7063bac 100644
--- a/Viewer/src/NodeQueryCombo.hpp
+++ b/Viewer/src/NodeQueryCombo.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryEditor.cpp b/Viewer/src/NodeQueryEditor.cpp
index e50b75a..82d081d 100644
--- a/Viewer/src/NodeQueryEditor.cpp
+++ b/Viewer/src/NodeQueryEditor.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryEditor.hpp b/Viewer/src/NodeQueryEditor.hpp
index 490c317..83db6a9 100644
--- a/Viewer/src/NodeQueryEditor.hpp
+++ b/Viewer/src/NodeQueryEditor.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryEngine.cpp b/Viewer/src/NodeQueryEngine.cpp
index 47d4632..945db22 100644
--- a/Viewer/src/NodeQueryEngine.cpp
+++ b/Viewer/src/NodeQueryEngine.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -206,22 +206,31 @@ void NodeQueryEngine::runRecursively(VNode *node)
//Execute the node part
if(parser_->execute(node))
{
+ //Then execute the attribute part
if(!attrParser_.isEmpty())
{
QMap<VAttributeType*,BaseNodeCondition*>::const_iterator it = attrParser_.constBegin();
while (it != attrParser_.constEnd())
- {
- QList<VItemTmp_ptr> aLst;
- it.key()->items(node,aLst);
-
- Q_FOREACH(VItemTmp_ptr aItem,aLst)
+ {
+ //Process a given attribute type
+ const std::vector<VAttribute*>& av=node->attr();
+ bool hasType=false;
+ for(size_t i=0; i < av.size(); i++)
{
- VAttribute* a=aItem->attribute();
- Q_ASSERT(a);
- if(it.value()->execute(a))
+ if(av[i]->type() == it.key())
{
- broadcastFind(node,a->data());
- scanCnt_++;
+ hasType=true;
+ if(it.value()->execute(av[i]))
+ {
+ broadcastFind(node,av[i]->data());
+ scanCnt_++;
+ }
+ }
+ //The the attribute vector elements are grouped by type.
+ //So we leave the loop when we reach the next type group
+ else if(hasType)
+ {
+ break;
}
}
++it;
@@ -251,8 +260,7 @@ void NodeQueryEngine::broadcastFind(VNode* node,QStringList attr)
if(!attr.isEmpty())
{
NodeQueryResultTmp_ptr d(new NodeQueryResultTmp(node,attr));
- res_ << d;
- //qDebug() << "RES" << attr;
+ res_ << d;
}
else
{
diff --git a/Viewer/src/NodeQueryEngine.hpp b/Viewer/src/NodeQueryEngine.hpp
index 632987b..2165a3d 100644
--- a/Viewer/src/NodeQueryEngine.hpp
+++ b/Viewer/src/NodeQueryEngine.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryHandler.cpp b/Viewer/src/NodeQueryHandler.cpp
index 895b4fb..d7269e4 100644
--- a/Viewer/src/NodeQueryHandler.cpp
+++ b/Viewer/src/NodeQueryHandler.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryHandler.hpp b/Viewer/src/NodeQueryHandler.hpp
index e130eea..d91bd49 100644
--- a/Viewer/src/NodeQueryHandler.hpp
+++ b/Viewer/src/NodeQueryHandler.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryOption.cpp b/Viewer/src/NodeQueryOption.cpp
index 34c273f..109f1f8 100644
--- a/Viewer/src/NodeQueryOption.cpp
+++ b/Viewer/src/NodeQueryOption.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryOption.hpp b/Viewer/src/NodeQueryOption.hpp
index ea2304d..316d8ea 100644
--- a/Viewer/src/NodeQueryOption.hpp
+++ b/Viewer/src/NodeQueryOption.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryOptionEdit.cpp b/Viewer/src/NodeQueryOptionEdit.cpp
index 621050e..720f500 100644
--- a/Viewer/src/NodeQueryOptionEdit.cpp
+++ b/Viewer/src/NodeQueryOptionEdit.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryOptionEdit.hpp b/Viewer/src/NodeQueryOptionEdit.hpp
index 2ea47db..1e2ab41 100644
--- a/Viewer/src/NodeQueryOptionEdit.hpp
+++ b/Viewer/src/NodeQueryOptionEdit.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryResult.cpp b/Viewer/src/NodeQueryResult.cpp
index f9f95a0..88c383a 100644
--- a/Viewer/src/NodeQueryResult.cpp
+++ b/Viewer/src/NodeQueryResult.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryResult.hpp b/Viewer/src/NodeQueryResult.hpp
index 065a4d8..b3a910d 100644
--- a/Viewer/src/NodeQueryResult.hpp
+++ b/Viewer/src/NodeQueryResult.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryResultModel.cpp b/Viewer/src/NodeQueryResultModel.cpp
index 91ab66c..ded867b 100644
--- a/Viewer/src/NodeQueryResultModel.cpp
+++ b/Viewer/src/NodeQueryResultModel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -226,7 +226,7 @@ VInfo_ptr NodeQueryResultModel::nodeInfo(const QModelIndex& index)
//attribute
else
{
- if(VAttribute* a=VAttribute::make(d->node_,d->attr_))
+ if(VAttribute* a=d->node_->findAttribute(d->attr_))
return VInfoAttribute::create(a);
else
return VInfoNode::create(d->node_);
diff --git a/Viewer/src/NodeQueryResultModel.hpp b/Viewer/src/NodeQueryResultModel.hpp
index 9e14157..f27c4b3 100644
--- a/Viewer/src/NodeQueryResultModel.hpp
+++ b/Viewer/src/NodeQueryResultModel.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryResultTmp.hpp b/Viewer/src/NodeQueryResultTmp.hpp
index b195826..8a3c8d7 100644
--- a/Viewer/src/NodeQueryResultTmp.hpp
+++ b/Viewer/src/NodeQueryResultTmp.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryResultView.cpp b/Viewer/src/NodeQueryResultView.cpp
index 7643f60..3df1bba 100644
--- a/Viewer/src/NodeQueryResultView.cpp
+++ b/Viewer/src/NodeQueryResultView.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryResultView.hpp b/Viewer/src/NodeQueryResultView.hpp
index 85c7bd9..79fd0b1 100644
--- a/Viewer/src/NodeQueryResultView.hpp
+++ b/Viewer/src/NodeQueryResultView.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeQueryViewDelegate.cpp b/Viewer/src/NodeQueryViewDelegate.cpp
index 4e2d6e7..4e84c71 100644
--- a/Viewer/src/NodeQueryViewDelegate.cpp
+++ b/Viewer/src/NodeQueryViewDelegate.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -10,6 +10,7 @@
#include "NodeQueryViewDelegate.hpp"
+#include <QtGlobal>
#include <QApplication>
#include <QDebug>
#include <QImageReader>
@@ -25,9 +26,45 @@
static std::vector<std::string> propVec;
+//Define node renderer properties
+struct QueryNodeDelegateBox : public NodeDelegateBox
+{
+ QueryNodeDelegateBox() {
+ topMargin=2;
+ bottomMargin=2;
+ leftMargin=3;
+ rightMargin=0;
+ topPadding=0;
+ bottomPadding=0;
+ leftPadding=2;
+ rightPadding=1;
+ }
+};
+
+//Define attribute renderer properties
+struct QueryAttrDelegateBox : public AttrDelegateBox
+{
+ QueryAttrDelegateBox() {
+ topMargin=2;
+ bottomMargin=2;
+ leftMargin=1;
+ rightMargin=0;
+ topPadding=0;
+ bottomPadding=0;
+ leftPadding=0;
+ rightPadding=0;
+ }
+};
+
NodeQueryViewDelegate::NodeQueryViewDelegate(QWidget *parent)
{
- borderPen_=QPen(QColor(230,230,230));
+ nodeBox_=new QueryNodeDelegateBox;
+ attrBox_=new QueryAttrDelegateBox;
+
+ nodeBox_->adjust(font_);
+ attrBox_->adjust(attrFont_);
+
+ borderPen_=QPen(QColor(230,230,230));
columns_=ModelColumn::def("query_columns");
@@ -56,17 +93,19 @@ void NodeQueryViewDelegate::updateSettings()
QSize NodeQueryViewDelegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
QSize size=QStyledItemDelegate::sizeHint(option,index);
-
- QFontMetrics fm(font_);
- int h=fm.height();
- return QSize(size.width(),h+4);
+ return QSize(size.width(),nodeBox_->sizeHintCache.height());
}
void NodeQueryViewDelegate::paint(QPainter *painter,const QStyleOptionViewItem &option,
const QModelIndex& index) const
{
//Background
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+ QStyleOptionViewItem vopt(option);
+#else
QStyleOptionViewItemV4 vopt(option);
+#endif
+
initStyleOption(&vopt, index);
const QStyle *style = vopt.widget ? vopt.widget->style() : QApplication::style();
@@ -75,39 +114,6 @@ void NodeQueryViewDelegate::paint(QPainter *painter,const QStyleOptionViewItem &
//Save painter state
painter->save();
- //Selection - we only do it once
- /*if(index.column() == 0)
- {
- QRect fullRect=QRect(0,option.rect.y(),painter->device()->width(),option.rect.height());
-
- if(option.state & QStyle::State_Selected)
- {
- //QRect fillRect=option.rect.adjusted(0,1,-1,-textRect.height()-1);
- painter->fillRect(fullRect,selectBrush_);
- painter->setPen(selectPen_);
- painter->drawLine(fullRect.topLeft(),fullRect.topRight());
- painter->drawLine(fullRect.bottomLeft(),fullRect.bottomRight());
- }
- else if(option.state & QStyle::State_MouseOver)
- {
- //QRect fillRect=option.rect.adjusted(0,1,-1,-1);
- painter->fillRect(fullRect,hoverBrush_);
- painter->setPen(hoverPen_);
- painter->drawLine(fullRect.topLeft(),fullRect.topRight());
- painter->drawLine(fullRect.bottomLeft(),fullRect.bottomRight());
- }
- }*/
-
- //Different background for lost connection?
- /* if(index.data(AbstractNodeModel::ConnectionRole).toInt() == 0)
- {
- QRect fullRect=QRect(0,option.rect.y(),painter->device()->width(),option.rect.height());
- painter->fillRect(fullRect,lostConnectBgBrush_);
- QRect bandRect=QRect(0,option.rect.y(),5,option.rect.height());
- painter->fillRect(bandRect,lostConnectBandBrush_);
-
- }*/
-
QString id=columns_->id(index.column());
if(id == "path")
@@ -143,7 +149,7 @@ void NodeQueryViewDelegate::paint(QPainter *painter,const QStyleOptionViewItem &
else
{
QString text=index.data(Qt::DisplayRole).toString();
- QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &vopt, widget);
+ QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &vopt,widget);
painter->setPen(Qt::black);
int rightPos=textRect.right()+1;
@@ -174,58 +180,53 @@ void NodeQueryViewDelegate::paint(QPainter *painter,const QStyleOptionViewItem &
painter->setPen(borderPen_);
painter->drawLine(bgRect.topLeft(),bgRect.topRight());
-
painter->restore();
}
void NodeQueryViewDelegate::renderNode(QPainter *painter,const QModelIndex& index,
- const QStyleOptionViewItemV4& option,QString text) const
+ const QStyleOptionViewItem& option,QString text) const
{
bool selected=option.state & QStyle::State_Selected;
- int offset=4;
-
- QFontMetrics fm(font_);
- int deltaH=(option.rect.height()-(fm.height()+2))/2;
+ QFontMetrics fm(font_);
- //The initial filled rect (we will adjust its width)
- QRect fillRect=option.rect.adjusted(offset,deltaH,0,-deltaH-1);
- if(selected)
- fillRect.adjust(0,1,0,0);
+ QRect itemRect=option.rect.adjusted(nodeBox_->leftMargin,nodeBox_->topMargin,0,-nodeBox_->bottomMargin);
//The text rectangle
- QRect textRect = fillRect.adjusted(offset,0,0,0);
+ QRect textRect = itemRect;
int textWidth=fm.width(text);
- textRect.setWidth(textWidth);
+ textRect.setWidth(textWidth+nodeBox_->leftPadding+nodeBox_->rightPadding);
- //Adjust the filled rect width
- fillRect.setRight(textRect.right()+offset);
+ int currentRight=textRect.x()+textRect.width();
- int currentRight=fillRect.right();
+ QList<QPixmap> pixLst;
+ QList<QRect> pixRectLst;
- //Icons area
- QList<QPixmap> pixLst;
- QList<QRect> pixRectLst;
- QVariant va=index.data(AbstractNodeModel::IconRole);
- if(va.type() == QVariant::List)
- {
- QVariantList lst=va.toList();
- int xp=currentRight+5;
- int yp=textRect.center().y()-iconSize_/2;
- for(int i=0; i < lst.count(); i++)
- {
- int id=lst[i].toInt();
- if(id != -1)
- {
- pixLst << IconProvider::pixmap(id,iconSize_);
- pixRectLst << QRect(xp,yp,pixLst.back().width(),pixLst.back().height());
- xp+=pixLst.back().width();
- }
- }
-
- if(!pixRectLst.isEmpty())
- currentRight=pixRectLst.back().right();
- }
+ QVariant va=index.data(AbstractNodeModel::IconRole);
+ if(va.type() == QVariant::List)
+ {
+ QVariantList lst=va.toList();
+ if(lst.count() >0)
+ {
+ int xp=currentRight+nodeBox_->iconPreGap;
+ int yp=itemRect.center().y()+1-nodeBox_->iconSize/2;
+ for(int i=0; i < lst.count(); i++)
+ {
+ int id=lst[i].toInt();
+ if(id != -1)
+ {
+ pixLst << IconProvider::pixmap(id,nodeBox_->iconSize);
+ pixRectLst << QRect(xp,yp,nodeBox_->iconSize,nodeBox_->iconSize);
+ xp+=nodeBox_->iconSize+nodeBox_->iconGap;
+ }
+ }
+
+ if(!pixLst.isEmpty())
+ {
+ currentRight=xp-nodeBox_->iconGap;
+ }
+ }
+ }
//Define clipping
int rightPos=currentRight+1;
@@ -239,14 +240,14 @@ void NodeQueryViewDelegate::renderNode(QPainter *painter,const QModelIndex& inde
//Draw text
QColor fg=index.data(Qt::ForegroundRole).value<QColor>();
painter->setPen(fg);
- painter->drawText(textRect,Qt::AlignLeft | Qt::AlignVCenter,text);
+ painter->drawText(textRect,Qt::AlignHCenter | Qt::AlignVCenter,text);
- if(selected)
- {
- painter->setPen(nodeSelectPen_);
- QRect selRect=textRect.adjusted(-2,0,2,0);
- painter->drawRect(selRect);
- }
+ if(selected)
+ {
+ QRect sr=textRect;
+ sr.setX(option.rect.x()+nodeBox_->leftMargin);
+ renderSelectionRect(painter,sr);
+ }
//Draw icons
for(int i=0; i < pixLst.count(); i++)
diff --git a/Viewer/src/NodeQueryViewDelegate.hpp b/Viewer/src/NodeQueryViewDelegate.hpp
index 380300e..6d58a58 100644
--- a/Viewer/src/NodeQueryViewDelegate.hpp
+++ b/Viewer/src/NodeQueryViewDelegate.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -38,7 +38,7 @@ protected:
void updateSettings();
void renderNode(QPainter *painter,const QModelIndex& index,
- const QStyleOptionViewItemV4& option,QString text) const;
+ const QStyleOptionViewItem& option,QString text) const;
ModelColumn* columns_;
QPen borderPen_;
diff --git a/Viewer/src/NodeSearchDialog.cpp b/Viewer/src/NodeSearchDialog.cpp
index e8cfbfc..5e4b6c3 100644
--- a/Viewer/src/NodeSearchDialog.cpp
+++ b/Viewer/src/NodeSearchDialog.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeSearchDialog.hpp b/Viewer/src/NodeSearchDialog.hpp
index 445892e..0ca3ca7 100644
--- a/Viewer/src/NodeSearchDialog.hpp
+++ b/Viewer/src/NodeSearchDialog.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeSearchWidget.cpp b/Viewer/src/NodeSearchWidget.cpp
index f63e1b0..88130dd 100644
--- a/Viewer/src/NodeSearchWidget.cpp
+++ b/Viewer/src/NodeSearchWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -25,7 +25,6 @@
#include <QtGlobal>
#include <QCloseEvent>
-#include <QDebug>
#include <QMessageBox>
#include <QPalette>
#include <QVBoxLayout>
@@ -185,7 +184,7 @@ void NodeSearchWidget::slotFind()
}
#ifdef _UI_NODESEARCHWIDGET_DEBUG
- qDebug() << engine_->isRunning();
+ UiLog().dbg() << " isRunning=" << engine_->isRunning();
#endif
adjustColumns();
@@ -272,7 +271,7 @@ void NodeSearchWidget::slotQueryFinished()
elapsed_=QTime();
#ifdef _UI_NODESEARCHWIDGET_DEBUG
- qDebug() << engine_->isRunning();
+ UiLog().dbg() << " isRunning=" << engine_->isRunning();
UiLog().dbg() << "<-- NodeSearchWidget::slotQueryFinished";
#endif
}
diff --git a/Viewer/src/NodeSearchWidget.hpp b/Viewer/src/NodeSearchWidget.hpp
index ac4d71d..86a7efa 100644
--- a/Viewer/src/NodeSearchWidget.hpp
+++ b/Viewer/src/NodeSearchWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeViewBase.cpp b/Viewer/src/NodeViewBase.cpp
index 18a356b..eb29eb9 100644
--- a/Viewer/src/NodeViewBase.cpp
+++ b/Viewer/src/NodeViewBase.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeViewBase.hpp b/Viewer/src/NodeViewBase.hpp
index c29f69a..430a073 100644
--- a/Viewer/src/NodeViewBase.hpp
+++ b/Viewer/src/NodeViewBase.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/NodeViewDelegate.cpp b/Viewer/src/NodeViewDelegate.cpp
index e5d172d..ddbab34 100644
--- a/Viewer/src/NodeViewDelegate.cpp
+++ b/Viewer/src/NodeViewDelegate.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -16,6 +16,7 @@
#include "AbstractNodeModel.hpp"
#include "PropertyMapper.hpp"
+#include "UiLog.hpp"
int NodeViewDelegate::lighter_=150;
@@ -23,23 +24,13 @@ static std::vector<std::string> propVec;
NodeViewDelegate::NodeViewDelegate(QWidget *parent) :
QStyledItemDelegate(parent),
- prop_(0),
- iconSize_(16),
- iconGap_(3),
+ prop_(0),
+ nodeBox_(0),
+ attrBox_(0),
useStateGrad_(true),
- drawAttrSelectionRect_(false)
+ drawAttrSelectionRect_(false),
+ limitShape_(RectLimitShape)
{
- /*//Property
- if(propVec.empty())
- {
- propVec.push_back("view.tree.font");
- propVec.push_back("view.tree.displayChildCount");
- }
-
- prop_=new PropertyMapper(propVec,this);
-
- updateSettings();*/
-
hoverPen_=QPen(QColor(201,201,201));
hoverBrush_=QBrush(QColor(250,250,250,210));
selectPen_=QPen(QColor(125,162,206));
@@ -71,6 +62,12 @@ NodeViewDelegate::NodeViewDelegate(QWidget *parent) :
meterThresholdBrush_=QBrush(QColor(0,0,255));
limitFillBrush_=QBrush(QColor(0,255,0));
limitExtraFillBrush_=QBrush(QColor(0,0,255));
+ triggerBgBrush_=QBrush(QColor(230,230,230));
+ triggerBorderPen_=QPen(QColor(150,150,150));
+ triggerFontPen_=QPen(QColor(0,0,0));
+ completeBgBrush_=QBrush(QColor(230,230,230));
+ completeBorderPen_=QPen(QColor(150,150,150));
+ completeFontPen_=QPen(QColor(0,0,255));
attrRenderers_["meter"]=&NodeViewDelegate::renderMeter;
attrRenderers_["label"]=&NodeViewDelegate::renderLabel;
@@ -88,6 +85,12 @@ NodeViewDelegate::NodeViewDelegate(QWidget *parent) :
NodeViewDelegate::~NodeViewDelegate()
{
+ Q_ASSERT(nodeBox_);
+ delete nodeBox_;
+
+ Q_ASSERT(attrBox_);
+ delete attrBox_;
+
if(prop_)
delete prop_;
}
@@ -103,8 +106,15 @@ void NodeViewDelegate::addBaseSettings(std::vector<std::string>& propVec)
propVec.push_back("view.attribute.eventFillColour");
propVec.push_back("view.attribute.meterFillColour");
propVec.push_back("view.attribute.meterThresholdColour");
+ propVec.push_back("view.attribute.limitShape");
propVec.push_back("view.attribute.limitFillColour");
propVec.push_back("view.attribute.limitExtraFillColour");
+ propVec.push_back("view.attribute.triggerBackground");
+ propVec.push_back("view.attribute.triggerBorderColour");
+ propVec.push_back("view.attribute.triggerFontColour");
+ propVec.push_back("view.attribute.completeBackground");
+ propVec.push_back("view.attribute.completeBorderColour");
+ propVec.push_back("view.attribute.completeFontColour");
}
void NodeViewDelegate::updateBaseSettings()
@@ -139,6 +149,16 @@ void NodeViewDelegate::updateBaseSettings()
gr.setColorAt(1,c1.lighter(110));
meterThresholdBrush_=QBrush(gr);
}
+ if(VProperty* p=prop_->find("view.attribute.limitShape"))
+ {
+ QString shape=p->value().toString();
+ if(shape == "rectangle")
+ limitShape_=RectLimitShape;
+ else if(shape == "circle")
+ limitShape_=CircleLimitShape;
+ else
+ limitShape_=CircleLimitShape;
+ }
if(VProperty* p=prop_->find("view.attribute.limitFillColour"))
{
limitFillBrush_=QBrush(p->value().value<QColor>());
@@ -147,63 +167,63 @@ void NodeViewDelegate::updateBaseSettings()
{
limitExtraFillBrush_=QBrush(p->value().value<QColor>());
}
+ if(VProperty* p=prop_->find("view.attribute.triggerBackground"))
+ {
+ triggerBgBrush_=QBrush(p->value().value<QColor>());
+ }
+ if(VProperty* p=prop_->find("view.attribute.triggerBorderColour"))
+ {
+ triggerBorderPen_=QPen(p->value().value<QColor>());
+ }
+ if(VProperty* p=prop_->find("view.attribute.triggerFontColour"))
+ {
+ triggerFontPen_=QPen(p->value().value<QColor>());
+ }
+ if(VProperty* p=prop_->find("view.attribute.completeBackground"))
+ {
+ completeBgBrush_=QBrush(p->value().value<QColor>());
+ }
+ if(VProperty* p=prop_->find("view.attribute.completeBorderColour"))
+ {
+ completeBorderPen_=QPen(p->value().value<QColor>());
+ }
+ if(VProperty* p=prop_->find("view.attribute.completeFontColour"))
+ {
+ completeFontPen_=QPen(p->value().value<QColor>());
+ }
//limit pixmaps
- QFontMetrics fm(attrFont_);
- int itemSize=static_cast<int>(static_cast<float>(fm.ascent())*0.9);
-
- QImage img(itemSize,itemSize,QImage::Format_ARGB32_Premultiplied);
- img.fill(Qt::transparent);
- QPainter painter(&img);
- //painter.setRenderHint(QPainter::Antialiasing,true);
- painter.setPen(QPen(QColor(70,70,70),0));
- painter.setBrush(limitFillBrush_);
- painter.drawEllipse(1,1,itemSize-2,itemSize-2);
- limitFillPix_=QPixmap::fromImage(img);
-
- painter.fillRect(QRect(QPoint(0,0),img.size()),Qt::transparent);
- painter.setBrush(QColor(240,240,240));
- painter.drawEllipse(1,1,itemSize-2,itemSize-2);
- limitEmptyPix_=QPixmap::fromImage(img);
-
- painter.fillRect(QRect(QPoint(0,0),img.size()),Qt::transparent);
- painter.setBrush(limitExtraFillBrush_);
- painter.drawEllipse(1,1,itemSize-2,itemSize-2);
- limitExtraFillPix_=QPixmap::fromImage(img);
-}
-
-QSize NodeViewDelegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index ) const
-{
- QSize size=QStyledItemDelegate::sizeHint(option,index);
-
- QFontMetrics fm(font_);
- int h=fm.height();
- return QSize(size.width(),h+8);
-}
-
-void NodeViewDelegate::adjustIconSize()
-{
- QFontMetrics fm(font_);
- int h=fm.ascent()+fm.descent()/2;
- iconSize_=h;
- if(iconSize_ % 2 == 1)
- iconSize_+=1;
-
- iconGap_=iconSize_/5;
- if(iconGap_ < 3)
- iconGap_=3;
- if(iconGap_ > 10)
- iconGap_=10;
-
- /*if(h > 14 && h < 19 )
- iconSize_=16;
- else if( h < 22)
- iconSize_=20;
- else if( h < 29)
- iconSize_=24;
- else if (h < 38)
- iconSize=32;
- else if ()*/
+ if(limitShape_ == CircleLimitShape)
+ {
+ QFontMetrics fm(attrFont_);
+ int itemSize=static_cast<int>(static_cast<float>(fm.ascent())*0.8);
+
+ QImage img(itemSize,itemSize,QImage::Format_ARGB32_Premultiplied);
+ img.fill(Qt::transparent);
+ QPainter painter(&img);
+ painter.setRenderHint(QPainter::Antialiasing,true);
+
+ painter.setPen(Qt::NoPen);
+ painter.setBrush(QColor(70,70,70));
+ painter.drawEllipse(1,1,itemSize-1,itemSize-1);
+ painter.setBrush(limitFillBrush_);
+ painter.drawEllipse(1,1,itemSize-2,itemSize-2);
+ limitFillPix_=QPixmap::fromImage(img);
+
+ painter.fillRect(QRect(QPoint(0,0),img.size()),Qt::transparent);
+ painter.setBrush(QColor(70,70,70));
+ painter.drawEllipse(1,1,itemSize-1,itemSize-1);
+ painter.setBrush(limitExtraFillBrush_);
+ painter.drawEllipse(1,1,itemSize-2,itemSize-2);
+ limitExtraFillPix_=QPixmap::fromImage(img);
+
+ painter.fillRect(QRect(QPoint(0,0),img.size()),Qt::transparent);
+ painter.setBrush(QColor(130,130,130));
+ painter.drawEllipse(1,1,itemSize-1,itemSize-1);
+ painter.setBrush(QColor(240,240,240));
+ painter.drawEllipse(1,1,itemSize-2,itemSize-2);
+ limitEmptyPix_=QPixmap::fromImage(img);
+ }
}
void NodeViewDelegate::renderSelectionRect(QPainter* painter,QRect r) const
@@ -214,7 +234,7 @@ void NodeViewDelegate::renderSelectionRect(QPainter* painter,QRect r) const
}
void NodeViewDelegate::renderStatus(QPainter *painter,const QModelIndex& index,
- const QStyleOptionViewItemV4& option) const
+ const QStyleOptionViewItem& option) const
{
int offset=4;
@@ -278,10 +298,12 @@ void NodeViewDelegate::renderStatus(QPainter *painter,const QModelIndex& index,
// "meter" name value min max colChange
//========================================================
-void NodeViewDelegate::renderMeter(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const
+int NodeViewDelegate::renderMeter(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
{
- if(data.count() != 6)
- return;
+ int totalWidth=0;
+
+ if(data.count() != 6)
+ return totalWidth;
//The data
int val=data.at(2).toInt();
@@ -291,37 +313,29 @@ void NodeViewDelegate::renderMeter(QPainter *painter,QStringList data,const QSty
bool selected=option.state & QStyle::State_Selected;
- //float percent=static_cast<float>(val-min)/static_cast<float>(max-min);
- //float thresholdPercent=static_cast<float>(threshold-min)/static_cast<float>(max-min);
-
QString name=data.at(1) + ":";
- QString valStr=data.at(2); // + " (" + QString::number(100.*percent) + "%)";
-
- int frontOffset=8;
- int offset=2;
- //int gap=5;
-
- //The border rect (we will adjust its width)
- QRect fillRect=option.rect.adjusted(frontOffset,1,0,-1);
- if(selected)
- fillRect.adjust(0,1,0,-1);
-
+ QString valStr=data.at(2);
QFontMetrics fm(attrFont_);
+ //The contents rect (we will adjust its width)
+ QRect contRect=option.rect.adjusted(attrBox_->leftMargin,
+ attrBox_->topMargin+attrBox_->topPadding,0,
+ -attrBox_->bottomMargin-attrBox_->bottomPadding);
+
//The status rectangle
- int stHeight=static_cast<int>(static_cast<float>(fm.ascent())*0.9);
- int stHeightDiff=(fillRect.height()-stHeight)/2;
- QRect stRect=fillRect.adjusted(offset,stHeightDiff,
- 0,-(fillRect.height()-stHeight-stHeightDiff));
- stRect.setWidth(50);
+ int stHeight=static_cast<int>(static_cast<float>(fm.ascent())*0.8);
+ int stHeightDiff=(contRect.height()-stHeight)/2;
+
+ QRect stRect=contRect.adjusted(attrBox_->leftPadding,stHeightDiff,0,-stHeightDiff);
+ stRect.setWidth(50);
//The text rectangle
QFont nameFont=attrFont_;
nameFont.setBold(true);
fm=QFontMetrics(nameFont);
int nameWidth=fm.width(name);
- QRect nameRect = fillRect;
- nameRect.setLeft(stRect.right()+fm.width('A'));
+ QRect nameRect = contRect;
+ nameRect.setLeft(stRect.x()+stRect.width()+attrBox_->spacing);
nameRect.setWidth(nameWidth);
//The value rectangle
@@ -329,16 +343,14 @@ void NodeViewDelegate::renderMeter(QPainter *painter,QStringList data,const QSty
fm=QFontMetrics(valFont);
int valWidth=fm.width(valStr);
QRect valRect = nameRect;
- valRect.setLeft(nameRect.right()+fm.width('A'));
+ valRect.setX(nameRect.x()+nameRect.width()+attrBox_->spacing);
valRect.setWidth(valWidth);
- //Adjust the filled rect width
- fillRect.setRight(valRect.right()+offset);
-
//Define clipping
- int rightPos=fillRect.right()+1;
- const bool setClipRect = rightPos > option.rect.right();
- if(setClipRect)
+ int rightPos=valRect.x()+valRect.width()+attrBox_->rightPadding+attrBox_->rightMargin;
+ totalWidth=rightPos-option.rect.x();
+ const bool setClipRect = rightPos > option.rect.right();
+ if(setClipRect)
{
painter->save();
painter->setClipRect(option.rect);
@@ -393,24 +405,26 @@ void NodeViewDelegate::renderMeter(QPainter *painter,QStringList data,const QSty
//Draw name
painter->setPen(Qt::black);
painter->setFont(nameFont);
- painter->drawText(nameRect,Qt::AlignLeft | Qt::AlignVCenter,name);
+ painter->drawText(attrBox_->adjustTextRect(nameRect),Qt::AlignLeft | Qt::AlignVCenter,name);
//Draw value
painter->setPen(Qt::black);
painter->setFont(valFont);
- painter->drawText(valRect,Qt::AlignLeft | Qt::AlignVCenter,valStr);
+ painter->drawText(attrBox_->adjustTextRect(valRect),Qt::AlignLeft | Qt::AlignVCenter,valStr);
if(selected && drawAttrSelectionRect_)
- {
- QRect sr=stRect;
- sr.setRight(valRect.right());
- renderSelectionRect(painter,sr.adjusted(-3,-2,2,3));
+ {
+ QRect sr=option.rect;
+ sr.setWidth(rightPos-sr.x());
+ renderSelectionRect(painter,attrBox_->adjustSelectionRect(sr));
}
if(setClipRect)
{
painter->restore();
}
+
+ return totalWidth;
}
//========================================================
@@ -418,26 +432,28 @@ void NodeViewDelegate::renderMeter(QPainter *painter,QStringList data,const QSty
// "label" name value
//========================================================
-void NodeViewDelegate::renderLabel(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const
+int NodeViewDelegate::renderLabel(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
{
- if(data.count() < 2)
- return;
+ int totalWidth=0;
+
+ if(data.count() < 2)
+ return totalWidth;
QString name=data.at(1) + ":";
QString val;
if(data.count() > 2)
val=data.at(2);
- int frontOffset=8;
int offset=2;
bool selected=option.state & QStyle::State_Selected;
//The border rect (we will adjust its width)
- QRect fillRect=option.rect.adjusted(frontOffset,1,0,-1);
- if(selected)
- fillRect.adjust(0,1,0,-1);
+ QRect contRect=option.rect.adjusted(attrBox_->leftMargin,
+ attrBox_->topMargin+attrBox_->topPadding,0,
+ -attrBox_->bottomMargin-attrBox_->bottomPadding);
+ int currentRight=contRect.x();
int multiCnt=val.count('\n');
QRect nameRect;
@@ -454,51 +470,44 @@ void NodeViewDelegate::renderLabel(QPainter *painter,QStringList data,const QSty
//The text rectangle
QFontMetrics fm(nameFont);
int nameWidth=fm.width(name);
- nameRect = fillRect.adjusted(offset,0,0,0);
+ nameRect = contRect.adjusted(attrBox_->leftPadding,0,0,0);
nameRect.setWidth(nameWidth);
//The value rectangle
fm=QFontMetrics(valFont);
int valWidth=fm.width(val);
valRect = nameRect;
- valRect.setLeft(nameRect.right()+fm.width('A'));
+ valRect.setX(nameRect.x()+nameRect.width()+attrBox_->spacing);
valRect.setWidth(valWidth);
- //Adjust the filled rect width
- fillRect.setRight(valRect.right()+offset);
+ //Adjust the filled rect width
+ currentRight=valRect.x()+valRect.width();
}
else
- {
- QStringList vals=val.split('\n');
- val=vals[0];
- vals.removeFirst();
-
- multiVal=vals.join(QString('\n'));
-
+ {
//The text rectangle
QFontMetrics fm(nameFont);
int nameWidth=fm.width(name);
- nameRect = fillRect.adjusted(offset,0,0,0);
+ nameRect = contRect.adjusted(attrBox_->leftPadding,0,0,0);
nameRect.setWidth(nameWidth);
- nameRect.setHeight(fm.height()+offset);
+ nameRect.setHeight(attrBox_->height-attrBox_->topPadding-attrBox_->bottomPadding);
//The value rectangle
fm=QFontMetrics(valFont);
- int valWidth=fm.width(val);
- valRect = nameRect;
- valRect.setLeft(nameRect.right()+fm.width('A'));
- valRect.setWidth(valWidth);
- nameRect.setHeight(fm.height()+offset);
+ QSize valSize=fm.size(0,val);
//Multiple line
- multiValRect = QRect(nameRect.x(),
- nameRect.bottom()+offset/2,
- fm.width(multiVal),
- fillRect.bottom()-(nameRect.bottom()+offset));
+ valRect = QRect(nameRect.x(),
+ nameRect.y()+nameRect.height()+2,
+ valSize.width(),valSize.height());
+
+ currentRight=valRect.x()+qMax(nameWidth,valSize.width());
}
+
//Define clipping
- int rightPos=fillRect.right()+1;
+ int rightPos=currentRight+attrBox_->rightPadding+attrBox_->rightMargin;
+ totalWidth=rightPos-option.rect.left();
const bool setClipRect = rightPos > option.rect.right();
if(setClipRect)
{
@@ -509,83 +518,144 @@ void NodeViewDelegate::renderLabel(QPainter *painter,QStringList data,const QSty
//Draw name
painter->setPen(Qt::black);
painter->setFont(nameFont);
- painter->drawText(nameRect,Qt::AlignLeft | Qt::AlignVCenter,name);
+ painter->drawText(attrBox_->adjustTextRect(nameRect),Qt::AlignLeft | Qt::AlignVCenter,name);
- //Draw value
- painter->setPen(Qt::black);
- painter->setFont(valFont);
- painter->drawText(valRect,Qt::AlignLeft | Qt::AlignVCenter,val);
+ //Draw value
+ painter->setPen(Qt::black);
+ painter->setFont(valFont);
- if(multiCnt > 0)
- {
- painter->setFont(valFont);
- painter->drawText(multiValRect,Qt::AlignLeft | Qt::AlignTop,multiVal);
- }
+ if(multiCnt ==0 )
+ painter->drawText(attrBox_->adjustTextRect(valRect),Qt::AlignLeft | Qt::AlignVCenter,val);
+ else
+ painter->drawText(valRect,Qt::AlignLeft | Qt::AlignVCenter,val);
if(selected && drawAttrSelectionRect_)
{
- QRect sr=nameRect;
- sr.setRight(valRect.right());
- if(multiCnt > 0)
- {
- sr.setRight(multiValRect.right());
- sr.setBottom(multiValRect.bottom());
- }
-
- renderSelectionRect(painter,sr.adjusted(-3,0,2,0));
+ QRect sr=option.rect;
+ sr.setWidth(rightPos-sr.x());
+ renderSelectionRect(painter,attrBox_->adjustSelectionRect(sr));
}
if(setClipRect)
{
painter->restore();
}
+
+ return totalWidth;
}
+void NodeViewDelegate::labelSize(QStringList data,int& totalWidth,int& totalHeight) const
+{
+ if(data.count() < 2)
+ return;
+
+ QString name=data.at(1) + ":";
+ QString val;
+ if(data.count() > 2)
+ val=data.at(2);
+
+ int currentRight=attrBox_->leftMargin;
+ int currentBottom=attrBox_->topMargin+attrBox_->topPadding;
+
+ int multiCnt=val.count('\n');
+ QFont nameFont=attrFont_;
+ nameFont.setBold(true);
+ QFont valFont=attrFont_;
+
+ if(multiCnt ==0 )
+ {
+ //The text rectangle
+ QFontMetrics fm(nameFont);
+ int nameWidth=fm.width(name);
+ currentRight+=attrBox_->leftPadding+nameWidth;
+ currentBottom+=attrBox_->height-attrBox_->topPadding-attrBox_->bottomPadding;
+
+ //The value rectangle
+ fm=QFontMetrics(valFont);
+ int valWidth=fm.width(val);
+ currentRight+=attrBox_->spacing+valWidth;
+ }
+
+ else
+ {
+ //The text rectangle
+ QFontMetrics fm(nameFont);
+ int nameWidth=fm.width(name);
+ currentRight+=attrBox_->leftPadding+nameWidth;
+ currentBottom+=attrBox_->height-attrBox_->topPadding-attrBox_->bottomPadding;
+
+ //The value rectangle
+ fm=QFontMetrics(valFont);
+ QSize valSize=fm.size(0,val);
+ currentRight+=qMax(nameWidth,valSize.width());
+ currentBottom+=2+valSize.height();
+ }
+
+ totalWidth=currentRight+attrBox_->rightPadding+attrBox_->rightMargin;
+ totalHeight=currentBottom+attrBox_->bottomPadding+attrBox_->bottomMargin;
+}
+
+int NodeViewDelegate::labelHeight(int lineNum) const
+{
+ if(lineNum <=1)
+ return attrBox_->sizeHintCache.height();
+
+ int currentBottom=attrBox_->topMargin+attrBox_->topPadding;
+
+ //text rect
+ currentBottom+=attrBox_->height-attrBox_->topPadding-attrBox_->bottomPadding;
+
+ //value rect
+ QStringList lst;
+ for(int i=0; i < lineNum; i++)
+ lst << "1";
+
+ QFontMetrics fm(attrFont_);
+ QSize valSize=fm.size(0,lst.join(QString('\n')));
+ currentBottom+=2+valSize.height();
+
+ return currentBottom+attrBox_->bottomPadding+attrBox_->bottomMargin;
+}
//========================================================
// data is encoded as a QStringList as follows:
// "event" name value
//========================================================
-void NodeViewDelegate::renderEvent(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const
+int NodeViewDelegate::renderEvent(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
{
- if(data.count() < 2)
- return;
+ int totalWidth=0;
+ if(data.count() < 2)
+ return totalWidth;
QString name=data.at(1);
bool val=false;
if(data.count() > 2) val=(data.at(2) == "1");
- int frontOffset=8;
- int offset=2;
-
bool selected=option.state & QStyle::State_Selected;
+ QFont font=attrFont_;
+ QFontMetrics fm(font);
//The border rect (we will adjust its width)
- QRect fillRect=option.rect.adjusted(frontOffset,1,0,-1);
- if(selected)
- fillRect.adjust(0,1,0,-1);
+ QRect contRect=option.rect.adjusted(attrBox_->leftMargin,attrBox_->topMargin,0,-attrBox_->bottomMargin);
//The control rect
- int ch=(fillRect.height()-4 < 10)?(fillRect.height()-4):8;
- QRect cRect=fillRect.adjusted(offset,(fillRect.height()-ch)/2,
- 0,-(fillRect.height()-ch)/2);
- cRect.setWidth(cRect.height());
+ int ctHeight=static_cast<int>(static_cast<float>(fm.ascent())*0.8);
+ int ctHeightDiff=qMax((contRect.height()-ctHeight)/2,2);
- //The text rectangle
- QFont font=attrFont_;
- QFontMetrics fm(font);
+ QRect ctRect=contRect.adjusted(attrBox_->leftPadding,ctHeightDiff,0,-ctHeightDiff);
+ ctRect.setWidth(ctRect.height());
+
+ //The text rectangle
int nameWidth=fm.width(name);
- QRect nameRect = fillRect.adjusted(offset,0,0,0);
- nameRect.setLeft(cRect.right()+fm.width('a'));
+ QRect nameRect = contRect;
+ nameRect.setX(ctRect.x()+ctRect.width()+attrBox_->spacing);
nameRect.setWidth(nameWidth);
- //Adjust the filled rect width
- fillRect.setRight(nameRect.right()+offset);
-
//Define clipping
- int rightPos=fillRect.right()+1;
- const bool setClipRect = rightPos > option.rect.right();
+ int rightPos=nameRect.x()+nameRect.width()+attrBox_->rightPadding+attrBox_->rightMargin;
+ totalWidth=rightPos-option.rect.left();
+ const bool setClipRect = rightPos > option.rect.right();
if(setClipRect)
{
painter->save();
@@ -595,58 +665,53 @@ void NodeViewDelegate::renderEvent(QPainter *painter,QStringList data,const QSty
//Draw control
painter->setPen(Qt::black);
painter->setBrush((val)?eventFillBrush_:eventBgBrush_);
- painter->drawRect(cRect);
+ painter->drawRect(ctRect);
//Draw name
painter->setPen(Qt::black);
- painter->setFont(font);
- painter->drawText(nameRect,Qt::AlignLeft | Qt::AlignVCenter,name);
+ painter->setFont(font);
+ painter->drawText(attrBox_->adjustTextRect(nameRect),Qt::AlignLeft | Qt::AlignVCenter,name);
if(selected && drawAttrSelectionRect_)
{
- QRect sr=cRect;
- sr.setRight(nameRect.right());
- renderSelectionRect(painter,sr.adjusted(-3,-3,2,4));
+ QRect sr=option.rect;
+ sr.setWidth(rightPos-sr.x());
+ renderSelectionRect(painter,attrBox_->adjustSelectionRect(sr));
}
if(setClipRect)
{
painter->restore();
}
+
+ return totalWidth;
}
-void NodeViewDelegate::renderVar(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const
+int NodeViewDelegate::renderVar(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
{
- QString text;
+ int totalWidth=0;
+ QString text;
if(data.count() >1)
text+=data.at(1) + "=";
if(data.count() > 2)
text+=data.at(2);
- int offset=2;
- int frontOffset=8;
-
bool selected=option.state & QStyle::State_Selected;
- //The border rect (we will adjust its width)
- QRect fillRect=option.rect.adjusted(frontOffset,1,0,-1);
- if(selected)
- fillRect.adjust(0,1,0,-1);
+ //The contents rect (we will adjust its width)
+ QRect contRect=option.rect.adjusted(attrBox_->leftMargin,attrBox_->topMargin,0,-attrBox_->bottomMargin);
//The text rectangle
QFont font=attrFont_;
- //nameFont.setBold(true);
QFontMetrics fm(font);
int textWidth=fm.width(text);
- QRect textRect = fillRect.adjusted(offset,0,0,0);
+ QRect textRect = contRect.adjusted(attrBox_->leftPadding,0,0,0);
textRect.setWidth(textWidth);
- //Adjust the filled rect width
- fillRect.setRight(textRect.right()+offset);
-
//Define clipping
- int rightPos=fillRect.right()+1;
+ int rightPos=textRect.x()+textRect.width()+attrBox_->rightPadding+attrBox_->rightMargin;
+ totalWidth=rightPos-option.rect.left();
const bool setClipRect = rightPos > option.rect.right();
if(setClipRect)
{
@@ -657,52 +722,49 @@ void NodeViewDelegate::renderVar(QPainter *painter,QStringList data,const QStyle
//Draw text
painter->setPen(Qt::black);
painter->setFont(font);
- painter->drawText(textRect,Qt::AlignLeft | Qt::AlignVCenter,text);
+ painter->drawText(attrBox_->adjustTextRect(textRect),Qt::AlignLeft | Qt::AlignVCenter,text);
if(selected && drawAttrSelectionRect_)
{
- QRect sr=textRect;
- renderSelectionRect(painter,sr.adjusted(-3,0,2,0));
+ QRect sr=option.rect;
+ sr.setWidth(rightPos-sr.x());
+ renderSelectionRect(painter,attrBox_->adjustSelectionRect(sr));
}
if(setClipRect)
{
painter->restore();
}
+
+ return totalWidth;
}
-void NodeViewDelegate::renderGenvar(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const
+int NodeViewDelegate::renderGenvar(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
{
- QString text;
+ int totalWidth=0;
+
+ QString text;
if(data.count() >1)
text+=data.at(1) + "=";
if(data.count() > 2)
text+=data.at(2);
- int offset=2;
- int frontOffset=8;
-
bool selected=option.state & QStyle::State_Selected;
- //The border rect (we will adjust its width)
- QRect fillRect=option.rect.adjusted(frontOffset,1,0,-1);
- if(selected)
- fillRect.adjust(0,1,0,-1);
+ //The contents rect (we will adjust its width)
+ QRect contRect=option.rect.adjusted(attrBox_->leftMargin,attrBox_->topMargin,0,-attrBox_->bottomMargin);
//The text rectangle
QFont font=attrFont_;
//nameFont.setBold(true);
QFontMetrics fm(font);
int textWidth=fm.width(text);
- QRect textRect = fillRect.adjusted(offset,0,0,0);
+ QRect textRect = contRect.adjusted(attrBox_->leftPadding,0,0,0);
textRect.setWidth(textWidth);
- //Adjust the filled rect width
- fillRect.setRight(textRect.right()+offset);
-
//Define clipping
- int rightPos=fillRect.right()+1;
+ int rightPos=textRect.x()+textRect.width()+attrBox_->rightPadding+attrBox_->rightMargin;
const bool setClipRect = rightPos > option.rect.right();
if(setClipRect)
{
@@ -713,54 +775,65 @@ void NodeViewDelegate::renderGenvar(QPainter *painter,QStringList data,const QSt
//Draw text
painter->setPen(Qt::blue);
painter->setFont(font);
- painter->drawText(textRect,Qt::AlignLeft | Qt::AlignVCenter,text);
+ painter->drawText(attrBox_->adjustTextRect(textRect),Qt::AlignLeft | Qt::AlignVCenter,text);
if(selected && drawAttrSelectionRect_)
{
- QRect sr=textRect;
- renderSelectionRect(painter,sr.adjusted(-3,0,2,0));
+ QRect sr=option.rect;
+ sr.setWidth(rightPos-sr.x());
+ renderSelectionRect(painter,attrBox_->adjustSelectionRect(sr));
}
if(setClipRect)
{
painter->restore();
- }
+ }
+
+ return totalWidth;
}
-void NodeViewDelegate::renderLimit(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const
+int NodeViewDelegate::renderLimit(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
{
- if(data.count() != 4)
- return;
+ int totalWidth=0;
+ if(data.count() != 4)
+ return totalWidth;
//The data
int val=data.at(2).toInt();
int maxVal=data.at(3).toInt();
QString name=data.at(1) + ":";
QString valStr=QString::number(val) + "/" + QString::number(maxVal);
- bool drawItem=(maxVal < 51);
+ int totalVal=qMax(val,maxVal); //val can be larger than maxVal!!
- QFontMetrics fm(attrFont_);
- int offset=2;
- int frontOffset=8;
+ bool selected=option.state & QStyle::State_Selected;
- int itemOffset=0;
- int gap=fm.width('A');
- int itemSize=limitFillPix_.width();
+ //The contents rect (we will adjust its width)
+ QRect contRect=option.rect.adjusted(attrBox_->leftMargin,attrBox_->topMargin,0,-attrBox_->bottomMargin);
- bool selected=option.state & QStyle::State_Selected;
+ QFontMetrics fm(attrFont_);
+ int itemOffset=0;
+ int itemWidth=0;
+ int itemHeight=0;
- //The border rect (we will adjust its width)
- QRect fillRect=option.rect.adjusted(frontOffset,1,0,-1);
- if(selected)
- fillRect.adjust(0,1,0,-1);
+ if(limitShape_ == RectLimitShape)
+ {
+ itemWidth=fm.width('p')/2;
+ itemOffset=qMax(itemWidth/2,2);
+ itemHeight=static_cast<float>(contRect.height())*0.8;
+ }
+ else
+ {
+ itemWidth=limitFillPix_.width();
+ itemHeight=itemWidth;
+ itemOffset=0;
+ }
//The text rectangle
QFont nameFont=attrFont_;
nameFont.setBold(true);
fm=QFontMetrics(nameFont);
int nameWidth=fm.width(name);
- QRect nameRect = fillRect.adjusted(offset,2,0,-2);
- //nameRect.setLeft(fillRect.left());
+ QRect nameRect = contRect.adjusted(attrBox_->leftPadding,0,0,0);
nameRect.setWidth(nameWidth);
//The value rectangle
@@ -768,113 +841,132 @@ void NodeViewDelegate::renderLimit(QPainter *painter,QStringList data,const QSty
fm=QFontMetrics(valFont);
int valWidth=fm.width(valStr);
QRect valRect = nameRect;
- valRect.setLeft(nameRect.right()+gap);
+ valRect.setX(nameRect.x()+nameRect.width()+attrBox_->spacing);
valRect.setWidth(valWidth);
- int xItem;
- if(drawItem)
- {
- xItem=valRect.right()+gap;
- fillRect.setRight(xItem+maxVal*(itemSize+itemOffset)+itemOffset);
- }
- else
- {
- //Adjust the filled rect width
- fillRect.setRight(valRect.right()+offset);
- }
+ int xItem=valRect.x()+valRect.width()+attrBox_->spacing;
+ int rightPos=xItem+totalVal*(itemWidth+itemOffset)+itemOffset;
+
+ rightPos+=attrBox_->rightPadding + attrBox_->rightMargin;
+ totalWidth=rightPos-option.rect.x();
//Define clipping
- int rightPos=fillRect.right()+1;
const bool setClipRect = rightPos > option.rect.right();
- if(setClipRect || drawItem)
+ if(setClipRect)
{
painter->save();
painter->setClipRect(option.rect);
}
- //Draw name painter->setPen(Qt::black);
+ //Draw name
+ painter->setPen(Qt::black);
painter->setFont(nameFont);
- painter->drawText(nameRect,Qt::AlignLeft | Qt::AlignVCenter,name);
+ painter->drawText(attrBox_->adjustTextRect(nameRect),Qt::AlignLeft | Qt::AlignVCenter,name);
//Draw value
if(val < maxVal)
painter->setPen(Qt::black);
+ else if(val == maxVal)
+ painter->setPen(QColor(14,148,26));
else
painter->setPen(Qt::red);
painter->setFont(valFont);
- painter->drawText(valRect,Qt::AlignLeft | Qt::AlignVCenter,valStr);
+ painter->drawText(attrBox_->adjustTextRect(valRect),Qt::AlignLeft | Qt::AlignVCenter,valStr);
- //Draw items
- if(drawItem)
- {
- int yItem=option.rect.y()+(option.rect.height()-itemSize)/2;
- for(int i=0; i < maxVal; i++)
- {
- if(i >= val)
- {
-
- painter->drawPixmap(xItem,yItem,itemSize,itemSize,limitEmptyPix_);
- }
- else
- {
- painter->drawPixmap(xItem,yItem,itemSize,itemSize,limitFillPix_);
- }
+ //Draw items
+ if(limitShape_ == RectLimitShape)
+ {
+ int yItem=option.rect.y()+(option.rect.height()-itemHeight)/2;
+ painter->setRenderHint(QPainter::Antialiasing,false);
- xItem+=itemOffset+itemSize;
- }
- for(int i=maxVal; i < val; i++)
+ painter->setPen(Qt::NoPen);
+ painter->setBrush(limitFillBrush_);
+
+ for(int i=0; i < totalVal; i++)
{
- painter->drawPixmap(xItem,yItem,itemSize,itemSize,limitExtraFillPix_);
- xItem+=itemOffset+itemSize;
+ QRect r(xItem,yItem,itemWidth,itemHeight);
+
+ if(i == val && i < maxVal)
+ {
+ painter->setPen(QPen(QColor(190,190,190),0));
+ painter->setBrush(Qt::NoBrush);
+ }
+ else if( i == maxVal)
+ painter->setBrush(limitExtraFillBrush_);
+
+ painter->drawRect(r);
+
+ if(i < val)
+ {
+ painter->setPen(painter->brush().color().darker(120));
+ painter->drawLine(xItem,yItem,xItem+itemWidth,yItem);
+ painter->drawLine(xItem,yItem,xItem,yItem+itemHeight);
+
+ painter->setPen(painter->brush().color().darker(170));
+ painter->drawLine(xItem+itemWidth,yItem,xItem+itemWidth,yItem+itemHeight);
+ painter->drawLine(xItem,yItem+itemHeight,xItem+itemWidth,yItem+itemHeight);
+ }
+
+ xItem+=itemOffset+itemWidth;
}
+ }
+ else
+ {
+ int yItem=option.rect.y()+(option.rect.height()-itemHeight)/2;
+ for(int i=0; i < totalVal; i++)
+ {
+ if(i >= maxVal)
+ painter->drawPixmap(xItem,yItem,itemWidth,itemHeight,limitExtraFillPix_);
+ else if(i >= val)
+ painter->drawPixmap(xItem,yItem,itemWidth,itemHeight,limitEmptyPix_);
+ else
+ painter->drawPixmap(xItem,yItem,itemHeight,itemWidth,limitFillPix_);
+
+ xItem+=itemOffset+itemHeight;
+ }
}
if(selected && drawAttrSelectionRect_)
{
- QRect sr=nameRect;
- sr.setRight(valRect.right());
- renderSelectionRect(painter,sr.adjusted(-3,-1,3,1));
+ QRect sr=option.rect;
+ sr.setWidth(rightPos-sr.x());
+ renderSelectionRect(painter,attrBox_->adjustSelectionRect(sr));
}
- if(setClipRect || drawItem)
+ if(setClipRect)
{
painter->restore();
}
+
+ return totalWidth;
}
-void NodeViewDelegate::renderLimiter(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const
+int NodeViewDelegate::renderLimiter(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
{
- if(data.count() != 3)
- return;
+ int totalWidth=0;
+ if(data.count() != 3)
+ return totalWidth;
QString name="inlimit " + data.at(2) +":" +data.at(1);
-
- int offset=2;
- int frontOffset=8;
-
bool selected=option.state & QStyle::State_Selected;
- //The border rect (we will adjust its width)
- QRect fillRect=option.rect.adjusted(frontOffset,1,0,-1);
- if(selected)
- fillRect.adjust(0,1,0,-1);
+ //The contents rect (we will adjust its width)
+ QRect contRect=option.rect.adjusted(attrBox_->leftMargin,attrBox_->topMargin,0,-attrBox_->bottomMargin);
//The text rectangle
QFont nameFont=attrFont_;
//nameFont.setBold(true);
QFontMetrics fm(nameFont);
int nameWidth=fm.width(name);
- QRect nameRect = fillRect.adjusted(offset,0,0,0);
+ QRect nameRect = contRect.adjusted(attrBox_->leftPadding,0,0,0);
nameRect.setWidth(nameWidth);
- //Adjust the filled rect width
- fillRect.setRight(nameRect.right()+offset);
-
//Define clipping
- int rightPos=fillRect.right()+1;
- const bool setClipRect = rightPos > option.rect.right();
+ int rightPos=nameRect.x()+nameRect.width()+attrBox_->rightPadding+attrBox_->rightMargin;
+ totalWidth=rightPos-option.rect.x();
+ const bool setClipRect = rightPos > option.rect.right();
if(setClipRect)
{
painter->save();
@@ -884,52 +976,48 @@ void NodeViewDelegate::renderLimiter(QPainter *painter,QStringList data,const QS
//Draw name
painter->setPen(Qt::black);
painter->setFont(nameFont);
- painter->drawText(nameRect,Qt::AlignLeft | Qt::AlignVCenter,name);
+ painter->drawText(attrBox_->adjustTextRect(nameRect),Qt::AlignLeft | Qt::AlignVCenter,name);
if(selected && drawAttrSelectionRect_)
{
- QRect sr=nameRect;
- renderSelectionRect(painter,sr.adjusted(-3,0,2,0));
+ QRect sr=option.rect;
+ sr.setWidth(rightPos-sr.x());
+ renderSelectionRect(painter,attrBox_->adjustSelectionRect(sr));
}
if(setClipRect)
{
painter->restore();
}
+
+ return totalWidth;
}
-void NodeViewDelegate::renderTrigger(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const
+int NodeViewDelegate::renderTrigger(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
{
- if(data.count() !=3)
- return;
+ int totalWidth=0;
+ if(data.count() !=3)
+ return totalWidth;
int triggerType=data[1].toInt();
-
- QString text=data.at(2);
-
- int offset=2;
- int frontOffset=8;
-
+ QString text=data.at(2);
bool selected=option.state & QStyle::State_Selected;
- //The border rect (we will adjust its width)
- QRect fillRect=option.rect.adjusted(frontOffset,2,0,-2);
- if(selected)
- fillRect.adjust(0,1,0,-1);
+ //The contents rect (we will adjust its width)
+ QRect contRect=option.rect.adjusted(attrBox_->leftMargin,attrBox_->topMargin,
+ 0,-attrBox_->bottomMargin);
//The text rectangle
QFont font=attrFont_;
QFontMetrics fm(font);
- int textWidth=fm.width(text);
- QRect textRect = fillRect.adjusted(offset,0,0,0);
+ int textWidth=fm.width(text)+4;
+ QRect textRect = contRect.adjusted(attrBox_->leftPadding,0,0,0);
textRect.setWidth(textWidth);
- //Adjust the filled rect width
- fillRect.setRight(textRect.right()+offset);
-
//Define clipping
- int rightPos=fillRect.right()+1;
- const bool setClipRect = rightPos > option.rect.right();
+ int rightPos=textRect.x()+textRect.width()+attrBox_->rightPadding+attrBox_->rightMargin;
+ totalWidth=rightPos-option.rect.x();
+ const bool setClipRect = rightPos > option.rect.right();
if(setClipRect)
{
painter->save();
@@ -937,62 +1025,71 @@ void NodeViewDelegate::renderTrigger(QPainter *painter,QStringList data,const QS
}
//draw rect
- painter->setBrush(QColor(230,230,230));
- painter->setPen(QColor(150,150,150));
- painter->drawRect(fillRect);
+ if(triggerType==0)
+ {
+ painter->setBrush(triggerBgBrush_);
+ painter->setPen(triggerBorderPen_);
+ }
+ else
+ {
+ painter->setBrush(completeBgBrush_);
+ painter->setPen(completeBorderPen_);
+ }
+
+ //QRect borderRect=option.rect;
+ //borderRect.setWidth(rightPos-borderRect.x());
+ painter->drawRect(attrBox_->adjustTextBgRect(textRect));
//Draw text
if(triggerType==0)
- painter->setPen(Qt::black);
+ painter->setPen(triggerFontPen_);
else
- painter->setPen(Qt::blue);
+ painter->setPen(completeFontPen_);
painter->setFont(font);
- painter->drawText(textRect,Qt::AlignLeft | Qt::AlignVCenter,text);
+ painter->drawText(attrBox_->adjustTextRect(textRect),Qt::AlignHCenter | Qt::AlignVCenter,text);
if(selected && drawAttrSelectionRect_)
{
- QRect sr=textRect;
- renderSelectionRect(painter,sr.adjusted(-3,0,2,0));
+ QRect sr=option.rect;
+ sr.setX(textRect.x());
+ sr.setWidth(textRect.width());
+ //sr.setWidth(rightPos-sr.x());
+ renderSelectionRect(painter,attrBox_->adjustSelectionRectNonOpt(sr));
}
if(setClipRect)
{
painter->restore();
}
+
+ return totalWidth;
}
-void NodeViewDelegate::renderTime(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const
+int NodeViewDelegate::renderTime(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
{
- if(data.count() != 2)
- return;
+ int totalWidth=0;
+ if(data.count() != 2)
+ return totalWidth;
QString name=data.at(1);
-
- int offset=2;
- int frontOffset=8;
-
bool selected=option.state & QStyle::State_Selected;
- //The border rect (we will adjust its width)
- QRect fillRect=option.rect.adjusted(frontOffset,1,0,-1);
- if(selected)
- fillRect.adjust(0,1,0,-1);
+ //The contents rect (we will adjust its width)
+ QRect contRect=option.rect.adjusted(attrBox_->leftMargin,attrBox_->topMargin,0,-attrBox_->bottomMargin);
//The text rectangle
QFont nameFont=attrFont_;
//nameFont.setBold(true);
QFontMetrics fm(nameFont);
int nameWidth=fm.width(name);
- QRect nameRect = fillRect.adjusted(offset,0,0,0);
+ QRect nameRect = contRect.adjusted(attrBox_->leftPadding,0,0,0);
nameRect.setWidth(nameWidth);
- //Adjust the filled rect width
- fillRect.setRight(nameRect.right()+offset);
-
//Define clipping
- int rightPos=fillRect.right()+1;
- const bool setClipRect = rightPos > option.rect.right();
+ int rightPos=nameRect.x()+nameRect.width()+attrBox_->rightPadding+attrBox_->rightMargin;
+ totalWidth=rightPos-option.rect.x();
+ const bool setClipRect = rightPos > option.rect.right();
if(setClipRect)
{
painter->save();
@@ -1002,51 +1099,47 @@ void NodeViewDelegate::renderTime(QPainter *painter,QStringList data,const QStyl
//Draw name
painter->setPen(Qt::black);
painter->setFont(nameFont);
- painter->drawText(nameRect,Qt::AlignLeft | Qt::AlignVCenter,name);
+ painter->drawText(attrBox_->adjustTextRect(nameRect),Qt::AlignLeft | Qt::AlignVCenter,name);
if(selected && drawAttrSelectionRect_)
{
- QRect sr=nameRect;
- renderSelectionRect(painter,sr.adjusted(-3,0,2,0));
+ QRect sr=option.rect;
+ sr.setWidth(rightPos-sr.x());
+ renderSelectionRect(painter,attrBox_->adjustSelectionRect(sr));
}
if(setClipRect)
{
painter->restore();
}
+
+ return totalWidth;
}
-void NodeViewDelegate::renderDate(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const
+int NodeViewDelegate::renderDate(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
{
- if(data.count() != 2)
- return;
+ int totalWidth=0;
+ if(data.count() != 2)
+ return totalWidth;
QString name=data.at(1);
-
- int offset=2;
- int frontOffset=8;
-
bool selected=option.state & QStyle::State_Selected;
- //The border rect (we will adjust its width)
- QRect fillRect=option.rect.adjusted(frontOffset,1,0,-1);
- if(option.state & QStyle::State_Selected)
- fillRect.adjust(0,1,0,-1);
+ //The contents rect (we will adjust its width)
+ QRect contRect=option.rect.adjusted(attrBox_->leftMargin,attrBox_->topMargin,0,-attrBox_->bottomMargin);
//The text rectangle
QFont nameFont=attrFont_;
//nameFont.setBold(true);
QFontMetrics fm(nameFont);
int nameWidth=fm.width(name);
- QRect nameRect = fillRect.adjusted(offset,0,0,0);
+ QRect nameRect = contRect.adjusted(attrBox_->leftPadding,0,0,0);
nameRect.setWidth(nameWidth);
- //Adjust the filled rect width
- fillRect.setRight(nameRect.right()+offset);
-
//Define clipping
- int rightPos=fillRect.right()+1;
- const bool setClipRect = rightPos > option.rect.right();
+ int rightPos=nameRect.x()+nameRect.width()+attrBox_->rightPadding+attrBox_->rightMargin;
+ totalWidth=rightPos-option.rect.x();
+ const bool setClipRect = rightPos > option.rect.right();
if(setClipRect)
{
painter->save();
@@ -1056,18 +1149,21 @@ void NodeViewDelegate::renderDate(QPainter *painter,QStringList data,const QStyl
//Draw name
painter->setPen(Qt::black);
painter->setFont(nameFont);
- painter->drawText(nameRect,Qt::AlignLeft | Qt::AlignVCenter,name);
+ painter->drawText(attrBox_->adjustTextRect(nameRect),Qt::AlignLeft | Qt::AlignVCenter,name);
if(selected && drawAttrSelectionRect_)
{
- QRect sr=nameRect;
- renderSelectionRect(painter,sr.adjusted(-3,0,2,0));
+ QRect sr=option.rect;
+ sr.setWidth(rightPos-sr.x());
+ renderSelectionRect(painter,attrBox_->adjustSelectionRect(sr));
}
if(setClipRect)
{
painter->restore();
}
+
+ return totalWidth;
}
//========================================================
@@ -1075,10 +1171,11 @@ void NodeViewDelegate::renderDate(QPainter *painter,QStringList data,const QStyl
// "repeat" name value
//========================================================
-void NodeViewDelegate::renderRepeat(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const
+int NodeViewDelegate::renderRepeat(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
{
+ int totalWidth=0;
if(data.count() != 7)
- return;
+ return totalWidth;
QString type=data.at(1);
QString name=data.at(2);
@@ -1087,15 +1184,10 @@ void NodeViewDelegate::renderRepeat(QPainter *painter,QStringList data,const QSt
QString end=data.at(5);
QString step=data.at(6);
- int offset=2;
- int frontOffset=8;
-
bool selected=option.state & QStyle::State_Selected;
- //The border rect (we will adjust its width)
- QRect fillRect=option.rect.adjusted(frontOffset,1,0,-1);
- if(selected)
- fillRect.adjust(0,1,0,-1);
+ //The contents rect (we will adjust its width)
+ QRect contRect=option.rect.adjusted(attrBox_->leftMargin,attrBox_->topMargin,0,-attrBox_->bottomMargin);
if(type == "day")
{
@@ -1103,11 +1195,12 @@ void NodeViewDelegate::renderRepeat(QPainter *painter,QStringList data,const QSt
QFontMetrics fm(nameFont);
name="day=" + step;
int nameWidth=fm.width(name);
- QRect nameRect = fillRect.adjusted(offset,0,0,0);
+ QRect nameRect = contRect.adjusted(attrBox_->leftPadding,0,0,0);
nameRect.setWidth(nameWidth);
//Define clipping
- int rightPos=fillRect.right()+1;
+ int rightPos=nameRect.x()+nameRect.width()+attrBox_->rightPadding+attrBox_->rightMargin;
+ totalWidth=rightPos-option.rect.x();
const bool setClipRect = rightPos > option.rect.right();
if(setClipRect)
{
@@ -1118,12 +1211,13 @@ void NodeViewDelegate::renderRepeat(QPainter *painter,QStringList data,const QSt
//Draw name
painter->setPen(Qt::black);
painter->setFont(nameFont);
- painter->drawText(nameRect,Qt::AlignLeft | Qt::AlignVCenter,name);
+ painter->drawText(attrBox_->adjustTextRect(nameRect),Qt::AlignLeft | Qt::AlignVCenter,name);
if(selected && drawAttrSelectionRect_)
{
- QRect sr=nameRect;
- renderSelectionRect(painter,sr.adjusted(-3,0,2,0));
+ QRect sr=option.rect;
+ sr.setWidth(rightPos-sr.x());
+ renderSelectionRect(painter,attrBox_->adjustSelectionRect(sr));
}
if(setClipRect)
@@ -1154,7 +1248,7 @@ void NodeViewDelegate::renderRepeat(QPainter *painter,QStringList data,const QSt
QFont nameFont=attrFont_;
QFontMetrics fm(nameFont);
int nameWidth=fm.width(name);
- QRect nameRect = fillRect.adjusted(offset,0,0,0);
+ QRect nameRect = contRect.adjusted(attrBox_->leftPadding,0,0,0);
nameRect.setWidth(nameWidth);
//The value rectangle
@@ -1164,14 +1258,13 @@ void NodeViewDelegate::renderRepeat(QPainter *painter,QStringList data,const QSt
int valWidth=fm.width(val);
QRect valRect = nameRect;
if(name.endsWith("..."))
- valRect.setLeft(nameRect.right() + fm.width('A')/2);
+ valRect.setX(nameRect.x()+nameRect.width() + fm.width('A')/2);
else
- valRect.setLeft(nameRect.right() + fm.width(' ')/2);
+ valRect.setX(nameRect.x()+nameRect.width() + fm.width(' ')/2);
valRect.setWidth(valWidth);
- //Adjust the filled rect width
- fillRect.setRight(valRect.right()+offset);
+ int rightPos=valRect.x()+valRect.width();
//End ...
QRect dotRect;
@@ -1180,15 +1273,14 @@ void NodeViewDelegate::renderRepeat(QPainter *painter,QStringList data,const QSt
fm=QFontMetrics(nameFont);
int dotWidth=fm.width("...");
dotRect = valRect;
- dotRect.setLeft(valRect.right()+fm.width('A')/2);
+ dotRect.setX(rightPos+fm.width('A')/2);
dotRect.setWidth(dotWidth);
-
- //Adjust the filled rect width
- fillRect.setRight(dotRect.right()+offset);
+ rightPos=dotRect.x()+dotRect.width();
}
//Define clipping
- int rightPos=fillRect.right()+1;
+ rightPos+=+attrBox_->rightPadding+attrBox_->rightMargin;
+ totalWidth=rightPos-option.rect.x();
const bool setClipRect = rightPos > option.rect.right();
if(setClipRect)
{
@@ -1199,29 +1291,26 @@ void NodeViewDelegate::renderRepeat(QPainter *painter,QStringList data,const QSt
//Draw name
painter->setPen(Qt::black);
painter->setFont(nameFont);
- painter->drawText(nameRect,Qt::AlignLeft | Qt::AlignVCenter,name);
+ painter->drawText(attrBox_->adjustTextRect(nameRect),Qt::AlignLeft | Qt::AlignVCenter,name);
//Draw value
painter->setPen(Qt::black);
painter->setFont(valFont);
- painter->drawText(valRect,Qt::AlignLeft | Qt::AlignVCenter,val);
+ painter->drawText(attrBox_->adjustTextRect(valRect),Qt::AlignLeft | Qt::AlignVCenter,val);
//Draw end dots
if(!endDot.isEmpty())
{
painter->setPen(Qt::black);
painter->setFont(nameFont);
- painter->drawText(dotRect,Qt::AlignLeft | Qt::AlignVCenter,"...");
+ painter->drawText(attrBox_->adjustTextRect(dotRect),Qt::AlignLeft | Qt::AlignVCenter,"...");
}
if(selected && drawAttrSelectionRect_)
{
- QRect sr=nameRect;
- sr.setRight(valRect.right());
- if(!endDot.isEmpty())
- sr.setRight(dotRect.right());
-
- renderSelectionRect(painter,sr.adjusted(-2,0,2,0));
+ QRect sr=option.rect;
+ sr.setWidth(rightPos-sr.x());
+ renderSelectionRect(painter,attrBox_->adjustSelectionRect(sr));
}
if(setClipRect)
@@ -1229,38 +1318,33 @@ void NodeViewDelegate::renderRepeat(QPainter *painter,QStringList data,const QSt
painter->restore();
}
}
+
+ return totalWidth;
}
-void NodeViewDelegate::renderLate(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const
+int NodeViewDelegate::renderLate(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
{
+ int totalWidth=0;
if(data.count() != 2)
- return;
+ return totalWidth;
QString name="late: " + data.at(1);
-
- int offset=2;
- int frontOffset=8;
-
bool selected=option.state & QStyle::State_Selected;
//The border rect (we will adjust its width)
- QRect fillRect=option.rect.adjusted(frontOffset,1,0,-1);
- if(selected)
- fillRect.adjust(0,1,0,-1);
+ QRect contRect=option.rect.adjusted(attrBox_->leftMargin,attrBox_->topMargin,0,-attrBox_->bottomMargin);
//The text rectangle
QFont nameFont=attrFont_;
QFontMetrics fm(nameFont);
int nameWidth=fm.width(name);
- QRect nameRect = fillRect.adjusted(offset,0,0,0);
+ QRect nameRect = contRect.adjusted(attrBox_->leftPadding,0,0,0);
nameRect.setWidth(nameWidth);
- //Adjust the filled rect width
- fillRect.setRight(nameRect.right()+offset);
-
//Define clipping
- int rightPos=fillRect.right()+1;
- const bool setClipRect = rightPos > option.rect.right();
+ int rightPos=nameRect.x()+nameRect.width()+attrBox_->rightPadding+attrBox_->rightMargin;
+ totalWidth=rightPos-option.rect.x();
+ const bool setClipRect = rightPos > option.rect.right();
if(setClipRect)
{
painter->save();
@@ -1270,16 +1354,19 @@ void NodeViewDelegate::renderLate(QPainter *painter,QStringList data,const QStyl
//Draw name
painter->setPen(Qt::black);
painter->setFont(nameFont);
- painter->drawText(nameRect,Qt::AlignLeft | Qt::AlignVCenter,name);
+ painter->drawText(attrBox_->adjustTextRect(nameRect),Qt::AlignLeft | Qt::AlignVCenter,name);
if(selected && drawAttrSelectionRect_)
{
- QRect sr=nameRect;
- renderSelectionRect(painter,sr.adjusted(-3,0,2,0));
+ QRect sr=option.rect;
+ sr.setWidth(rightPos-sr.x());
+ renderSelectionRect(painter,attrBox_->adjustSelectionRect(sr));
}
if(setClipRect)
{
painter->restore();
}
+
+ return totalWidth;
}
diff --git a/Viewer/src/NodeViewDelegate.hpp b/Viewer/src/NodeViewDelegate.hpp
index 6271404..539136b 100644
--- a/Viewer/src/NodeViewDelegate.hpp
+++ b/Viewer/src/NodeViewDelegate.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -17,24 +17,106 @@
#include <QPen>
#include <QStyledItemDelegate>
+#include "FontMetrics.hpp"
+#include "RectMetrics.hpp"
#include "VProperty.hpp"
#include <string>
class PropertyMapper;
+//Base class for the node/attr renderer properties
+struct BaseNodeDelegateBox
+{
+ BaseNodeDelegateBox() : fontHeight(10), height(10), fullHeight(10), topMargin(0), bottomMargin(0),
+ leftMargin(0), rightMargin(0), topPadding(0), bottomPadding(0),
+ leftPadding(0), rightPadding(0), sizeHintCache(QSize(10,10)), spacing(2), selectRm(2) {}
+
+ virtual void adjust(const QFont& f)=0;
+ virtual QRect adjustTextRect(const QRect& rIn) const { QRect r=rIn; return r;}
+ virtual QRect adjustTextBgRect(const QRect& rIn) const { QRect r=rIn; return r;}
+ virtual QRect adjustSelectionRect(const QRect& optRect) const {
+ QRect r=optRect;
+ r.adjust(leftMargin,1,-1,-1);
+ return r;
+ }
+ virtual QRect adjustSelectionRectNonOpt(const QRect& optRect) const {
+ QRect r=optRect;
+ r.adjust(0,1,-1,-1);
+ return r;
+ }
+
+ int fontHeight;
+ int height;
+ int fullHeight;
+ int topMargin;
+ int bottomMargin;
+ int leftMargin;
+ int rightMargin;
+ int topPadding;
+ int bottomPadding;
+ int leftPadding;
+ int rightPadding;
+ QSize sizeHintCache;
+ int spacing;
+ RectMetrics selectRm;
+};
+
+//Node renderer properties
+struct NodeDelegateBox : public BaseNodeDelegateBox
+{
+ NodeDelegateBox() : iconSize(16), iconPreGap(2),
+ iconGap(2) {}
+
+ int iconSize;
+ int iconPreGap;
+ int iconGap;
+
+ void adjust(const QFont& f) {
+ QFontMetrics fm(f);
+ fontHeight=fm.height();
+ height=fontHeight+topPadding+bottomPadding;
+ fullHeight=height+topMargin+bottomMargin;
+ sizeHintCache=QSize(100,fullHeight);
+ spacing=fm.width('A')*3/4;
+
+ int h=static_cast<int>(static_cast<float>(fm.height())*0.7);
+ iconSize=h;
+ if(iconSize % 2 == 1)
+ iconSize+=1;
+
+ iconGap=1;
+ if(iconSize > 16)
+ iconGap=2;
+
+ iconPreGap=fm.width('A')/2;
+ }
+};
+
+//Attr renderer properties
+struct AttrDelegateBox : public BaseNodeDelegateBox
+{
+ AttrDelegateBox() {}
+
+ void adjust(const QFont& f) {
+ QFontMetrics fm(f);
+ fontHeight=fm.height();
+ height=fontHeight+topPadding+bottomPadding;
+ fullHeight=height+topMargin+bottomMargin;
+ sizeHintCache=QSize(100,fullHeight);
+ spacing=fm.width('A')*3/4;
+ }
+};
+
class NodeViewDelegate : public QStyledItemDelegate, public VPropertyObserver
{
public:
explicit NodeViewDelegate(QWidget *parent=0);
~NodeViewDelegate();
- QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index ) const;
-
void notifyChange(VProperty*);
protected:
- void adjustIconSize();
virtual void updateSettings()=0;
void addBaseSettings(std::vector<std::string>&);
void updateBaseSettings();
@@ -42,22 +124,25 @@ protected:
void renderSelectionRect(QPainter* painter,QRect r) const;
virtual void renderStatus(QPainter *painter,const QModelIndex& index,
- const QStyleOptionViewItemV4& option) const;
-
- typedef void (NodeViewDelegate::*AttributeRendererProc)(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const;
-
- virtual void renderMeter(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const;
- virtual void renderLabel(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const;
- virtual void renderEvent(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const;
- virtual void renderVar(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const;
- virtual void renderGenvar(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const;
- virtual void renderLimit(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const;
- virtual void renderLimiter(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const;
- virtual void renderTrigger(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const;
- virtual void renderTime(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const;
- virtual void renderDate(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const;
- virtual void renderRepeat(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const;
- virtual void renderLate(QPainter *painter,QStringList data,const QStyleOptionViewItemV4& option) const;
+ const QStyleOptionViewItem& option) const;
+
+ typedef int (NodeViewDelegate::*AttributeRendererProc)(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
+
+ virtual int renderMeter(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
+ virtual int renderLabel(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
+ virtual int renderEvent(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
+ virtual int renderVar(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
+ virtual int renderGenvar(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
+ virtual int renderLimit(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
+ virtual int renderLimiter(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
+ virtual int renderTrigger(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
+ virtual int renderTime(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
+ virtual int renderDate(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
+ virtual int renderRepeat(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
+ virtual int renderLate(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
+
+ void labelSize(QStringList data,int& totalWidth,int& totalHeight) const;
+ int labelHeight(int) const;
QPen hoverPen_;
QBrush hoverBrush_;
@@ -74,23 +159,31 @@ protected:
PropertyMapper* prop_;
QFont font_;
- QFont attrFont_;
- int iconSize_;
- int iconGap_;
+ QFont attrFont_;
+ NodeDelegateBox* nodeBox_;
+ AttrDelegateBox* attrBox_;
bool useStateGrad_;
mutable QLinearGradient grad_;
static int lighter_;
bool drawAttrSelectionRect_;
- QBrush eventFillBrush_;
- QBrush eventBgBrush_;
- QBrush meterFillBrush_;
- QBrush meterThresholdBrush_;
- QBrush limitFillBrush_;
- QBrush limitExtraFillBrush_;
+ QBrush eventFillBrush_;
+ QBrush eventBgBrush_;
+ QBrush meterFillBrush_;
+ QBrush meterThresholdBrush_;
+ QBrush limitFillBrush_;
+ QBrush limitExtraFillBrush_;
QPixmap limitFillPix_;
QPixmap limitEmptyPix_;
QPixmap limitExtraFillPix_;
+ enum LimitShape {RectLimitShape,CircleLimitShape};
+ LimitShape limitShape_;
+ QBrush triggerBgBrush_;
+ QPen triggerBorderPen_;
+ QPen triggerFontPen_;
+ QBrush completeBgBrush_;
+ QPen completeBorderPen_;
+ QPen completeFontPen_;
};
#endif
diff --git a/Viewer/src/NodeWidget.cpp b/Viewer/src/NodeWidget.cpp
index cc6deb2..86d516a 100644
--- a/Viewer/src/NodeWidget.cpp
+++ b/Viewer/src/NodeWidget.cpp
@@ -1,6 +1,6 @@
/***************************** LICENSE START ***********************************
- Copyright 2015 ECMWF and INPE. This software is distributed under the terms
+ Copyright 2009-2017 ECMWF and INPE. This software is distributed under the terms
of the Apache License version 2.0. In applying this license, ECMWF does not
waive the privileges and immunities granted to it by virtue of its status as
an Intergovernmental Organization or submit itself to any jurisdiction.
diff --git a/Viewer/src/NodeWidget.hpp b/Viewer/src/NodeWidget.hpp
index b5303b0..9052b8e 100644
--- a/Viewer/src/NodeWidget.hpp
+++ b/Viewer/src/NodeWidget.hpp
@@ -1,6 +1,6 @@
/***************************** LICENSE START ***********************************
- Copyright 2015 ECMWF and INPE. This software is distributed under the terms
+ Copyright 2009-2017 ECMWF and INPE. This software is distributed under the terms
of the Apache License version 2.0. In applying this license, ECMWF does not
waive the privileges and immunities granted to it by virtue of its status as
an Intergovernmental Organization or submit itself to any jurisdiction.
diff --git a/Viewer/src/OneLineTextEdit.cpp b/Viewer/src/OneLineTextEdit.cpp
index 195b0ac..d020891 100644
--- a/Viewer/src/OneLineTextEdit.cpp
+++ b/Viewer/src/OneLineTextEdit.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/OneLineTextEdit.hpp b/Viewer/src/OneLineTextEdit.hpp
index 561cd96..8914a75 100644
--- a/Viewer/src/OneLineTextEdit.hpp
+++ b/Viewer/src/OneLineTextEdit.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/OutputBrowser.cpp b/Viewer/src/OutputBrowser.cpp
index ef5b54b..78a0712 100644
--- a/Viewer/src/OutputBrowser.cpp
+++ b/Viewer/src/OutputBrowser.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -50,6 +50,7 @@ OutputBrowser::OutputBrowser(QWidget* parent) :
textEdit_=new PlainTextEdit(this);
textEdit_->setReadOnly(true);
textEdit_->setWordWrapMode(QTextOption::NoWrap);
+ textEdit_->setShowLineNumbers(false);
textEditSearchInterface_=new PlainTextSearchInterface();
textEditSearchInterface_->setEditor(textEdit_);
@@ -60,6 +61,8 @@ OutputBrowser::OutputBrowser(QWidget* parent) :
//Pager for very large files
textPager_=new TextPagerWidget(this);
+ textPager_->textEditor()->setShowLineNumbers(false);
+
//textEdit_->setReadOnly(true);
textPagerSearchInterface_=new TextPagerSearchInterface();
diff --git a/Viewer/src/OutputBrowser.hpp b/Viewer/src/OutputBrowser.hpp
index 29ba013..68e70f6 100644
--- a/Viewer/src/OutputBrowser.hpp
+++ b/Viewer/src/OutputBrowser.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/OutputCache.cpp b/Viewer/src/OutputCache.cpp
index 1f2a0e9..b5e10cb 100644
--- a/Viewer/src/OutputCache.cpp
+++ b/Viewer/src/OutputCache.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/OutputCache.hpp b/Viewer/src/OutputCache.hpp
index 8f3028b..ffebb30 100644
--- a/Viewer/src/OutputCache.hpp
+++ b/Viewer/src/OutputCache.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/OutputClient.cpp b/Viewer/src/OutputClient.cpp
index a31af76..760457d 100644
--- a/Viewer/src/OutputClient.cpp
+++ b/Viewer/src/OutputClient.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/OutputClient.hpp b/Viewer/src/OutputClient.hpp
index 0e22605..960c9f7 100644
--- a/Viewer/src/OutputClient.hpp
+++ b/Viewer/src/OutputClient.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/OutputDirClient.cpp b/Viewer/src/OutputDirClient.cpp
index 91f83e7..edba51b 100644
--- a/Viewer/src/OutputDirClient.cpp
+++ b/Viewer/src/OutputDirClient.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -10,8 +10,6 @@
#include "OutputDirClient.hpp"
-#include <QDebug>
-
#include "UiLog.hpp"
#include <boost/filesystem/operations.hpp>
@@ -64,8 +62,7 @@ void OutputDirClient::slotError(QAbstractSocket::SocketError err)
#ifdef _UI_OUTPUTDIRCLIENT_DEBUG
UiLog().dbg() << " RemoteHostClosedError ";
-#endif
- //qDebug() << "remote host closed";
+#endif
//If no data was transferred we think it is a real error.
if(data_.isEmpty())
{
diff --git a/Viewer/src/OutputDirClient.hpp b/Viewer/src/OutputDirClient.hpp
index 53af825..f9f4a65 100644
--- a/Viewer/src/OutputDirClient.hpp
+++ b/Viewer/src/OutputDirClient.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/OutputDirProvider.cpp b/Viewer/src/OutputDirProvider.cpp
index 4208e30..d2701ef 100644
--- a/Viewer/src/OutputDirProvider.cpp
+++ b/Viewer/src/OutputDirProvider.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -10,7 +10,6 @@
#include "OutputDirProvider.hpp"
-#include "LogServer.hpp"
#include "OutputDirClient.hpp"
#include "VNode.hpp"
#include "VReply.hpp"
@@ -46,6 +45,7 @@ void OutputDirProvider::visit(VInfoNode* info)
if(!info)
{
owner_->infoFailed(reply_);
+ return;
}
ServerHandler* server=info_->server();
@@ -54,6 +54,7 @@ void OutputDirProvider::visit(VInfoNode* info)
if(!n || !n->node())
{
owner_->infoFailed(reply_);
+ return;
}
fetchDir(server,n);
@@ -67,8 +68,16 @@ void OutputDirProvider::fetchDir(ServerHandler* server,VNode* n)
{
reply_->setDirectory(dir);
owner_->infoFailed(reply_);
+ return;
}
+ if(!n)
+ {
+ reply_->setDirectory(dir);
+ owner_->infoFailed(reply_);
+ return;
+ }
+
//Get the jobout name
std::string fileName=n->findVariable("ECF_JOBOUT",true);
@@ -80,7 +89,6 @@ void OutputDirProvider::fetchDir(ServerHandler* server,VNode* n)
{
reply_->setDirectory(dir);
owner_->infoFailed(reply_);
-
return;
}
diff --git a/Viewer/src/OutputDirProvider.hpp b/Viewer/src/OutputDirProvider.hpp
index 1ca4b14..5d9243b 100644
--- a/Viewer/src/OutputDirProvider.hpp
+++ b/Viewer/src/OutputDirProvider.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/OutputFetchInfo.cpp b/Viewer/src/OutputFetchInfo.cpp
index e023a50..0fd180b 100644
--- a/Viewer/src/OutputFetchInfo.cpp
+++ b/Viewer/src/OutputFetchInfo.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/OutputFetchInfo.hpp b/Viewer/src/OutputFetchInfo.hpp
index 16885c7..bf08041 100644
--- a/Viewer/src/OutputFetchInfo.hpp
+++ b/Viewer/src/OutputFetchInfo.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/OutputFileClient.cpp b/Viewer/src/OutputFileClient.cpp
index b2f768a..3b2b61f 100644
--- a/Viewer/src/OutputFileClient.cpp
+++ b/Viewer/src/OutputFileClient.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/OutputFileClient.hpp b/Viewer/src/OutputFileClient.hpp
index 5cb3edd..82a1a2d 100644
--- a/Viewer/src/OutputFileClient.hpp
+++ b/Viewer/src/OutputFileClient.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/OutputFileProvider.cpp b/Viewer/src/OutputFileProvider.cpp
index 002cd31..3905e11 100644
--- a/Viewer/src/OutputFileProvider.cpp
+++ b/Viewer/src/OutputFileProvider.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -9,7 +9,6 @@
#include "OutputFileProvider.hpp"
-#include "LogServer.hpp"
#include "OutputFileClient.hpp"
#include "VNode.hpp"
#include "VReply.hpp"
diff --git a/Viewer/src/OutputFileProvider.hpp b/Viewer/src/OutputFileProvider.hpp
index efcd45d..948b0a7 100644
--- a/Viewer/src/OutputFileProvider.hpp
+++ b/Viewer/src/OutputFileProvider.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/OutputItemWidget.cpp b/Viewer/src/OutputItemWidget.cpp
index ab73bcd..011a8e1 100644
--- a/Viewer/src/OutputItemWidget.cpp
+++ b/Viewer/src/OutputItemWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -445,7 +445,7 @@ void OutputItemWidget::infoFailed(VReply* reply)
QColor col(70,71,72);
QString s="<b><font color=\'" + col.name() + "\'>Output directory</font></b>: ";
- const std::vector<std::string> et=reply->errorTextVec();
+ const std::vector<std::string>& et=reply->errorTextVec();
if(et.size() > 1)
{
for(size_t i=0; i < et.size(); i++)
diff --git a/Viewer/src/OutputItemWidget.hpp b/Viewer/src/OutputItemWidget.hpp
index 7179161..d483dc4 100644
--- a/Viewer/src/OutputItemWidget.hpp
+++ b/Viewer/src/OutputItemWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/OutputModel.cpp b/Viewer/src/OutputModel.cpp
index e7933ff..53bd2a4 100644
--- a/Viewer/src/OutputModel.cpp
+++ b/Viewer/src/OutputModel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -38,7 +38,7 @@ void OutputModel::setData(VDir_ptr dir,const std::string& jobout)
if(dir_)
{
- for(int i; i < dir_->count(); i++)
+ for(int i=0; i < dir_->count(); i++)
{
if(dir_->fullName(i) == jobout)
{
diff --git a/Viewer/src/OverviewItemWidget.cpp b/Viewer/src/OverviewItemWidget.cpp
index 1008a4c..539f47c 100644
--- a/Viewer/src/OverviewItemWidget.cpp
+++ b/Viewer/src/OverviewItemWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -63,6 +63,7 @@ void OverviewItemWidget::reload(VInfo_ptr info)
//Info must be a node
if(info_)
{
+ reloadTb_->setEnabled(false);
infoProvider_->info(info_);
}
}
@@ -73,6 +74,7 @@ void OverviewItemWidget::reload()
lastScrollPos_=textEdit_->verticalScrollBar()->value();
textEdit_->clear();
+ reloadTb_->setEnabled(false);
infoProvider_->info(info_);
}
@@ -80,6 +82,7 @@ void OverviewItemWidget::clearContents()
{
InfoPanelItem::clear();
textEdit_->clear();
+ reloadTb_->setEnabled(true);
}
void OverviewItemWidget::infoReady(VReply* reply)
@@ -89,6 +92,8 @@ void OverviewItemWidget::infoReady(VReply* reply)
//Restore the vertical scrollbar pos
textEdit_->verticalScrollBar()->setValue(lastScrollPos_);
+
+ reloadTb_->setEnabled(true);
}
void OverviewItemWidget::infoProgress(VReply* reply)
@@ -101,6 +106,8 @@ void OverviewItemWidget::infoFailed(VReply* reply)
{
QString s=QString::fromStdString(reply->errorText());
textEdit_->setPlainText(s);
+
+ reloadTb_->setEnabled(true);
}
//At this point we can be sure that the node is handled by this item.
@@ -143,4 +150,34 @@ void OverviewItemWidget::connectStateChanged()
reload();
}
+
+void OverviewItemWidget::reloadRequested()
+{
+ reload();
+}
+
+void OverviewItemWidget::updateState(const FlagSet<ChangeFlag>& flags)
+{
+ if(flags.isSet(SuspendedChanged))
+ {
+ //Suspend
+ if(suspended_)
+ {
+ reloadTb_->setEnabled(false);
+ }
+ //Resume
+ else
+ {
+ if(info_ && info_->node())
+ {
+ reloadTb_->setEnabled(true);
+ }
+ else
+ {
+ clearContents();
+ }
+ }
+ }
+}
+
static InfoPanelItemMaker<OverviewItemWidget> maker1("overview");
diff --git a/Viewer/src/OverviewItemWidget.hpp b/Viewer/src/OverviewItemWidget.hpp
index 668ec59..d8776ce 100644
--- a/Viewer/src/OverviewItemWidget.hpp
+++ b/Viewer/src/OverviewItemWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -35,7 +35,8 @@ public:
protected:
void reload();
- void updateState(const ChangeFlags&) {}
+ void updateState(const ChangeFlags&);
+ void reloadRequested();
int lastScrollPos_;
};
diff --git a/Viewer/src/OverviewProvider.cpp b/Viewer/src/OverviewProvider.cpp
index faa887f..9c9adc1 100644
--- a/Viewer/src/OverviewProvider.cpp
+++ b/Viewer/src/OverviewProvider.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -133,12 +133,16 @@ void OverviewProvider::serverInfo(VInfoServer* info,std::stringstream& f)
std::string typeName="server";
std::string nodeName=server->name();
- std::string statusName(VSState::toName(server).toStdString());
+ std::string statusName(VSState::toName(server).toStdString());
+ std::string flags(snode->flagsAsStr());
- //Header
+ //Header
f << "name : " << nodeName << "\n";
f << "type : " << typeName << "\n";
- f << "status : " << statusName << "\n";
+ f << "status : " << statusName << "\n";
+
+ if(!flags.empty())
+ f << "flags : " << flags << "\n";
f << "----------\n";
//Start block: Type, name
@@ -189,12 +193,16 @@ void OverviewProvider::nodeInfo(VInfoNode* info,std::stringstream& f)
std::string typeName=node->nodeType();
std::string nodeName(node->name().toStdString());
std::string statusName(node->stateName().toStdString());
+ std::string flags(node->flagsAsStr());
//Header
f << "name : " << nodeName << "\n";
f << "type : " << typeName << "\n";
f << "status : " << statusName << "\n";
+ if(!flags.empty())
+ f << "flags : " << flags << "\n";
+
node_ptr nn=node->node();
boost::posix_time::ptime state_change_time = nn->state_change_time();
diff --git a/Viewer/src/OverviewProvider.hpp b/Viewer/src/OverviewProvider.hpp
index 6b87a05..d54059f 100644
--- a/Viewer/src/OverviewProvider.hpp
+++ b/Viewer/src/OverviewProvider.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/Palette.cpp b/Viewer/src/Palette.cpp
index 004a851..99a1cc4 100644
--- a/Viewer/src/Palette.cpp
+++ b/Viewer/src/Palette.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -111,5 +111,17 @@ void Palette::load(const std::string& parFile)
qApp->setPalette(palette);
}
+void Palette::statusColours(QColor bg,QColor &bgLight,QColor &border)
+{
+ int lighter=150;
+ if(bg.value() < 235)
+ bgLight=bg.lighter(130);
+ else
+ bgLight=bg.lighter(lighter);
+
+ //if(bg.hsvHue() < 58 && bg.hsvHue() > 50)
+ // bgLight=bg.lighter(170);
+ border=bg.darker(120); //125 150
+}
diff --git a/Viewer/src/Palette.hpp b/Viewer/src/Palette.hpp
index 880cd02..5f937e5 100644
--- a/Viewer/src/Palette.hpp
+++ b/Viewer/src/Palette.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -12,12 +12,15 @@
#define VIEWER_SRC_PALETTE_HPP_
#include <string>
+#include <QColor>
class Palette
{
public:
Palette();
static void load(const std::string& parFile);
+ static void statusColours(QColor bg,QColor &bgLight,QColor &border);
+
};
diff --git a/Viewer/src/PlainTextEdit.cpp b/Viewer/src/PlainTextEdit.cpp
index a10281a..524fb37 100644
--- a/Viewer/src/PlainTextEdit.cpp
+++ b/Viewer/src/PlainTextEdit.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/PlainTextEdit.hpp b/Viewer/src/PlainTextEdit.hpp
index 84526f7..1e22455 100644
--- a/Viewer/src/PlainTextEdit.hpp
+++ b/Viewer/src/PlainTextEdit.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/PlainTextSearchInterface.cpp b/Viewer/src/PlainTextSearchInterface.cpp
index 5e98492..674eba8 100644
--- a/Viewer/src/PlainTextSearchInterface.cpp
+++ b/Viewer/src/PlainTextSearchInterface.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/PlainTextSearchInterface.hpp b/Viewer/src/PlainTextSearchInterface.hpp
index 35eee7e..09a6a42 100644
--- a/Viewer/src/PlainTextSearchInterface.hpp
+++ b/Viewer/src/PlainTextSearchInterface.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/PlainTextSearchLine.cpp b/Viewer/src/PlainTextSearchLine.cpp
index 855145e..f113217 100644
--- a/Viewer/src/PlainTextSearchLine.cpp
+++ b/Viewer/src/PlainTextSearchLine.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/PlainTextSearchLine.hpp b/Viewer/src/PlainTextSearchLine.hpp
index 672a72c..de2a657 100644
--- a/Viewer/src/PlainTextSearchLine.hpp
+++ b/Viewer/src/PlainTextSearchLine.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -25,7 +25,7 @@ public:
private:
//The interface is set internally
- void setSearchInterface(AbstractTextSearchInterface*) {};
+ void setSearchInterface(AbstractTextSearchInterface*) {}
};
diff --git a/Viewer/src/PropertyDialog.cpp b/Viewer/src/PropertyDialog.cpp
index 38e6297..87fd569 100644
--- a/Viewer/src/PropertyDialog.cpp
+++ b/Viewer/src/PropertyDialog.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/PropertyDialog.hpp b/Viewer/src/PropertyDialog.hpp
index 87020df..355d1dd 100644
--- a/Viewer/src/PropertyDialog.hpp
+++ b/Viewer/src/PropertyDialog.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/PropertyEditor.cpp b/Viewer/src/PropertyEditor.cpp
index 4c73067..477d0d5 100644
--- a/Viewer/src/PropertyEditor.cpp
+++ b/Viewer/src/PropertyEditor.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -27,7 +27,8 @@
PropertyEditor::PropertyEditor(QWidget* parent) : QWidget(parent),
group_(0),
currentGrid_(0),
- holder_(0)
+ holder_(0),
+ lineLabelLen_(-1)
{
setupUi(this);
@@ -103,9 +104,29 @@ void PropertyEditor::build()
addItem(vProp,vb,holder_);
}
+ addRules();
addHelpers();
}
+void PropertyEditor::addRules()
+{
+ Q_FOREACH(PropertyLine* line,lineItems_)
+ {
+ if(VProperty* ruleProp=line->ruleProperty())
+ {
+ Q_FOREACH(PropertyLine* ll,lineItems_)
+ {
+ if(ll->property() == ruleProp)
+ {
+ line->addRuleLine(ll);
+ break;
+ }
+ }
+ }
+ }
+}
+
+
void PropertyEditor::addHelpers()
{
QMap<std::string,PropertyLine*> lineMap;
@@ -193,7 +214,18 @@ PropertyLine* PropertyEditor::addLine(VProperty *vProp,QGridLayout *gridLayout,Q
if(lw)
{
- gridLayout->addWidget(lw,row,0,Qt::AlignLeft);
+ //If lineLabelLen_ is set we adjust the size of the
+ //line labels so that the editor widgets could be aligned
+ if(lineLabelLen_ > 0)
+ {
+ QFont f;
+ QFontMetrics fm(f);
+ QString s;
+ s=s.leftJustified(lineLabelLen_,'A');
+ lw->setMinimumWidth(fm.width(s));
+ }
+
+ gridLayout->addWidget(lw,row,0,Qt::AlignLeft);
if(slw)
{
@@ -509,6 +541,14 @@ void PropertyEditor::addTab(VProperty* vProp,QTabWidget* tab)
tab->addTab(w,vProp->param("label"));
+
+ if(!vProp->param("adjustLineLabel").isEmpty())
+ {
+ lineLabelLen_=vProp->param("adjustLineLabel").toInt();
+ if(lineLabelLen_ <= 0 || lineLabelLen_ > 300)
+ lineLabelLen_=-1;
+ }
+
Q_FOREACH(VProperty* chProp,vProp->children())
{
addItem(chProp,vb,w);
diff --git a/Viewer/src/PropertyEditor.hpp b/Viewer/src/PropertyEditor.hpp
index 8e07a72..93b0c17 100644
--- a/Viewer/src/PropertyEditor.hpp
+++ b/Viewer/src/PropertyEditor.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -40,6 +40,7 @@ Q_SIGNALS:
private:
void clear();
void build();
+ void addRules();
void addHelpers();
void addItem(VProperty*,QVBoxLayout*,QWidget*);
@@ -58,6 +59,7 @@ private:
QList<PropertyLine*> lineItems_;
QString serverName_;
QWidget* holder_;
+ int lineLabelLen_;
};
diff --git a/Viewer/src/PropertyLine.cpp b/Viewer/src/PropertyLine.cpp
index 505f56e..bc17091 100644
--- a/Viewer/src/PropertyLine.cpp
+++ b/Viewer/src/PropertyLine.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -100,7 +100,8 @@ PropertyLine::PropertyLine(VProperty* guiProp,bool addLabel,QWidget * parent) :
defaultTb_(0),
masterTb_(0),
enabled_(true),
- doNotEmitChange_(false)
+ doNotEmitChange_(false),
+ ruleLine_(0)
{
prop_=guiProp_->link();
assert(prop_);
@@ -144,7 +145,6 @@ PropertyLine::PropertyLine(VProperty* guiProp,bool addLabel,QWidget * parent) :
connect(masterTb_,SIGNAL(toggled(bool)),
this,SLOT(slotMaster(bool)));
}
-
}
PropertyLine::~PropertyLine()
@@ -270,6 +270,47 @@ void PropertyLine::addHelper(PropertyLine* line)
helpers_[line->property()->name()]=line;
}
+//A simple dependency on other properties' values
+
+VProperty* PropertyLine::ruleProperty()
+{
+ if(!prop_->master())
+ {
+ QStringList disabledFor=prop_->param("disabledRule").split("=");
+ if(disabledFor.count() == 2)
+ {
+ QString key=disabledFor[0].simplified();
+ QString val=disabledFor[1].simplified();
+ if(key.isEmpty() == false && prop_->parent())
+ {
+ if(VProperty* rp=prop_->parent()->findChild(key))
+ {
+ ruleValue_=val;
+ return rp;
+ }
+ }
+ }
+ }
+}
+
+void PropertyLine::addRuleLine(PropertyLine *r)
+{
+ ruleLine_=r;
+ Q_ASSERT(ruleLine_);
+ connect(ruleLine_,SIGNAL(changed()),
+ this,SLOT(slotRule()));
+
+ //init
+ slotRule();
+}
+
+void PropertyLine::slotRule()
+{
+ Q_ASSERT(ruleLine_);
+ slotEnabled(ruleLine_->currentValue().toString() != ruleValue_);
+}
+
+
//=========================================================================
//
// StringPropertyLine
diff --git a/Viewer/src/PropertyLine.hpp b/Viewer/src/PropertyLine.hpp
index 1ce3f38..4e891b5 100644
--- a/Viewer/src/PropertyLine.hpp
+++ b/Viewer/src/PropertyLine.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -86,15 +86,17 @@ public:
PropertyLine(VProperty*,bool addLabel,QWidget* parent=0);
virtual ~PropertyLine();
- QLabel* label() {return label_;};
- QLabel* suffixLabel() {return suffixLabel_;};
+ QLabel* label() {return label_;}
+ QLabel* suffixLabel() {return suffixLabel_;}
virtual QWidget* item()=0;
virtual QWidget* button()=0;
- QToolButton* defaultTb() {return defaultTb_;};
- QToolButton* masterTb() {return masterTb_;};
+ QToolButton* defaultTb() {return defaultTb_;}
+ QToolButton* masterTb() {return masterTb_;}
VProperty* property() const {return prop_;}
VProperty* guiProperty() const {return guiProp_;}
- virtual bool canExpand() const {return false;}
+ VProperty* ruleProperty();
+ void addRuleLine(PropertyLine*);
+ virtual bool canExpand() const {return false;}
void addHelper(PropertyLine*);
@@ -111,6 +113,7 @@ protected Q_SLOTS:
void slotResetToDefault(bool);
void slotMaster(bool b);
void checkState();
+ void slotRule();
Q_SIGNALS:
void changed(QVariant);
@@ -132,6 +135,8 @@ protected:
QVariant oriVal_;
bool doNotEmitChange_;
QMap<QString,PropertyLine*> helpers_;
+ PropertyLine* ruleLine_;
+ QString ruleValue_;
};
//-------------------------------------
diff --git a/Viewer/src/PropertyMapper.cpp b/Viewer/src/PropertyMapper.cpp
index 1d15760..07274ba 100644
--- a/Viewer/src/PropertyMapper.cpp
+++ b/Viewer/src/PropertyMapper.cpp
@@ -1,4 +1,4 @@
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
#include "PropertyMapper.hpp"
diff --git a/Viewer/src/PropertyMapper.hpp b/Viewer/src/PropertyMapper.hpp
index 3d3586a..b1245cd 100644
--- a/Viewer/src/PropertyMapper.hpp
+++ b/Viewer/src/PropertyMapper.hpp
@@ -1,4 +1,4 @@
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
#ifndef PROPERTYMAPPER_INC_
#define PROPERTYMAPPER_INC_
diff --git a/Viewer/src/RectMetrics.cpp b/Viewer/src/RectMetrics.cpp
new file mode 100644
index 0000000..c4f8a06
--- /dev/null
+++ b/Viewer/src/RectMetrics.cpp
@@ -0,0 +1,60 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "RectMetrics.hpp"
+
+#include <QImage>
+#include <QPainter>
+
+RectMetrics::RectMetrics(int penWidth) :
+ topOffset_(0),
+ bottomOffset_(0)
+{
+ if(penWidth >=0 && penWidth <=4)
+ compute(penWidth);
+}
+
+void RectMetrics::compute(int penWidth)
+{
+ QImage img(24,24,QImage::Format_ARGB32_Premultiplied);
+ img.fill(Qt::white);
+ QPainter p(&img);
+ p.setPen(QPen(Qt::black,penWidth));
+
+ int top=6;
+ int bottom=img.height()-top;
+ int left=6;
+ int right=img.width()-left;
+ p.drawRect(QRect(left,top,right-left,bottom-top));
+
+ int j=12;
+
+ //top
+ for(int i=0; i < img.height(); i++)
+ {
+ QRgb c=img.pixel(j,i);
+ if(qRed(c) != 255 || qGreen(c) != 255 || qBlue(c) != 255)
+ {
+ topOffset_=i-top;
+ break;
+ }
+ }
+
+ //bottom
+ for(int i=img.height()-1; i >=0; i--)
+ {
+ QRgb c=img.pixel(j,i);
+ if(qRed(c) != 255 || qGreen(c) != 255 || qBlue(c) != 255)
+ {
+ bottomOffset_=i-bottom;
+ break;
+ }
+ }
+}
diff --git a/Viewer/src/CustomTabWidget.hpp b/Viewer/src/RectMetrics.hpp
similarity index 61%
copy from Viewer/src/CustomTabWidget.hpp
copy to Viewer/src/RectMetrics.hpp
index ef9a644..04bf26d 100644
--- a/Viewer/src/CustomTabWidget.hpp
+++ b/Viewer/src/RectMetrics.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -8,21 +8,22 @@
//
//============================================================================
-#ifndef VIEWER_SRC_CUSTOMTABWIDGET_HPP_
-#define VIEWER_SRC_CUSTOMTABWIDGET_HPP_
+#ifndef RECTMETRICS_HPP
+#define RECTMETRICS_HPP
-#include <QTabWidget>
-
-class CustomTabWidget : public QTabWidget
+class RectMetrics
{
public:
- explicit CustomTabWidget(QWidget* parent=0);
-
- void setCustomIcon(int index, QPixmap pix);
+ RectMetrics(int penWidth);
+ int topOffset() const {return topOffset_;}
+ int bottomOffset() const {return bottomOffset_;}
protected:
- QSize maxIconSize() const;
-};
+ int topOffset_;
+ int bottomOffset_;
+private:
+ void compute(int);
+};
-#endif /* VIEWER_SRC_CUSTOMTABWIDGET_HPP_ */
+#endif // RECTMETRICS_HPP
diff --git a/Viewer/src/RepeatEditor.cpp b/Viewer/src/RepeatEditor.cpp
index 676d7bb..dc60014 100644
--- a/Viewer/src/RepeatEditor.cpp
+++ b/Viewer/src/RepeatEditor.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -12,6 +12,7 @@
#include <QtGlobal>
#include <QIntValidator>
+#include <QItemSelectionModel>
#include <QStringListModel>
#include <QSettings>
@@ -23,7 +24,7 @@
#include "SessionHandler.hpp"
#include "VInfo.hpp"
#include "VNode.hpp"
-#include "VRepeat.hpp"
+#include "VRepeatAttr.hpp"
RepeatEditorWidget::RepeatEditorWidget(QWidget* parent) : QWidget(parent)
{
@@ -46,7 +47,6 @@ void RepeatEditorWidget::hideRow(QWidget* w)
RepeatEditor::RepeatEditor(VInfo_ptr info,QWidget* parent) :
AttributeEditor(info,"repeat",parent),
- repeat_(0),
model_(0)
{
w_=new RepeatEditorWidget(this);
@@ -58,6 +58,9 @@ RepeatEditor::RepeatEditor(VInfo_ptr info,QWidget* parent) :
Q_ASSERT(a->type());
Q_ASSERT(a->type()->name() == "repeat");
+ VRepeatAttr *rep=static_cast<VRepeatAttr*>(a);
+
+#if 0
if(a->data().count() < 7)
return;
@@ -67,6 +70,8 @@ RepeatEditor::RepeatEditor(VInfo_ptr info,QWidget* parent) :
Q_ASSERT(node);
const Repeat& r=node->repeat();
repeat_=VRepeat::make(r);
+#endif
+
oriVal_=a->data().at(3);
@@ -79,7 +84,7 @@ RepeatEditor::RepeatEditor(VInfo_ptr info,QWidget* parent) :
//Value will be initailised in the subclasses
oriVal_=a->data().at(3);
- buildList();
+ buildList(rep);
#if 0
QIntValidator *validator=new QIntValidator(this);
@@ -91,23 +96,22 @@ RepeatEditor::RepeatEditor(VInfo_ptr info,QWidget* parent) :
valueLe_->setValidator(validator);
#endif
- header_->setInfo(QString::fromStdString(info_->path()),"Repeat " + QString::fromStdString(repeat_->type()));
+ header_->setInfo(QString::fromStdString(info_->path()),"Repeat " + QString::fromStdString(rep->subType()));
readSettings();
}
RepeatEditor::~RepeatEditor()
{
- if(repeat_)
- delete repeat_;
+ writeSettings();
}
-void RepeatEditor::buildList()
+void RepeatEditor::buildList(VRepeatAttr *rep)
{
- int start=repeat_->startIndex();
- int end=repeat_->endIndex();
- int step=repeat_->step();
- int current=repeat_->currentIndex();
+ int start=rep->startIndex();
+ int end=rep->endIndex();
+ int step=rep->step();
+ int current=rep->currentIndex();
if(step<=0 || end <= start)
{
@@ -116,18 +120,21 @@ void RepeatEditor::buildList()
modelData_.clear();
int cnt=end-start;
- if(cnt >1 && cnt < 100)
+ if(cnt >1)
{
- for(size_t i=start; i <= end; i++)
- modelData_ << QString::fromStdString(repeat_->value(i));
+ for(size_t i=start; i < end; i++)
+ modelData_ << QString::fromStdString(rep->value(i));
model_=new QStringListModel(this);
model_->setStringList(modelData_);
w_->valueView_->setModel(model_);
w_->valueView_->setCurrentIndex(model_->index(current,0));
- connect(w_->valueView_,SIGNAL(activated(const QModelIndex&)),
- this,SLOT(slotSelectedInView(const QModelIndex&)));
+ connect(w_->valueView_->selectionModel(),
+ SIGNAL(currentChanged(QModelIndex,QModelIndex)),
+ this, SLOT(slotSelectedInView(QModelIndex,QModelIndex)));
+
+ w_->valueView_->setFocus(Qt::MouseFocusReason);
}
else
{
@@ -135,9 +142,9 @@ void RepeatEditor::buildList()
}
}
-void RepeatEditor::slotSelectedInView(const QModelIndex& idx)
+void RepeatEditor::slotSelectedInView(const QModelIndex ¤t, const QModelIndex &previous)
{
- setValue(idx.data().toString());
+ setValue(current.data().toString());
checkButtonStatus();
}
@@ -190,8 +197,8 @@ void RepeatEditor::readSettings()
RepeatIntEditor::RepeatIntEditor(VInfo_ptr info,QWidget* parent) :
RepeatEditor(info,parent)
{
- if(!repeat_)
- return;
+ //if(!repeat_)
+ // return;
w_->hideRow(w_->valueLe_);
w_->valueSpin_->setValue(oriVal_.toInt());
@@ -257,8 +264,8 @@ void RepeatIntEditor::apply()
RepeatStringEditor::RepeatStringEditor(VInfo_ptr info,QWidget* parent) :
RepeatEditor(info,parent)
{
- if(!repeat_)
- return;
+ //if(!repeat_)
+ // return;
w_->hideRow(w_->valueSpin_);
w_->hideRow(w_->stepLabel_);
@@ -324,8 +331,8 @@ void RepeatStringEditor::apply()
RepeatDateEditor::RepeatDateEditor(VInfo_ptr info,QWidget* parent) :
RepeatEditor(info,parent)
{
- if(!repeat_)
- return;
+ //if(!repeat_)
+ // return;
w_->hideRow(w_->valueSpin_);
w_->valueLe_->setText(oriVal_);
diff --git a/Viewer/src/RepeatEditor.hpp b/Viewer/src/RepeatEditor.hpp
index 1ac1810..5bc9bd3 100644
--- a/Viewer/src/RepeatEditor.hpp
+++ b/Viewer/src/RepeatEditor.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -19,7 +19,7 @@
class QModelIndex;
class QStringList;
class QStringListModel;
-class VRepeat;
+class VRepeatAttr;
class RepeatEditor;
class RepeatEditorWidget : public QWidget, protected Ui::RepeatEditorWidget
@@ -43,17 +43,17 @@ public:
~RepeatEditor();
protected Q_SLOTS:
- void slotSelectedInView(const QModelIndex&);
+ void slotSelectedInView(const QModelIndex&,const QModelIndex&);
protected:
- void buildList();
+ void buildList(VRepeatAttr *rep);
bool isListMode() const;
virtual void setValue(QString)=0;
void readSettings();
void writeSettings();
RepeatEditorWidget* w_;
- VRepeat* repeat_;
+ //VRepeat* repeat_;
QStringListModel* model_;
QStringList modelData_;
QString oriVal_;
diff --git a/Viewer/src/RichTextEdit.cpp b/Viewer/src/RichTextEdit.cpp
new file mode 100644
index 0000000..2b882c0
--- /dev/null
+++ b/Viewer/src/RichTextEdit.cpp
@@ -0,0 +1,89 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//============================================================================
+
+#include "RichTextEdit.hpp"
+
+#include <QtGlobal>
+#include <QDebug>
+#include <QFile>
+#include <QPainter>
+#include <QTextBlock>
+#include <QWheelEvent>
+
+#include "VConfig.hpp"
+#include "UiLog.hpp"
+
+RichTextEdit::RichTextEdit(QWidget * parent) :
+ QTextBrowser(parent),
+ fontProp_(0)
+{
+ QFont f("Courier");
+ //QFont f("Monospace");
+ //f.setStyleHint(QFont::TypeWriter);
+ f.setFixedPitch(true);
+ f.setPointSize(10);
+ //f.setStyleStrategy(QFont::PreferAntialias);
+ setFont(f);
+}
+
+RichTextEdit::~RichTextEdit()
+{
+ if(fontProp_)
+ fontProp_->removeObserver(this);
+}
+
+//---------------------------------------------
+// Fontsize management
+//---------------------------------------------
+
+void RichTextEdit::setFontProperty(VProperty* p)
+{
+ fontProp_=p;
+ fontProp_->addObserver(this);
+ updateFont();
+}
+
+void RichTextEdit::slotZoomIn()
+{
+ zoomIn();
+ fontSizeChangedByZoom();
+}
+
+void RichTextEdit::slotZoomOut()
+{
+ int oriSize=font().pointSize();
+ zoomOut();
+
+ if(font().pointSize() != oriSize)
+ fontSizeChangedByZoom();
+}
+
+void RichTextEdit::fontSizeChangedByZoom()
+{
+ if(fontProp_)
+ fontProp_->setValue(font());
+}
+
+void RichTextEdit::updateFont()
+{
+ if(fontProp_)
+ {
+ QFont f=fontProp_->value().value<QFont>();
+ if(font() != f)
+ setFont(f);
+ }
+}
+
+void RichTextEdit::notifyChange(VProperty* p)
+{
+ if(fontProp_ ==p)
+ {
+ setFont(p->value().value<QFont>());
+ }
+}
diff --git a/Viewer/src/LineEdit.hpp b/Viewer/src/RichTextEdit.hpp
similarity index 51%
copy from Viewer/src/LineEdit.hpp
copy to Viewer/src/RichTextEdit.hpp
index 9ea6504..d325abb 100644
--- a/Viewer/src/LineEdit.hpp
+++ b/Viewer/src/RichTextEdit.hpp
@@ -1,42 +1,43 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
// granted to it by virtue of its status as an intergovernmental organisation
// nor does it submit to any jurisdiction.
-//
//============================================================================
-#ifndef LINEEDIT_INC_
-#define LINEEDIT_INC_
+#ifndef RICHTEXTEDIT_HPP
+#define RICHTEXTEDIT_HPP
-#include <QLineEdit>
+#include <QTextBrowser>
-class QLabel;
-class QToolButton;
+#include "VProperty.hpp"
-class LineEdit : public QLineEdit
+class RichTextEdit : public QTextBrowser, public VPropertyObserver
{
Q_OBJECT
public:
- explicit LineEdit (QWidget *parent=0);
- void setDecoration(QPixmap);
+ explicit RichTextEdit(QWidget* parent = 0);
+ ~RichTextEdit();
+
+ void setFontProperty(VProperty* p);
+ void updateFont();
+ void notifyChange(VProperty* p);
public Q_SLOTS:
- void slotClear();
+ void slotZoomIn();
+ void slotZoomOut();
Q_SIGNALS:
- void textCleared();
+ void fontSizeChangedByWheel();
-protected:
- void adjustSize();
- void resizeEvent(QResizeEvent*);
+private:
+ void fontSizeChangedByZoom();
- QToolButton *clearTb_;
- QLabel* iconLabel_;
+ VProperty *fontProp_;
};
-#endif
+#endif // RICHTEXTEDIT_HPP
diff --git a/Viewer/src/RichTextSearchInterface.cpp b/Viewer/src/RichTextSearchInterface.cpp
new file mode 100644
index 0000000..cae33c3
--- /dev/null
+++ b/Viewer/src/RichTextSearchInterface.cpp
@@ -0,0 +1,231 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "RichTextSearchInterface.hpp"
+
+#include <QTextBrowser>
+
+RichTextSearchInterface::RichTextSearchInterface() : editor_(NULL)
+{
+}
+
+
+bool RichTextSearchInterface::findString (QString str, bool highlightAll, QTextDocument::FindFlags flags,
+ QTextCursor::MoveOperation move, int iteration,StringMatchMode::Mode matchMode)
+{
+ if(!editor_)
+ return false;
+
+ if(editor_->document()->isEmpty())
+ return false;
+
+ QTextCursor cursor(editor_->textCursor());
+
+ if (highlightAll) // if highlighting all matches, start from the start of the document
+ cursor.movePosition(QTextCursor::Start);
+
+ else // move the cursor?
+ cursor.movePosition(move);
+
+
+ QList<QTextEdit::ExtraSelection> extraSelections;
+ bool found = false;
+ bool keepGoing = true;
+ int numMatches = 0;
+
+ Qt::CaseSensitivity cs = (flags & QTextDocument::FindCaseSensitively) ? Qt::CaseSensitive : Qt::CaseInsensitive;
+
+ while (keepGoing)
+ {
+ switch (matchMode)
+ {
+ case StringMatchMode::ContainsMatch:
+ {
+ cursor = editor_->document()->find(str, cursor, flags); // perform the search
+ found = (!cursor.isNull());
+ break;
+ }
+ case StringMatchMode::WildcardMatch:
+ {
+ QRegExp regexp(str);
+ regexp.setCaseSensitivity(cs);
+ regexp.setPatternSyntax(QRegExp::Wildcard);
+
+ cursor = editor_->document()->find(regexp, cursor, flags); // perform the search
+ found = (!cursor.isNull());
+ break;
+ }
+ case StringMatchMode::RegexpMatch:
+ {
+ QRegExp regexp(str);
+ regexp.setCaseSensitivity(cs);
+
+ cursor = editor_->document()->find(regexp, cursor, flags); // perform the search
+ found = (!cursor.isNull());
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+ }
+
+
+ if (found)
+ {
+ if (highlightAll)
+ {
+ QTextEdit::ExtraSelection highlight;
+ highlight.cursor = cursor;
+ highlight.format.setBackground(highlightColour_);
+ extraSelections << highlight;
+ numMatches++;
+ }
+ else
+ {
+ editor_->setTextCursor(cursor); // mark the selection of the match
+ }
+ }
+
+
+ if (found && !highlightAll) // found a match and we only want one - stop here and select it
+ keepGoing = false;
+
+ else if (!found && !highlightAll && (iteration != 0)) // didn't find a match, only want one, we HAVE wrapped around
+ keepGoing = false;
+
+ if (!found && highlightAll) // want to highlight all, but no more matches found
+ keepGoing = false;
+
+
+
+ // not found, and we only want one match, then we need to wrap around and keep going
+ if (keepGoing)
+ {
+ if (!highlightAll)
+ {
+ cursor=editor_->textCursor();
+ if (flags & QTextDocument::FindBackward)
+ cursor.movePosition(QTextCursor::End);
+ else
+ cursor.movePosition(QTextCursor::Start);
+ iteration = 1; // iteration=1 to avoid infinite wraparound!
+ }
+ }
+ }
+
+
+ if (highlightAll)
+ {
+ //char num[64];
+ //sprintf(num, "%d", numMatches);
+ //UserMessage::message(UserMessage::DBG, false," highlighting : " + std::string(num));
+
+ editor_->setExtraSelections( extraSelections );
+ }
+
+ return (found);
+}
+
+void RichTextSearchInterface::automaticSearchForKeywords(bool userClickedReload)
+{
+ if(editor_->document()->isEmpty())
+ return;
+
+ bool performSearch = vpPerformAutomaticSearch_->value().toBool();
+
+ if (performSearch)
+ {
+ // search direction
+ QTextDocument::FindFlags findFlags;
+ QTextCursor cursor(editor_->textCursor());
+ std::string searchFrom = vpAutomaticSearchFrom_->valueAsString();
+ QTextCursor::MoveOperation move;
+ if (searchFrom == "bottom")
+ {
+ findFlags = QTextDocument::FindBackward;
+ move = QTextCursor::End;
+ }
+ else
+ {
+ move = QTextCursor::Start;
+ }
+
+ // case sensitivity
+ bool caseSensitive = vpAutomaticSearchCase_->value().toBool();
+ if (caseSensitive)
+ findFlags = findFlags | QTextDocument::FindCaseSensitively;
+
+ // string match mode
+ std::string matchMode(vpAutomaticSearchMode_->valueAsString());
+ StringMatchMode::Mode mode = StringMatchMode::operToMode(matchMode);
+
+ // the term to be searched for
+ std::string searchTerm_s(vpAutomaticSearchText_->valueAsString());
+ QString searchTerm = QString::fromStdString(searchTerm_s);
+
+ // perform the search
+ bool found = findString (searchTerm, false, findFlags, move, 1, mode);
+
+ if(!found)
+ {
+ if(userClickedReload)
+ {
+ // move the cursor to the start of the last line
+ gotoLastLine();
+ }
+ }
+ }
+ else
+ {
+ // move the cursor to the start of the last line
+ gotoLastLine();
+ }
+}
+
+void RichTextSearchInterface::refreshSearch()
+{
+ if(!editor_)
+ return;
+
+ QTextCursor cursor(editor_->textCursor());
+ if (cursor.hasSelection())
+ {
+ cursor.movePosition(QTextCursor::StartOfLine, QTextCursor::MoveAnchor);
+ editor_->setTextCursor(cursor);
+ }
+}
+
+
+void RichTextSearchInterface::clearHighlights()
+{
+ if(!editor_)
+ return;
+
+ QList<QTextEdit::ExtraSelection> empty;
+ editor_->setExtraSelections(empty);
+}
+
+void RichTextSearchInterface::disableHighlights()
+{
+ clearHighlights();
+}
+
+
+void RichTextSearchInterface::gotoLastLine()
+{
+ // move the cursor to the start of the last line
+ QTextCursor cursor = editor_->textCursor();
+ cursor.movePosition(QTextCursor::End);
+ cursor.movePosition(QTextCursor::StartOfLine);
+ editor_->setTextCursor(cursor);
+ editor_->ensureCursorVisible();
+}
diff --git a/Viewer/src/PlainTextSearchInterface.hpp b/Viewer/src/RichTextSearchInterface.hpp
similarity index 50%
copy from Viewer/src/PlainTextSearchInterface.hpp
copy to Viewer/src/RichTextSearchInterface.hpp
index 35eee7e..e3dec4c 100644
--- a/Viewer/src/PlainTextSearchInterface.hpp
+++ b/Viewer/src/RichTextSearchInterface.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -8,34 +8,33 @@
//
//============================================================================
-#ifndef VIEWER_SRC_PLAINTEXTSEARCHINTERFACE_HPP_
-#define VIEWER_SRC_PLAINTEXTSEARCHINTERFACE_HPP_
+#ifndef RichTextSearchInterface_HPP
+#define RichTextSearchInterface_HPP
#include "AbstractTextEditSearchInterface.hpp"
-class QPlainTextEdit;
+class QTextBrowser;
-class PlainTextSearchInterface : public AbstractTextEditSearchInterface
+class RichTextSearchInterface : public AbstractTextEditSearchInterface
{
public:
- PlainTextSearchInterface();
- void setEditor(QPlainTextEdit* e) {editor_=e;}
+ RichTextSearchInterface();
+ void setEditor(QTextBrowser* e) {editor_=e;}
- bool findString (QString str, bool highlightAll, QTextDocument::FindFlags findFlags,
- QTextCursor::MoveOperation move, int iteration,StringMatchMode::Mode matchMode);
+ bool findString(QString str, bool highlightAll, QTextDocument::FindFlags findFlags,
+ QTextCursor::MoveOperation move, int iteration,StringMatchMode::Mode matchMode);
- void automaticSearchForKeywords(bool);
- void refreshSearch();
+ void automaticSearchForKeywords(bool);
+ void refreshSearch();
void clearHighlights();
void disableHighlights();
void enableHighlights() {}
- bool highlightsNeedSearch() {return true;}
- void gotoLastLine();
+ bool highlightsNeedSearch() {return true;}
+ void gotoLastLine();
protected:
- QPlainTextEdit *editor_;
-
+ QTextBrowser *editor_;
};
-#endif /* VIEWER_SRC_PLAINTEXTSEARCHINTERFACE_HPP_ */
+#endif // RichTextSearchInterface_HPP
diff --git a/Viewer/src/RichTextSearchLine.cpp b/Viewer/src/RichTextSearchLine.cpp
new file mode 100644
index 0000000..361151e
--- /dev/null
+++ b/Viewer/src/RichTextSearchLine.cpp
@@ -0,0 +1,32 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//============================================================================
+
+#include "RichTextSearchLine.hpp"
+#include "RichTextSearchInterface.hpp"
+
+#include <assert.h>
+
+RichTextSearchLine::RichTextSearchLine(QWidget *parent) :
+ TextEditSearchLine(parent)
+{
+ interface_=new RichTextSearchInterface;
+ TextEditSearchLine::setSearchInterface(interface_);
+}
+
+RichTextSearchLine::~RichTextSearchLine()
+{
+ delete interface_;
+}
+
+void RichTextSearchLine::setEditor(QTextBrowser *e)
+{
+ RichTextSearchInterface *pti=static_cast<RichTextSearchInterface*>(interface_);
+ assert(pti);
+ pti->setEditor(e);
+}
diff --git a/Viewer/src/TriggerTextWidget.hpp b/Viewer/src/RichTextSearchLine.hpp
similarity index 53%
copy from Viewer/src/TriggerTextWidget.hpp
copy to Viewer/src/RichTextSearchLine.hpp
index aa292cd..9f2959b 100644
--- a/Viewer/src/TriggerTextWidget.hpp
+++ b/Viewer/src/RichTextSearchLine.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -7,16 +7,26 @@
// nor does it submit to any jurisdiction.
//============================================================================
-#ifndef TRIGGERTEXTWIDGET_HPP
-#define TRIGGERTEXTWIDGET_HPP
+#ifndef RICHTEXTSEARCHLINE_HPP
+#define RICHTEXTSEARCHLINE_HPP
#include <QTextBrowser>
-class TriggerTextWidget : public QTextBrowser
+#include "TextEditSearchLine.hpp"
+
+class AbstractTextSearchInterface;
+
+class RichTextSearchLine : public TextEditSearchLine
{
public:
- explicit TriggerTextWidget(QWidget *parent=0);
-};
+ explicit RichTextSearchLine(QWidget *parent=0);
+ ~RichTextSearchLine();
+ void setEditor(QTextBrowser*);
-#endif
+private:
+ //The interface is set internally
+ void setSearchInterface(AbstractTextSearchInterface*) {}
+
+};
+#endif // RICHTEXTSEARCHLINE_HPP
diff --git a/Viewer/src/SaveSessionAsDialog.cpp b/Viewer/src/SaveSessionAsDialog.cpp
index 35f6a7f..4e365ad 100644
--- a/Viewer/src/SaveSessionAsDialog.cpp
+++ b/Viewer/src/SaveSessionAsDialog.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/SaveSessionAsDialog.hpp b/Viewer/src/SaveSessionAsDialog.hpp
index 82d76b3..6d38e10 100644
--- a/Viewer/src/SaveSessionAsDialog.hpp
+++ b/Viewer/src/SaveSessionAsDialog.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ScriptItemWidget.cpp b/Viewer/src/ScriptItemWidget.cpp
index 1580444..a94379c 100644
--- a/Viewer/src/ScriptItemWidget.cpp
+++ b/Viewer/src/ScriptItemWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -59,7 +59,8 @@ void ScriptItemWidget::reload(VInfo_ptr info)
//Info must be a node
if(info_ && info_->isNode() && info_->node())
- {
+ {
+ reloadTb_->setEnabled(false);
infoProvider_->info(info_);
}
}
@@ -70,6 +71,7 @@ void ScriptItemWidget::clearContents()
fileLabel_->clear();
textEdit_->clear();
messageLabel_->hide();
+ reloadTb_->setEnabled(true);
}
void ScriptItemWidget::infoReady(VReply* reply)
@@ -89,7 +91,7 @@ void ScriptItemWidget::infoReady(VReply* reply)
}
fileLabel_->update(reply);
-
+ reloadTb_->setEnabled(true);
}
void ScriptItemWidget::infoProgress(VReply* reply)
@@ -103,7 +105,36 @@ void ScriptItemWidget::infoFailed(VReply* reply)
QString s=QString::fromStdString(reply->errorText());
//textEdit_->setPlainText(s);
messageLabel_->showError(s);
+ reloadTb_->setEnabled(true);
+}
+
+void ScriptItemWidget::reloadRequested()
+{
+ reload(info_);
}
+void ScriptItemWidget::updateState(const FlagSet<ChangeFlag>& flags)
+{
+ if(flags.isSet(SuspendedChanged))
+ {
+ //Suspend
+ if(suspended_)
+ {
+ reloadTb_->setEnabled(false);
+ }
+ //Resume
+ else
+ {
+ if(info_ && info_->node())
+ {
+ reloadTb_->setEnabled(true);
+ }
+ else
+ {
+ clearContents();
+ }
+ }
+ }
+}
static InfoPanelItemMaker<ScriptItemWidget> maker1("script");
diff --git a/Viewer/src/ScriptItemWidget.hpp b/Viewer/src/ScriptItemWidget.hpp
index 31e6e51..20bc378 100644
--- a/Viewer/src/ScriptItemWidget.hpp
+++ b/Viewer/src/ScriptItemWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -33,7 +33,8 @@ public:
void defsChanged(const std::vector<ecf::Aspect::Type>&) {}
protected:
- void updateState(const ChangeFlags&) {}
+ void updateState(const ChangeFlags&);
+ void reloadRequested();
};
#endif
diff --git a/Viewer/src/ServerComQueue.cpp b/Viewer/src/ServerComQueue.cpp
index 4296bd1..b73fcba 100644
--- a/Viewer/src/ServerComQueue.cpp
+++ b/Viewer/src/ServerComQueue.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -12,11 +12,12 @@
#include "ClientInvoker.hpp"
#include "ServerComThread.hpp"
#include "ServerHandler.hpp"
+#include "UIDebug.hpp"
#include "UiLog.hpp"
#include "Log.hpp"
-//#define _UI_SERVERCOMQUEUE_DEBUG
+#define _UI_SERVERCOMQUEUE_DEBUG
// This class manages the tasks to be sent to the ServerComThread, which controls
// the communication with the ClientInvoker. The ClientInvoker is hidden from the
@@ -24,11 +25,11 @@
// ServerComQueue, which then passes it on to the ClientInvoker. When a task is finished
// ServerComQueue notifies the ServerHandler about it.
-ServerComQueue::ServerComQueue(ServerHandler *server,ClientInvoker *client, ServerComThread *comThread) :
+ServerComQueue::ServerComQueue(ServerHandler *server,ClientInvoker *client) :
QObject(server),
server_(server),
client_(client),
- comThread_(comThread),
+ comThread_(0),
timeout_(5),
taskTimeout_(500),
state_(NoState), //the queue is enabled but not running
@@ -42,6 +43,10 @@ ServerComQueue::ServerComQueue(ServerHandler *server,ClientInvoker *client, Serv
connect(timer_,SIGNAL(timeout()),
this,SLOT(slotRun()));
+
+ createThread();
+
+#if 0
//When the ServerComThread starts it emits a signal that
//is connected to the queue.
connect(comThread_, SIGNAL(started()),
@@ -56,6 +61,7 @@ ServerComQueue::ServerComQueue(ServerHandler *server,ClientInvoker *client, Serv
//failed() signal that is connected to the queue.
connect(comThread_, SIGNAL(failed(std::string)),
this, SLOT(slotTaskFailed(std::string)));
+#endif
}
ServerComQueue::~ServerComQueue()
@@ -85,6 +91,42 @@ ServerComQueue::~ServerComQueue()
delete comThread_;
}
+void ServerComQueue::createThread()
+{
+ if(comThread_)
+ delete comThread_;
+
+ //We create a ServerComThread here. At this point the thread is not doing anything.
+ comThread_=new ServerComThread(server_,client_);
+
+ //When the ServerComThread starts it emits a signal that
+ //is connected to the queue.
+ connect(comThread_, SIGNAL(started()),
+ this, SLOT(slotTaskStarted()));
+
+ //When the ServerComThread finishes it emits a signal that
+ //is connected to the queue.
+ connect(comThread_, SIGNAL(finished()),
+ this, SLOT(slotTaskFinished()));
+
+ //When there is an error in ServerComThread it emits the
+ //failed() signal that is connected to the queue.
+ connect(comThread_, SIGNAL(failed(std::string)),
+ this, SLOT(slotTaskFailed(std::string)));
+
+ //The ServerComThread is observing the actual server and its nodes. When there is a change it
+ //emits a signal to notify the ServerHandler about it.
+ connect(comThread_,SIGNAL(nodeChanged(const Node*, std::vector<ecf::Aspect::Type>)),
+ server_,SLOT(slotNodeChanged(const Node*, std::vector<ecf::Aspect::Type>)));
+
+ connect(comThread_,SIGNAL(defsChanged(std::vector<ecf::Aspect::Type>)),
+ server_,SLOT(slotDefsChanged(std::vector<ecf::Aspect::Type>)));
+
+ connect(comThread_,SIGNAL(rescanNeed()),
+ server_,SLOT(slotRescanNeed()));
+}
+
+
void ServerComQueue::enable()
{
state_=NoState;
@@ -355,6 +397,7 @@ void ServerComQueue::slotRun()
UiLog(server_).dbg() << " task: " << (*it)->typeString();
}
#endif
+
if(tasks_.empty() && !current_)
{
#ifdef _UI_SERVERCOMQUEUE_DEBUG
@@ -364,6 +407,83 @@ void ServerComQueue::slotRun()
return;
}
+ //If a task was sent to the thread but the queue did not get the
+ //notification about the thread's start there is a PROBLEM!
+ //Note: when the thread starts it emits a signal to the queue
+ //and the queue sets taskStarted_ to true. Since this is a queued communication
+ //there can be a time lag between the two events. We set a timeout for it!
+ //If we pass the timeout we stop the thread and try to resend the task!
+ if(current_ && !taskStarted_ && taskTime_.elapsed() > taskTimeout_)
+ {
+ bool rerun=false;
+ bool r=comThread_->isRunning();
+
+ //So if we are here:
+ //-the thread did not emit a notification about its start
+ //-the elapsed time since we sent the task to the thread past the timeout.
+
+ //Problem 1:
+ //-the thread is running
+ if(r)
+ {
+ UiLog(server_).warn() << " It seems that the ServerCom thread started but it is in a bad state. Try to run task again.";
+ rerun=true;
+ //assert(false);
+ }
+
+ //Problem 2:
+ //-the thread is not running
+ else if(!r)
+ {
+ UiLog(server_).warn() << " It seems that the ServerCom thread could not start. Try to run task again.";
+ rerun=true;
+ }
+
+ if(rerun)
+ {
+ if(comThread_->wait(taskTimeout_) == false)
+ {
+ //We exit here because when we tried to call terminate() it just hung!!
+ UiLog(server_).err() << " Calling wait() on the ServerCom thread failed.";
+ UI_ASSERT(0,"Cannot stop ServerCom thread, which is in a bad state");
+ exit(1);
+#if 0
+ comThread_->terminate();
+ if(comThread_->wait(taskTimeout_) == false)
+ {
+ UiLog(server_).err() << " Calling wait() after terminate() on the ServerCom thread failed";
+ UiLog(server_).dbg() << "Delete the current ComThread and create a new one.";
+ createThread();
+ UI_ASSERT(0,"Cannot stop ServerCom thread that is in a bad state");
+
+ }
+ else
+ {
+ UiLog(server_).dbg() << " Terminating ServerCom thread succeeded.";
+ }
+#endif
+ }
+
+ Q_ASSERT(comThread_->isRunning() == false);
+
+ if(current_->status() != VTask::CANCELLED &&
+ current_->status() != VTask::ABORTED )
+ {
+ startCurrentTask();
+ return;
+ }
+ else
+ {
+ #ifdef _UI_SERVERCOMQUEUE_DEBUG
+ UiLog(server_).dbg() << " current_ aborted or cancelled. Reset current_ !";
+ #endif
+ current_.reset();
+ }
+ }
+ }
+
+
+#if 0
//If the thread could not start up for the current task.
if(current_ && !taskStarted_ && !comThread_->isRunning() &&
taskTime_.elapsed() > taskTimeout_)
@@ -385,6 +505,7 @@ void ServerComQueue::slotRun()
current_.reset();
}
}
+#endif
if(current_)
{
diff --git a/Viewer/src/ServerComQueue.hpp b/Viewer/src/ServerComQueue.hpp
index 899a4f1..1a77754 100644
--- a/Viewer/src/ServerComQueue.hpp
+++ b/Viewer/src/ServerComQueue.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -34,7 +34,7 @@ class ServerComQueue : public QObject
Q_OBJECT
public:
- ServerComQueue(ServerHandler *server,ClientInvoker* client,ServerComThread* comThread);
+ ServerComQueue(ServerHandler *server,ClientInvoker* client);
~ServerComQueue();
enum State {NoState,RunningState,SuspendedState,ResetState,DisabledState};
@@ -61,6 +61,7 @@ protected Q_SLOTS:
void slotTaskFailed(std::string);
protected:
+ void createThread();
void startCurrentTask();
void endReset();
bool hasTask(VTask::Type t) const;
diff --git a/Viewer/src/ServerComThread.cpp b/Viewer/src/ServerComThread.cpp
index 1d2f904..4ca07e5 100644
--- a/Viewer/src/ServerComThread.cpp
+++ b/Viewer/src/ServerComThread.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -63,6 +63,7 @@ void ServerComThread::task(VTask_ptr task)
nodePath_.clear();
taskType_=task->type();
nodePath_=task->targetPath();
+ zombie_=task->zombie();
//Suite filter
hasSuiteFilter_=server_->suiteFilter()->isEnabled();
@@ -201,6 +202,26 @@ void ServerComThread::run()
}
break;
+ case VTask::ZombieCommandTask:
+ {
+ std::string cmd=params_["command"];
+ UiLog(serverName_).dbg() << " ZOMBIE COMMAND " << cmd << " path=" << zombie_.path_to_task();
+ if(cmd == "zombie_fob")
+ ci_->zombieFob(zombie_);
+ else if(cmd == "zombie_fail")
+ ci_->zombieFail(zombie_);
+ else if(cmd == "zombie_adopt")
+ ci_->zombieAdopt(zombie_);
+ else if(cmd == "zombie_block")
+ ci_->zombieBlock(zombie_);
+ else if(cmd == "zombie_remove")
+ ci_->zombieRemove(zombie_);
+ else if(cmd == "zombie_kill")
+ ci_->zombieKill(zombie_);
+
+ break;
+ }
+
case VTask::ZombieListTask:
UiLog(serverName_).dbg() << " ZOMBIES";
ci_->zombieGet();
diff --git a/Viewer/src/ServerComThread.hpp b/Viewer/src/ServerComThread.hpp
index 422c043..2c46f11 100644
--- a/Viewer/src/ServerComThread.hpp
+++ b/Viewer/src/ServerComThread.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -44,6 +44,8 @@ public:
void task(VTask_ptr);
//From AbstractObserver
+ virtual void update_start(const Node*, const std::vector<ecf::Aspect::Type>&) {}
+ virtual void update_start(const Defs*, const std::vector<ecf::Aspect::Type>&) {}
void update(const Node*, const std::vector<ecf::Aspect::Type>&);
void update(const Defs*, const std::vector<ecf::Aspect::Type>&);
void update_delete(const Node*);
@@ -78,6 +80,7 @@ private:
std::map<std::string,std::string> params_;
std::vector<std::string> contents_;
NameValueVec vars_;
+ Zombie zombie_;
std::string nodePath_;
bool rescanNeed_;
bool hasSuiteFilter_;
diff --git a/Viewer/src/ServerDefsAccess.cpp b/Viewer/src/ServerDefsAccess.cpp
index 24abccb..12b6ed9 100644
--- a/Viewer/src/ServerDefsAccess.cpp
+++ b/Viewer/src/ServerDefsAccess.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ServerDefsAccess.hpp b/Viewer/src/ServerDefsAccess.hpp
index 3333690..89ddde5 100644
--- a/Viewer/src/ServerDefsAccess.hpp
+++ b/Viewer/src/ServerDefsAccess.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ServerFilter.cpp b/Viewer/src/ServerFilter.cpp
index 2b4d1c0..3fd51d4 100644
--- a/Viewer/src/ServerFilter.cpp
+++ b/Viewer/src/ServerFilter.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -28,13 +28,11 @@ ServerFilter::ServerFilter()
ServerFilter::~ServerFilter()
{
std::vector<ServerFilterObserver*> obsCopy=observers_;
-
for(std::vector<ServerFilterObserver*>::const_iterator it=obsCopy.begin(); it != obsCopy.end(); ++it)
{
(*it)->notifyServerFilterDelete();
}
-
for(std::vector<ServerItem*>::const_iterator it=items_.begin(); it != items_.end(); ++it)
{
(*it)->removeObserver(this);
diff --git a/Viewer/src/ServerFilter.hpp b/Viewer/src/ServerFilter.hpp
index 07ba525..ccc90bf 100644
--- a/Viewer/src/ServerFilter.hpp
+++ b/Viewer/src/ServerFilter.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ServerHandler.cpp b/Viewer/src/ServerHandler.cpp
index 7097d4e..02a7fb3 100644
--- a/Viewer/src/ServerHandler.cpp
+++ b/Viewer/src/ServerHandler.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -22,7 +22,6 @@
#include "NodeObserver.hpp"
#include "SessionHandler.hpp"
#include "ServerComQueue.hpp"
-#include "ServerComThread.hpp"
#include "ServerDefsAccess.hpp"
#include "ServerObserver.hpp"
#include "SuiteFilter.hpp"
@@ -76,7 +75,17 @@ ServerHandler::ServerHandler(const std::string& name,const std::string& host, co
conf_=new VServerSettings(this);
//Create the client invoker. At this point it is empty.
- client_=new ClientInvoker(host,port);
+ try
+ {
+ client_=new ClientInvoker(host,port);
+ }
+ catch(std::exception& e)
+ {
+ UiLog().err() << "Could not create ClientInvoker for host=" << host <<
+ " port= " << port << ". " << e.what();
+ client_=0;
+ }
+
client_->set_retry_connection_period(1);
client_->set_throw_on_error(true);
@@ -108,26 +117,9 @@ ServerHandler::ServerHandler(const std::string& name,const std::string& host, co
// issues; another strategy would be to create threads on demand, only
// when server communication is about to start.
- //We create a ServerComThread here. It is not a member, because we will
- //pass its ownership on to ServerComQueue. At this point the thread is not doing anything.
- ServerComThread* comThread=new ServerComThread(this,client_);
-
- //The ServerComThread is observing the actual server and its nodes. When there is a change it
- //emits a signal to notify the ServerHandler about it.
- connect(comThread,SIGNAL(nodeChanged(const Node*, std::vector<ecf::Aspect::Type>)),
- this,SLOT(slotNodeChanged(const Node*, std::vector<ecf::Aspect::Type>)));
-
- connect(comThread,SIGNAL(defsChanged(std::vector<ecf::Aspect::Type>)),
- this,SLOT(slotDefsChanged(std::vector<ecf::Aspect::Type>)));
-
- connect(comThread,SIGNAL(rescanNeed()),
- this,SLOT(slotRescanNeed()));
-
-
//Create the queue for the tasks to be sent to the client (via the ServerComThread)! It will
- //take ownership of the ServerComThread. At this point the queue has not started yet.
- comQueue_=new ServerComQueue (this,client_,comThread);
-
+ //create and take ownership of the ServerComThread. At this point the queue has not started yet.
+ comQueue_=new ServerComQueue (this,client_);
//Load settings
loadConf();
@@ -211,7 +203,9 @@ void ServerHandler::startRefreshTimer()
if(!refreshTimer_->isActive())
{
- refreshTimer_->setInterval(conf_->intValue(VServerSettings::UpdateRate)*1000);
+ int rate=conf_->intValue(VServerSettings::UpdateRate);
+ if(rate <=0) rate=1;
+ refreshTimer_->setInterval(rate*1000);
refreshTimer_->start();
}
@@ -235,12 +229,16 @@ void ServerHandler::updateRefreshTimer()
if(connectState_->state() == ConnectState::Disconnected)
return;
+ int rate=conf_->intValue(VServerSettings::UpdateRate);
+ if(rate <=0) rate=1;
+
if(refreshTimer_->isActive())
{
refreshTimer_->stop();
- refreshTimer_->setInterval(conf_->intValue(VServerSettings::UpdateRate)*1000);
- refreshTimer_->start();
- }
+ }
+
+ refreshTimer_->setInterval(rate*1000);
+ refreshTimer_->start();
#ifdef __UI_SERVERUPDATE_DEBUG
UiLog(this).dbg() << " refreshTimer interval: " << refreshTimer_->interval();
@@ -282,7 +280,13 @@ void ServerHandler::setActivity(Activity ac)
ServerHandler* ServerHandler::addServer(const std::string& name,const std::string& host, const std::string& port)
{
ServerHandler* sh=new ServerHandler(name,host,port);
- return sh;
+ //Without the clinetinvoker we cannot use the serverhandler
+ if(!sh->client_)
+ {
+ delete sh;
+ sh=0;
+ }
+ return sh;
}
void ServerHandler::removeServer(ServerHandler* server)
@@ -435,7 +439,8 @@ void ServerHandler::run(VTask_ptr task)
case VTask::ScriptEditTask:
case VTask::ScriptSubmitTask:
case VTask::SuiteListTask:
- case VTask::ZombieListTask:
+ case VTask::ZombieListTask:
+ case VTask::ZombieCommandTask:
comQueue_->addTask(task);
break;
default:
@@ -1122,7 +1127,7 @@ void ServerHandler::clientTaskFinished(VTask_ptr task,const ServerReply& serverR
}
//-------------------------------------------------------------------
-// This slot is called when the comThread finished the given task!!
+// This slot is called when the comThread failed the given task!!
//-------------------------------------------------------------------
void ServerHandler::clientTaskFailed(VTask_ptr task,const std::string& errMsg)
@@ -1150,11 +1155,17 @@ void ServerHandler::clientTaskFailed(VTask_ptr task,const std::string& errMsg)
connectionLost(errMsg);
break;
}
+ case VTask::CommandTask:
+ {
+ task->reply()->setErrorText(errMsg);
+ task->status(VTask::ABORTED);
+ UserMessage::message(UserMessage::WARN, true, errMsg);
+ break;
+ }
default:
task->reply()->setErrorText(errMsg);
task->status(VTask::ABORTED);
break;
-
}
}
diff --git a/Viewer/src/ServerHandler.hpp b/Viewer/src/ServerHandler.hpp
index d944a55..1790100 100644
--- a/Viewer/src/ServerHandler.hpp
+++ b/Viewer/src/ServerHandler.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ServerItem.cpp b/Viewer/src/ServerItem.cpp
index 6df8b30..156bc93 100644
--- a/Viewer/src/ServerItem.cpp
+++ b/Viewer/src/ServerItem.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -82,10 +82,11 @@ std::string ServerItem::longName() const
void ServerItem::registerUsageBegin()
{
- useCnt_++;
if(!handler_)
{
handler_=ServerHandler::addServer(name_,host_,port_);
+ if(handler_)
+ useCnt_++;
}
}
@@ -107,9 +108,11 @@ void ServerItem::addObserver(ServerItemObserver* o)
{
std::vector<ServerItemObserver*>::iterator it=std::find(observers_.begin(),observers_.end(),o);
if(it == observers_.end())
- {
- observers_.push_back(o);
+ {
registerUsageBegin();
+ //We might not be able to create the handle
+ if(handler_)
+ observers_.push_back(o);
}
}
diff --git a/Viewer/src/ServerItem.hpp b/Viewer/src/ServerItem.hpp
index f9fbc31..60f4ba6 100644
--- a/Viewer/src/ServerItem.hpp
+++ b/Viewer/src/ServerItem.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ServerList.cpp b/Viewer/src/ServerList.cpp
index 476b1ec..9d0f94c 100644
--- a/Viewer/src/ServerList.cpp
+++ b/Viewer/src/ServerList.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -15,6 +15,8 @@
#include "DirectoryHandler.hpp"
#include "ServerItem.hpp"
+#include "UserMessage.hpp"
+#include "UIDebug.hpp"
#include "UiLog.hpp"
#include <algorithm>
@@ -23,6 +25,8 @@
#include <sstream>
#include <stdlib.h>
+#include <boost/lexical_cast.hpp>
+
ServerList* ServerList::instance_=0;
#define _UI_SERVERLIST_DEBUG
@@ -70,14 +74,19 @@ ServerItem* ServerList::find(const std::string& name, const std::string& host, c
return 0;
}
-ServerItem* ServerList::add(const std::string& name,const std::string& host,const std::string& port,bool favourite,bool saveIt)
+ServerItem* ServerList::add(const std::string& name,const std::string& host,
+ const std::string& port,bool favourite,bool saveIt)
{
- //Check if there is an item with the same name. Names have to be unique!
- if(find(name))
- return 0;
+ std::string errStr;
+ if(!checkItemToAdd(name,host,port,true,errStr))
+ {
+ throw std::runtime_error(errStr);
+ return 0;
+ }
- ServerItem* item=new ServerItem(name,host,port,favourite);
- items_.push_back(item);
+ ServerItem* item=new ServerItem(name,host,port,favourite);
+
+ items_.push_back(item);
if(saveIt)
save();
@@ -175,6 +184,40 @@ void ServerList::rescan()
}
+bool ServerList::checkItemToAdd(const std::string& name,const std::string& host,const std::string& port,bool checkDuplicate,std::string& errStr)
+{
+ if(name.empty())
+ {
+ errStr="Empty server name";
+ return false;
+ }
+ else if(host.empty())
+ {
+ errStr="Empty server host";
+ return false;
+ }
+ else if(port.empty())
+ {
+ errStr="Empty server port";
+ return false;
+ }
+
+ try { boost::lexical_cast<int>(port); }
+ catch ( boost::bad_lexical_cast& e)
+ {
+ errStr="Invalid port number: " + port;
+ return false;
+ }
+
+ if(checkDuplicate && find(name))
+ {
+ errStr="Duplicated server name: " + name;
+ return false;
+ }
+
+ return true;
+}
+
//===========================================================
// Initialisation
//===========================================================
@@ -195,17 +238,25 @@ void ServerList::init()
bool ServerList::load()
{
+ UiLog().dbg() << "ServerList::load() -->";
+
std::ifstream in(localFile_.c_str());
if(!in.good())
return false;
+ std::string errStr;
+
std::string line;
+ int lineCnt=1;
while(getline(in,line))
{
//We ignore comment lines
std::string buf=boost::trim_left_copy(line);
if(buf.size() > 0 && buf.at(0) == '#')
- continue;
+ {
+ lineCnt++;
+ continue;
+ }
std::vector<std::string> sv;
boost::split(sv,line,boost::is_any_of(","));
@@ -219,14 +270,39 @@ bool ServerList::load()
sys=(sv[4]=="1")?true:false;
if(sv.size() >= 3)
- {
- ServerItem* item=add(sv[0],sv[1],sv[2],favourite,false);
- item->setSystem(sys);
+ {
+ std::string name=sv[0], host=sv[1], port=sv[2];
+ ServerItem* item=0;
+ try
+ {
+ item=add(name,host,port,favourite,false);
+ UI_ASSERT(item != 0,"name=" << name << " host=" << host << " port=" << port);
+ item->setSystem(sys);
+ }
+ catch(std::exception& e)
+ {
+ std::string err=e.what();
+ err+=" [name=" + name + ",host=" + host + ",port=" + port + "]";
+ errStr+=err + " (in line " + UiLog::toString(lineCnt) + ")<br>";
+ UiLog().err() << " " << err << " (in line " << lineCnt << ")";
+ }
}
+
+ lineCnt++;
}
in.close();
+ if(!errStr.empty())
+ {
+ errStr="Cound not parse the <b>server list file</b> (servers.txt) properly. The \
+ following errors occured:<br><br>" +
+ errStr + "<br><i>Note</i>: ecFlowUi will carry on but not all the speciefied servers will be available!";
+ UserMessage::setEchoToCout(false);
+ UserMessage::message(UserMessage::ERROR,true,errStr);
+ UserMessage::setEchoToCout(true);
+ }
+
if(count() == 0)
return false;
@@ -238,7 +314,7 @@ void ServerList::save()
std::ofstream out;
out.open(localFile_.c_str());
if(!out.good())
- return;
+ return;
out << "#Name Host Port Favourite System" << std::endl;
@@ -251,11 +327,12 @@ void ServerList::save()
out.close();
}
-
bool ServerList::readRcFile()
{
- std::string path(DirectoryHandler::concatenate(DirectoryHandler::rcDir(), "servers"));
+ UiLog().dbg() << "ServerList::readRcFile -->";
+ std::string path(DirectoryHandler::concatenate(DirectoryHandler::rcDir(), "servers"));
+ UiLog().dbg() << " Read servers from ecflowview rcfile: " << path;
std::ifstream in(path.c_str());
if(in.good())
@@ -276,46 +353,19 @@ bool ServerList::readRcFile()
}
if(vec.size() >= 3)
- {
- add(vec[0],vec[1],vec[2],false,false);
- }
- }
- }
- else
- return false;
-
- in.close();
-
- return true;
-}
-
-#if 0
-bool ServerList::readSystemFile()
-{
- std::string path(DirectoryHandler::concatenate(DirectoryHandler::shareDir(), "servers"));
- std::ifstream in(path.c_str());
-
- if(in.good())
- {
- std::string line;
- while(getline(in,line))
- {
- std::string buf=boost::trim_left_copy(line);
- if(buf.size() >0 && buf.at(0) == '#')
- continue;
-
- std::stringstream ssdata(line);
- std::vector<std::string> vec;
-
- while(ssdata >> buf)
- {
- vec.push_back(buf);
- }
-
- if(vec.size() >= 3)
- {
- ServerItem *item=add(vec[0],vec[1],vec[2],false,false);
- item->setSystem(true);
+ {
+ std::string name=vec[0], host=vec[1], port=vec[2];
+ ServerItem* item=0;
+ try
+ {
+ add(name,host,port,false,false);
+ }
+ catch(std::exception& e)
+ {
+ std::string err=e.what();
+ UiLog().err() << " Failed to read server (name=" << name << ",host=" << host <<
+ ",port=" << port << "). " << err;
+ }
}
}
}
@@ -326,8 +376,6 @@ bool ServerList::readSystemFile()
return true;
}
-#endif
-
bool ServerList::hasSystemFile() const
{
@@ -337,9 +385,7 @@ bool ServerList::hasSystemFile() const
void ServerList::syncSystemFile()
{
-#ifdef _UI_SERVERLIST_DEBUG
UiLog().dbg() << "ServerList::syncSystemFile -->";
-#endif
std::vector<ServerListTmpItem> sysVec;
std::ifstream in(systemFile_.c_str());
@@ -366,7 +412,11 @@ void ServerList::syncSystemFile()
if(vec.size() >= 3)
{
- sysVec.push_back(ServerListTmpItem(vec[0],vec[1],vec[2]));
+ std::string errStr,name=vec[0], host=vec[1], port=vec[2];
+ if(checkItemToAdd(name,host,port,false,errStr))
+ {
+ sysVec.push_back(ServerListTmpItem(vec[0],vec[1],vec[2]));
+ }
}
}
}
@@ -417,10 +467,22 @@ void ServerList::syncSystemFile()
UiLog().dbg() << " name not in list -> import as system";
#endif
changed=true;
- item=add(sysVec[i].name(),sysVec[i].host(),sysVec[i].port(), false, false);
- item->setSystem(true);
- syncChange_.push_back(new ServerListSyncChangeItem(sysVec[i],sysVec[i],
- ServerListSyncChangeItem::AddedChange));
+ std::string name=sysVec[i].name(),host=sysVec[i].host(), port=sysVec[i].port();
+ try
+ {
+ item=add(name,host,port,false,false);
+ UI_ASSERT(item != 0,"name=" << name << " host=" << host
+ << " port=" << port);
+ item->setSystem(true);
+ syncChange_.push_back(new ServerListSyncChangeItem(sysVec[i],sysVec[i],
+ ServerListSyncChangeItem::AddedChange));
+ }
+ catch(std::exception& e)
+ {
+ std::string err=e.what();
+ UiLog().err() << " Could not sync server (name=" << name << ",host=" << host <<
+ "port=" << port << "). " << err;
+ }
continue;
}
//There is a server with the same name but with different host or/and port
diff --git a/Viewer/src/ServerList.hpp b/Viewer/src/ServerList.hpp
index a914683..8231ac2 100644
--- a/Viewer/src/ServerList.hpp
+++ b/Viewer/src/ServerList.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -32,10 +32,10 @@ class ServerListTmpItem
{
public:
ServerListTmpItem() {}
- ServerListTmpItem(const std::string name,const std::string& host, const std::string& port) :
+ ServerListTmpItem(const std::string& name,const std::string& host, const std::string& port) :
name_(name), host_(host), port_(port) {}
explicit ServerListTmpItem(ServerItem* item);
- ServerListTmpItem(const ServerListTmpItem& o) {name_=o.name_; host_=o.host_; port_=o.port_;}
+ ServerListTmpItem(const ServerListTmpItem& o) : name_(o.name_), host_(o.host_), port_(o.port_) {}
const std::string& name() const {return name_;}
const std::string& host() const {return host_;}
@@ -67,7 +67,7 @@ public:
class ServerList
{
public:
- int count() {return static_cast<int>(items_.size());}
+ int count() const {return static_cast<int>(items_.size());}
ServerItem* itemAt(int);
ServerItem* find(const std::string& name);
ServerItem* find(const std::string& name, const std::string& host, const std::string& port);
@@ -80,7 +80,7 @@ public:
std::string uniqueName(const std::string&);
- void init();
+ void init();
void save();
void rescan();
void syncSystemFile();
@@ -104,6 +104,8 @@ protected:
bool readRcFile();
//bool readSystemFile();
void clearSyncChange();
+ bool checkItemToAdd(const std::string& name,const std::string& host,const std::string& port,
+ bool checkDuplicate,std::string& errStr);
void broadcastChanged();
void broadcastChanged(ServerItem*);
diff --git a/Viewer/src/ServerListDialog.cpp b/Viewer/src/ServerListDialog.cpp
index 8543225..9ad5a5c 100644
--- a/Viewer/src/ServerListDialog.cpp
+++ b/Viewer/src/ServerListDialog.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -12,7 +12,6 @@
#include <QtGlobal>
#include <QCloseEvent>
-#include <QDebug>
#include <QMessageBox>
#include <QPushButton>
#include <QSettings>
@@ -401,8 +400,16 @@ void ServerListDialog::addItem()
if(d.exec() == QDialog::Accepted)
{
model_->dataIsAboutToChange();
- ServerItem* item=ServerList::instance()->add(d.name().toStdString(),d.host().toStdString(),d.port().toStdString(),false);
- model_->dataChangeFinished();
+ ServerItem* item=0;
+ try {
+ item=ServerList::instance()->add(d.name().toStdString(),d.host().toStdString(),d.port().toStdString(),false);
+ }
+ catch(std::exception& e)
+ {
+
+ }
+
+ model_->dataChangeFinished();
if(d.addToView() && filter_)
{
filter_->addServer(item);
@@ -522,8 +529,7 @@ void ServerListDialog::on_sysSyncLogTb_toggled(bool b)
firstShowSysSyncLogW=false;
//Set the initial splitter sizes
- QList<int> sList=splitter_->sizes();
- qDebug() << "SPLITTER" << sList << splitter_->height();;
+ QList<int> sList=splitter_->sizes();
Q_ASSERT(sList.count()==2);
int h=sList[0]+sList[1];
if(h==0)
@@ -726,9 +732,9 @@ QVariant ServerListModel::data(const QModelIndex& index, int role) const
case PortColumn: return QString::fromStdString(item->port());
case UseColumn:
{
- int i=item->useCnt();
- if(item->useCnt() > 0)
- return "loaded (" + QString::number(item->useCnt()) + ")";
+ int n=item->useCnt();
+ if(n > 0)
+ return "loaded (" + QString::number(n) + ")";
return QVariant();
}
@@ -849,7 +855,6 @@ bool ServerListModel::setData(const QModelIndex& idx, const QVariant & value, in
{
if(filter_ && idx.column() == LoadColumn && role == Qt::CheckStateRole)
{
- int row=idx.row();
if(ServerItem* item=ServerList::instance()->itemAt(idx.row()))
{
bool checked=(value.toInt() == Qt::Checked)?true:false;
diff --git a/Viewer/src/ServerListDialog.hpp b/Viewer/src/ServerListDialog.hpp
index f565aaf..fc34e32 100644
--- a/Viewer/src/ServerListDialog.hpp
+++ b/Viewer/src/ServerListDialog.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ServerListSyncWidget.cpp b/Viewer/src/ServerListSyncWidget.cpp
index a3d85f2..c89e316 100644
--- a/Viewer/src/ServerListSyncWidget.cpp
+++ b/Viewer/src/ServerListSyncWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ServerListSyncWidget.hpp b/Viewer/src/ServerListSyncWidget.hpp
index 7fabf36..126f23d 100644
--- a/Viewer/src/ServerListSyncWidget.hpp
+++ b/Viewer/src/ServerListSyncWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ServerObserver.hpp b/Viewer/src/ServerObserver.hpp
index 091c2fe..60d5378 100644
--- a/Viewer/src/ServerObserver.hpp
+++ b/Viewer/src/ServerObserver.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ServerSettingsItemWidget.cpp b/Viewer/src/ServerSettingsItemWidget.cpp
index 52d8111..395e2e0 100644
--- a/Viewer/src/ServerSettingsItemWidget.cpp
+++ b/Viewer/src/ServerSettingsItemWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ServerSettingsItemWidget.hpp b/Viewer/src/ServerSettingsItemWidget.hpp
index f23e0ce..42bc4d7 100644
--- a/Viewer/src/ServerSettingsItemWidget.hpp
+++ b/Viewer/src/ServerSettingsItemWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/SessionDialog.cpp b/Viewer/src/SessionDialog.cpp
index 75be8cb..6b810a1 100644
--- a/Viewer/src/SessionDialog.cpp
+++ b/Viewer/src/SessionDialog.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/SessionDialog.hpp b/Viewer/src/SessionDialog.hpp
index 514859a..9d7196c 100644
--- a/Viewer/src/SessionDialog.hpp
+++ b/Viewer/src/SessionDialog.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/SessionHandler.cpp b/Viewer/src/SessionHandler.cpp
index 1ec11d1..3b36cd7 100644
--- a/Viewer/src/SessionHandler.cpp
+++ b/Viewer/src/SessionHandler.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -36,7 +36,7 @@ SessionItem::~SessionItem()
if (isTemporary_)
{
std::string msg;
- bool ok = DirectoryHandler::removeDir(dirPath_, msg);
+ DirectoryHandler::removeDir(dirPath_, msg);
}
}
@@ -79,6 +79,11 @@ std::string SessionItem::serverFile(const std::string& serverName) const
return DirectoryHandler::concatenate(dirPath_, serverName + ".conf.json");
}
+std::string SessionItem::infoPanelDialogFile() const
+{
+ return DirectoryHandler::concatenate(dirPath_, "info_panel_dialog.json");
+}
+
std::string SessionItem::qtDir() const
{
return qtPath_;
@@ -328,13 +333,12 @@ void SessionHandler::setTemporarySessionIfReqested()
// does this exact server already exist in the user's list?
std::string host(sh);
- std::string port(sp);
- ServerItem *serverItem = ServerList::instance()->find(alias, host, port);
- if (!serverItem)
+ std::string port(sp);
+ if(ServerList::instance()->find(alias, host, port) == 0)
{
// no - add it, and make sure it's got a unique alias
std::string uniqueName = ServerList::instance()->uniqueName(alias);
- serverItem = ServerList::instance()->add(uniqueName, host, port, false, true);
+ ServerList::instance()->add(uniqueName, host, port, false, true);
}
}
}
diff --git a/Viewer/src/SessionHandler.hpp b/Viewer/src/SessionHandler.hpp
index 2e218da..ba04aa9 100644
--- a/Viewer/src/SessionHandler.hpp
+++ b/Viewer/src/SessionHandler.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -31,14 +31,15 @@ public:
std::string recentCustomCommandsFile() const ;
std::string savedCustomCommandsFile() const ;
std::string serverFile(const std::string& serverName) const;
+ std::string infoPanelDialogFile() const;
std::string qtDir() const;
- std::string qtSettingsFile(const std::string name) const;
- void temporary(bool t) {isTemporary_ = t;};
- bool temporary() {return isTemporary_;};
- void temporaryServerAlias(const std::string &alias) {temporaryServerAlias_ = alias;};
- std::string temporaryServerAlias() {return temporaryServerAlias_;};
- void askToPreserveTemporarySession(bool a) {askToPreserveTemporarySession_ = a;};
- bool askToPreserveTemporarySession() {return askToPreserveTemporarySession_;};
+ std::string qtSettingsFile(const std::string name) const;
+ void temporary(bool t) {isTemporary_ = t;}
+ bool temporary() const {return isTemporary_;}
+ void temporaryServerAlias(const std::string &alias) {temporaryServerAlias_ = alias;}
+ std::string temporaryServerAlias() const {return temporaryServerAlias_;}
+ void askToPreserveTemporarySession(bool a) {askToPreserveTemporarySession_ = a;}
+ bool askToPreserveTemporarySession() {return askToPreserveTemporarySession_;}
protected:
void checkDir();
@@ -65,17 +66,17 @@ public:
SessionItem* current();
void save();
void load();
- int numSessions() {return sessions_.size();};
+ int numSessions() {return sessions_.size();}
SessionItem *find(const std::string&);
- int indexFromName(const std::string&);
- SessionItem *sessionFromIndex(int i) {return sessions_[i];};
+ int indexFromName(const std::string&);
+ SessionItem *sessionFromIndex(int i) {return sessions_[i];}
SessionItem *copySession(SessionItem* source, std::string &destName);
SessionItem *copySession(std::string &source, std::string &destName);
bool createSessionDirWithTemplate(const std::string &sessionName, const std::string &templateFile);
void saveLastSessionName();
void removeLastSessionName();
bool loadLastSessionAtStartup();
- std::string lastSessionName() {return lastSessionName_;};
+ std::string lastSessionName() {return lastSessionName_;}
const std::vector<SessionItem*>& sessions() const {return sessions_;}
@@ -89,7 +90,7 @@ public:
protected:
void readSessionListFromDisk();
- std::string defaultSessionName() {return "default";};
+ std::string defaultSessionName() {return "default";}
void readLastSessionName();
static SessionHandler* instance_;
diff --git a/Viewer/src/SessionRenameDialog.cpp b/Viewer/src/SessionRenameDialog.cpp
index 26a3821..d79f9ff 100644
--- a/Viewer/src/SessionRenameDialog.cpp
+++ b/Viewer/src/SessionRenameDialog.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/SessionRenameDialog.hpp b/Viewer/src/SessionRenameDialog.hpp
index 708b89e..b008fb2 100644
--- a/Viewer/src/SessionRenameDialog.hpp
+++ b/Viewer/src/SessionRenameDialog.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/Sound.cpp b/Viewer/src/Sound.cpp
index 9b04f82..e9e5c09 100644
--- a/Viewer/src/Sound.cpp
+++ b/Viewer/src/Sound.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/Sound.hpp b/Viewer/src/Sound.hpp
index 43d53d2..19b896e 100644
--- a/Viewer/src/Sound.hpp
+++ b/Viewer/src/Sound.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/StringMatchCombo.cpp b/Viewer/src/StringMatchCombo.cpp
index 1ce393e..0ad7fde 100644
--- a/Viewer/src/StringMatchCombo.cpp
+++ b/Viewer/src/StringMatchCombo.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/StringMatchCombo.hpp b/Viewer/src/StringMatchCombo.hpp
index 3c01bd2..330202a 100644
--- a/Viewer/src/StringMatchCombo.hpp
+++ b/Viewer/src/StringMatchCombo.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/StringMatchMode.cpp b/Viewer/src/StringMatchMode.cpp
index c7fe2e5..017eaeb 100644
--- a/Viewer/src/StringMatchMode.cpp
+++ b/Viewer/src/StringMatchMode.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/StringMatchMode.hpp b/Viewer/src/StringMatchMode.hpp
index 00d49e4..defd0ec 100644
--- a/Viewer/src/StringMatchMode.hpp
+++ b/Viewer/src/StringMatchMode.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/SuiteFilter.cpp b/Viewer/src/SuiteFilter.cpp
index 287b933..10cfe36 100644
--- a/Viewer/src/SuiteFilter.cpp
+++ b/Viewer/src/SuiteFilter.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/SuiteFilter.hpp b/Viewer/src/SuiteFilter.hpp
index 3d63e86..f958ece 100644
--- a/Viewer/src/SuiteFilter.hpp
+++ b/Viewer/src/SuiteFilter.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/SuiteFilterObserver.hpp b/Viewer/src/SuiteFilterObserver.hpp
index 94a5804..14aea58 100644
--- a/Viewer/src/SuiteFilterObserver.hpp
+++ b/Viewer/src/SuiteFilterObserver.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/SuiteItemWidget.cpp b/Viewer/src/SuiteItemWidget.cpp
index 33e33ff..87e7772 100644
--- a/Viewer/src/SuiteItemWidget.cpp
+++ b/Viewer/src/SuiteItemWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/SuiteItemWidget.hpp b/Viewer/src/SuiteItemWidget.hpp
index 09d71cf..7c3ad28 100644
--- a/Viewer/src/SuiteItemWidget.hpp
+++ b/Viewer/src/SuiteItemWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/SuiteModel.cpp b/Viewer/src/SuiteModel.cpp
index 5751a9a..a02ed31 100644
--- a/Viewer/src/SuiteModel.cpp
+++ b/Viewer/src/SuiteModel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -9,8 +9,6 @@
#include "SuiteModel.hpp"
-#include <QDebug>
-
#include "ServerHandler.hpp"
#include "SuiteFilter.hpp"
#include "VNode.hpp"
@@ -153,7 +151,6 @@ QVariant SuiteModel::data( const QModelIndex& index, int role ) const
//{
// return QVariant();
//}
- //qDebug() << "data" << index << role;
int row=index.row();
if(row < 0 || row >= data_->count())
diff --git a/Viewer/src/TabWidget.cpp b/Viewer/src/TabWidget.cpp
index a82178c..a998df0 100644
--- a/Viewer/src/TabWidget.cpp
+++ b/Viewer/src/TabWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -9,7 +9,6 @@
#include "TabWidget.hpp"
-#include <QDebug>
#include <QAction>
#include <QLabel>
#include <QMenu>
@@ -29,14 +28,11 @@ void IconTabBar::paintEvent(QPaintEvent *e)
{
QStyleOptionTabV2 option;
initStyleOption(&option, i);
- qDebug() << i << option.iconSize;
painter.drawItemPixmap(option.rect, Qt::AlignTop|Qt::AlignHCenter, option.icon.pixmap(option.iconSize));
//painter.drawItemText(option.rect, Qt::AlignBottom|Qt::AlignHCenter, palette(), 1, option.text);
-
}
}
-
TabWidget::TabWidget(QWidget* parent) :
QWidget(parent),
beingCleared_(false)
diff --git a/Viewer/src/TabWidget.hpp b/Viewer/src/TabWidget.hpp
index 4394d1e..00a41a7 100644
--- a/Viewer/src/TabWidget.hpp
+++ b/Viewer/src/TabWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TableFilterWidget.cpp b/Viewer/src/TableFilterWidget.cpp
index 8c03ad8..633d096 100644
--- a/Viewer/src/TableFilterWidget.cpp
+++ b/Viewer/src/TableFilterWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TableFilterWidget.hpp b/Viewer/src/TableFilterWidget.hpp
index a9d968b..d6de877 100644
--- a/Viewer/src/TableFilterWidget.hpp
+++ b/Viewer/src/TableFilterWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TableNodeModel.cpp b/Viewer/src/TableNodeModel.cpp
index 4fb27bb..cffbcbd 100644
--- a/Viewer/src/TableNodeModel.cpp
+++ b/Viewer/src/TableNodeModel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -15,6 +15,7 @@
#include "ServerHandler.hpp"
#include "UiLog.hpp"
#include "VAttribute.hpp"
+#include "VAttributeType.hpp"
#include "VFilter.hpp"
#include "VIcon.hpp"
#include "VModelData.hpp"
@@ -25,6 +26,17 @@
//static int hitCount=0;
+static std::map<TableNodeModel::ColumnType,VAttributeType*> attrTypes;
+static VAttributeType* columnToAttrType(TableNodeModel::ColumnType ct);
+
+VAttributeType* columnToAttrType(TableNodeModel::ColumnType ct)
+{
+ std::map<TableNodeModel::ColumnType,VAttributeType*>::const_iterator it=
+ attrTypes.find(ct);
+ return (it != attrTypes.end())?it->second:0;
+}
+
+
//=======================================================
//
// TableNodeModel
@@ -51,6 +63,18 @@ TableNodeModel::TableNodeModel(ServerFilter* serverFilter,NodeFilterDef* filterD
Q_ASSERT(columns_->id(MeterColumn) == "meter");
Q_ASSERT(columns_->id(StatusChangeColumn) == "statusChange");
+ if(attrTypes.empty())
+ {
+ QList<ColumnType> ctLst;
+ ctLst << TriggerColumn << LabelColumn << EventColumn << MeterColumn;
+ Q_FOREACH(ColumnType ct,ctLst)
+ {
+ VAttributeType* t=VAttributeType::find(columns_->id(ct).toStdString());
+ Q_ASSERT(t);
+ attrTypes[ct]=t;
+ }
+ }
+
//Create the data handler for the model.
data_=new VTableModelData(filterDef,this);
@@ -70,7 +94,7 @@ int TableNodeModel::columnCount( const QModelIndex& /*parent */ ) const
int TableNodeModel::rowCount( const QModelIndex& parent) const
{
#ifdef _UI_TABLENODEMODEL_DEBUG
- //qDebug() << "rowCount" << parent;
+ UiLog().dbg() << "rowCount=" << parent;
#endif
//There are no servers
@@ -94,7 +118,7 @@ int TableNodeModel::rowCount( const QModelIndex& parent) const
cnt+=data_->numOfNodes(i);
}
#ifdef _UI_TABLENODEMODEL_DEBUG
- //qDebug() << "table count" << cnt;
+ //UiLog().dbg() << "table count " << cnt;
#endif
return cnt;
}
@@ -131,7 +155,8 @@ QVariant TableNodeModel::nodeData(const QModelIndex& index, int role) const
//QString id=columns_->id(index.column());
if(id == PathColumn)
- { return QString::fromStdString(vnode->absNodePath());
+ {
+ return QString::fromStdString(vnode->absNodePath());
}
else if(id == StatusColumn)
return vnode->stateName();
@@ -142,11 +167,10 @@ QVariant TableNodeModel::nodeData(const QModelIndex& index, int role) const
else if(id == EventColumn || id == LabelColumn || id == MeterColumn ||
id == TriggerColumn)
{
- QStringList lst;
- if(vnode->getAttributeData(columns_->id(index.column()).toStdString(),0,lst))
- return lst;
- else
- return QVariant();
+ if(VAttribute* a=vnode->attributeForType(0,columnToAttrType(id)))
+ return a->data();
+ else
+ return QVariant();
}
else if(id == StatusChangeColumn)
@@ -281,6 +305,7 @@ QModelIndex TableNodeModel::attributeToIndex(const VAttribute* a, int column) co
QModelIndex TableNodeModel::forceShowNode(const VNode* node) const
{
+#if 0
if(!node)
return QModelIndex();
@@ -294,21 +319,25 @@ QModelIndex TableNodeModel::forceShowNode(const VNode* node) const
server->setForceShowNode(node);
return nodeToIndex(node);
}
-
+#endif
return QModelIndex();
}
QModelIndex TableNodeModel::forceShowAttribute(const VAttribute* a) const
{
+#if 0
Q_ASSERT(a);
VNode* node=a->parent();
Q_ASSERT(node);
return forceShowNode(const_cast<VNode*>(node));
+#endif
+ return QModelIndex();
}
void TableNodeModel::selectionChanged(QModelIndexList lst)
{
+#if 0
Q_FOREACH(QModelIndex idx,lst)
{
VInfo_ptr info=nodeInfo(idx);
@@ -320,6 +349,7 @@ void TableNodeModel::selectionChanged(QModelIndexList lst)
ts->clearForceShow(info->item());
}
}
+#endif
}
VInfo_ptr TableNodeModel::nodeInfo(const QModelIndex& index)
@@ -421,8 +451,6 @@ void TableNodeModel::slotEndServerScan(VModelServer* server,int num)
#ifdef _UI_TABLENODEMODEL_DEBUG
UiLog().dbg() << " elapsed: " << t.elapsed() << " ms";
UiLog().dbg() << "<-- slotEndServerScan";
-
- //qDebug() << "hit" << hitCount;
#endif
}
diff --git a/Viewer/src/TableNodeModel.hpp b/Viewer/src/TableNodeModel.hpp
index b245ad0..d813674 100644
--- a/Viewer/src/TableNodeModel.hpp
+++ b/Viewer/src/TableNodeModel.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TableNodeSortModel.cpp b/Viewer/src/TableNodeSortModel.cpp
index 1c75f06..3d74a54 100644
--- a/Viewer/src/TableNodeSortModel.cpp
+++ b/Viewer/src/TableNodeSortModel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TableNodeSortModel.hpp b/Viewer/src/TableNodeSortModel.hpp
index ba55548..5dc423c 100644
--- a/Viewer/src/TableNodeSortModel.hpp
+++ b/Viewer/src/TableNodeSortModel.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TableNodeView.cpp b/Viewer/src/TableNodeView.cpp
index 98c5c3b..9e22c0e 100644
--- a/Viewer/src/TableNodeView.cpp
+++ b/Viewer/src/TableNodeView.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -11,7 +11,6 @@
#include <QtGlobal>
#include <QComboBox>
-#include <QDebug>
#include <QHBoxLayout>
#include <QHeaderView>
#include <QMenu>
@@ -218,7 +217,7 @@ void TableNodeView::handleContextMenu(QModelIndex indexClicked,QModelIndexList i
//Node actions
if(indexClicked.isValid() && indexClicked.column() == 0) //indexLst[0].isValid() && indexLst[0].column() == 0)
{
- qDebug() << "context menu" << indexClicked;
+ UiLog().dbg() << "context menu " << indexClicked;
std::vector<VInfo_ptr> nodeLst;
for(int i=0; i < indexLst.count(); i++)
@@ -245,7 +244,7 @@ void TableNodeView::slotViewCommand(std::vector<VInfo_ptr> nodeLst,QString cmd)
if(cmd == "set_as_root")
{
- qDebug() << "set as root";
+ UiLog().dbg() << "set as root";
//model_->setRootNode(nodeLst.at(0)->node());
//expandAll();
}
@@ -651,7 +650,7 @@ void TableNodeHeader::mousePressEvent(QMouseEvent *event)
{
if(it.value().rect_.contains(event->pos()))
{
- qDebug() << "header" << it.key() << "clicked";
+ UiLog().dbg() << "header " << it.key() << " clicked";
Q_EMIT customButtonClicked(it.value().id(),event->globalPos());
}
++it;
diff --git a/Viewer/src/TableNodeView.hpp b/Viewer/src/TableNodeView.hpp
index 756de60..0192cee 100644
--- a/Viewer/src/TableNodeView.hpp
+++ b/Viewer/src/TableNodeView.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TableNodeViewDelegate.cpp b/Viewer/src/TableNodeViewDelegate.cpp
index c0c936c..18a4311 100644
--- a/Viewer/src/TableNodeViewDelegate.cpp
+++ b/Viewer/src/TableNodeViewDelegate.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -9,6 +9,7 @@
#include "TableNodeViewDelegate.hpp"
+#include <QtGlobal>
#include <QApplication>
#include <QDebug>
#include <QImageReader>
@@ -24,13 +25,48 @@
static std::vector<std::string> propVec;
+//Define node renderer properties
+struct TableNodeDelegateBox : public NodeDelegateBox
+{
+ TableNodeDelegateBox() {
+ topMargin=2;
+ bottomMargin=2;
+ leftMargin=3;
+ rightMargin=0;
+ topPadding=0;
+ bottomPadding=0;
+ leftPadding=2;
+ rightPadding=1;
+ }
+};
+
+//Define attribute renderer properties
+struct TableAttrDelegateBox : public AttrDelegateBox
+{
+ TableAttrDelegateBox() {
+ topMargin=2;
+ bottomMargin=2;
+ leftMargin=1;
+ rightMargin=0;
+ topPadding=0;
+ bottomPadding=0;
+ leftPadding=0;
+ rightPadding=0;
+ }
+};
+
TableNodeViewDelegate::TableNodeViewDelegate(QWidget *parent)
{
borderPen_=QPen(QColor(230,230,230));
columns_=ModelColumn::def("table_columns");
- adjustIconSize();
+ nodeBox_=new TableNodeDelegateBox;
+ attrBox_=new TableAttrDelegateBox;
+
+ nodeBox_->adjust(font_);
+ attrFont_=font_;
+ attrBox_->adjust(attrFont_);
//Property
if(propVec.empty())
@@ -60,6 +96,8 @@ void TableNodeViewDelegate::updateSettings()
{
font_=newFont;
attrFont_=newFont;
+ nodeBox_->adjust(font_);
+ attrBox_->adjust(attrFont_);
Q_EMIT sizeHintChangedGlobal();
}
}
@@ -68,11 +106,23 @@ void TableNodeViewDelegate::updateSettings()
updateBaseSettings();
}
+QSize TableNodeViewDelegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index ) const
+{
+ QSize size=QStyledItemDelegate::sizeHint(option,index);
+ return QSize(size.width(),nodeBox_->sizeHintCache.height());
+}
+
+
void TableNodeViewDelegate::paint(QPainter *painter,const QStyleOptionViewItem &option,
const QModelIndex& index) const
{
//Background
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+ QStyleOptionViewItem vopt(option);
+#else
QStyleOptionViewItemV4 vopt(option);
+#endif
+
initStyleOption(&vopt, index);
const QStyle *style = vopt.widget ? vopt.widget->style() : QApplication::style();
@@ -81,42 +131,8 @@ void TableNodeViewDelegate::paint(QPainter *painter,const QStyleOptionViewItem &
//Save painter state
painter->save();
- //Selection - we only do it once
- /*if(index.column() == 0)
- {
- QRect fullRect=QRect(0,option.rect.y(),painter->device()->width(),option.rect.height());
-
- if(option.state & QStyle::State_Selected)
- {
- //QRect fillRect=option.rect.adjusted(0,1,-1,-textRect.height()-1);
- painter->fillRect(fullRect,selectBrush_);
- painter->setPen(selectPen_);
- painter->drawLine(fullRect.topLeft(),fullRect.topRight());
- painter->drawLine(fullRect.bottomLeft(),fullRect.bottomRight());
- }
- else if(option.state & QStyle::State_MouseOver)
- {
- //QRect fillRect=option.rect.adjusted(0,1,-1,-1);
- painter->fillRect(fullRect,hoverBrush_);
- painter->setPen(hoverPen_);
- painter->drawLine(fullRect.topLeft(),fullRect.topRight());
- painter->drawLine(fullRect.bottomLeft(),fullRect.bottomRight());
- }
- }*/
-
- //Different background for lost connection?
- /* if(index.data(AbstractNodeModel::ConnectionRole).toInt() == 0)
- {
- QRect fullRect=QRect(0,option.rect.y(),painter->device()->width(),option.rect.height());
- painter->fillRect(fullRect,lostConnectBgBrush_);
- QRect bandRect=QRect(0,option.rect.y(),5,option.rect.height());
- painter->fillRect(bandRect,lostConnectBandBrush_);
-
- }*/
-
QString id=columns_->id(index.column());
-
if(id == "path")
{
QString text=index.data(Qt::DisplayRole).toString();
@@ -150,7 +166,7 @@ void TableNodeViewDelegate::paint(QPainter *painter,const QStyleOptionViewItem &
else
{
QString text=index.data(Qt::DisplayRole).toString();
- QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &vopt, widget);
+ QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &vopt,widget);
painter->setFont(font_);
painter->setPen(Qt::black);
painter->drawText(textRect,Qt::AlignLeft | Qt::AlignVCenter,text);
@@ -163,64 +179,59 @@ void TableNodeViewDelegate::paint(QPainter *painter,const QStyleOptionViewItem &
painter->setPen(borderPen_);
painter->drawLine(bgRect.topLeft(),bgRect.topRight());
-
painter->restore();
}
-
-
void TableNodeViewDelegate::renderNode(QPainter *painter,const QModelIndex& index,
- const QStyleOptionViewItemV4& option,QString text) const
+ const QStyleOptionViewItem& option,QString text) const
{
bool selected=option.state & QStyle::State_Selected;
+ QFontMetrics fm(font_);
- int offset=4;
-
- QFontMetrics fm(font_);
- int deltaH=(option.rect.height()-(fm.height()+4))/2;
-
- //The initial filled rect (we will adjust its width)
- QRect fillRect=option.rect.adjusted(offset,deltaH,0,-deltaH-1);
- if(selected)
- fillRect.adjust(0,0,0,0);
+ //The initial filled rect (we will adjust its width)
+ QRect itemRect=option.rect.adjusted(nodeBox_->leftMargin,nodeBox_->topMargin,0,-nodeBox_->bottomMargin);
//The text rectangle
- QRect textRect = fillRect.adjusted(offset,0,0,0);
+ QRect textRect = itemRect;
int textWidth=fm.width(text);
- textRect.setWidth(textWidth);
-
- //Adjust the filled rect width
- fillRect.setRight(textRect.right()+offset);
+ textRect.setWidth(textWidth+nodeBox_->leftPadding+nodeBox_->rightPadding);
- int currentRight=fillRect.right();
+ //Adjust the filled rect width
+ int currentRight=textRect.x()+textRect.width();
//Icons area
- QList<QPixmap> pixLst;
- QList<QRect> pixRectLst;
- QVariant va=index.data(AbstractNodeModel::IconRole);
- if(va.type() == QVariant::List)
- {
- QVariantList lst=va.toList();
- int xp=currentRight+5;
- int yp=textRect.center().y()-iconSize_/2;
- for(int i=0; i < lst.count(); i++)
- {
- int id=lst[i].toInt();
- if(id != -1)
- {
- pixLst << IconProvider::pixmap(id,iconSize_);
- pixRectLst << QRect(xp,yp,pixLst.back().width(),pixLst.back().height());
- xp+=pixLst.back().width()+2;
- }
- }
-
- if(!pixRectLst.isEmpty())
- currentRight=pixRectLst.back().right();
- }
+ QList<QPixmap> pixLst;
+ QList<QRect> pixRectLst;
+
+ QVariant va=index.data(AbstractNodeModel::IconRole);
+ if(va.type() == QVariant::List)
+ {
+ QVariantList lst=va.toList();
+ if(lst.count() >0)
+ {
+ int xp=currentRight+nodeBox_->iconPreGap;
+ int yp=itemRect.center().y()+1-nodeBox_->iconSize/2;
+ for(int i=0; i < lst.count(); i++)
+ {
+ int id=lst[i].toInt();
+ if(id != -1)
+ {
+ pixLst << IconProvider::pixmap(id,nodeBox_->iconSize);
+ pixRectLst << QRect(xp,yp,nodeBox_->iconSize,nodeBox_->iconSize);
+ xp+=nodeBox_->iconSize+nodeBox_->iconGap;
+ }
+ }
+
+ if(!pixLst.isEmpty())
+ {
+ currentRight=xp-nodeBox_->iconGap;
+ }
+ }
+ }
//Define clipping
- int rightPos=currentRight+1;
+ int rightPos=currentRight+1;
const bool setClipRect = rightPos > option.rect.right();
if(setClipRect)
{
@@ -232,14 +243,14 @@ void TableNodeViewDelegate::renderNode(QPainter *painter,const QModelIndex& inde
QColor fg=index.data(Qt::ForegroundRole).value<QColor>();
painter->setPen(fg);
painter->setFont(font_);
- painter->drawText(textRect,Qt::AlignLeft | Qt::AlignVCenter,text);
+ painter->drawText(textRect,Qt::AlignHCenter | Qt::AlignVCenter,text);
if(selected)
- {
- painter->setPen(nodeSelectPen_);
- QRect selRect=textRect.adjusted(-2,0,2,0);
- painter->drawRect(selRect);
- }
+ {
+ QRect sr=textRect;
+ sr.setX(option.rect.x()+nodeBox_->leftMargin);
+ renderSelectionRect(painter,sr);
+ }
//Draw icons
for(int i=0; i < pixLst.count(); i++)
diff --git a/Viewer/src/TableNodeViewDelegate.hpp b/Viewer/src/TableNodeViewDelegate.hpp
index ee090c4..142a3b6 100644
--- a/Viewer/src/TableNodeViewDelegate.hpp
+++ b/Viewer/src/TableNodeViewDelegate.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -31,6 +31,7 @@ public:
explicit TableNodeViewDelegate(QWidget *parent=0);
~TableNodeViewDelegate();
+ QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index ) const;
void paint(QPainter *painter,const QStyleOptionViewItem &option,
const QModelIndex& index) const;
@@ -41,7 +42,7 @@ protected:
void updateSettings();
void renderNode(QPainter *painter,const QModelIndex& index,
- const QStyleOptionViewItemV4& option,QString text) const;
+ const QStyleOptionViewItem& option,QString text) const;
ModelColumn* columns_;
QPen borderPen_;
diff --git a/Viewer/src/TableNodeWidget.cpp b/Viewer/src/TableNodeWidget.cpp
index d1562ed..30869e1 100644
--- a/Viewer/src/TableNodeWidget.cpp
+++ b/Viewer/src/TableNodeWidget.cpp
@@ -1,6 +1,6 @@
/***************************** LICENSE START ***********************************
- Copyright 2016 ECMWF and INPE. This software is distributed under the terms
+ Copyright 2009-2017 ECMWF and INPE. This software is distributed under the terms
of the Apache License version 2.0. In applying this license, ECMWF does not
waive the privileges and immunities granted to it by virtue of its status as
an Intergovernmental Organization or submit itself to any jurisdiction.
@@ -34,6 +34,8 @@ TableNodeWidget::TableNodeWidget(ServerFilter* serverFilter,QWidget * parent) :
//Init qt-creator form
setupUi(this);
+ bcWidget_=new NodePathWidget(this);
+
//This defines how to filter the nodes in the tree. We only want to filter according to node status.
filterDef_=new NodeFilterDef(serverFilter_,NodeFilterDef::GeneralScope);
@@ -87,7 +89,7 @@ TableNodeWidget::TableNodeWidget(ServerFilter* serverFilter,QWidget * parent) :
//This will not emit the trigered signal of the action!!
//Synchronise the action and the breadcrumbs state
- actionBreadcrumbs->setChecked(bcWidget_->active());
+ actionBreadcrumbs->setChecked(bcWidget_->isGuiMode());
//The node status filter is exposed via a menu. So we need a reference to it.
states_=filterDef_->nodeState();
@@ -121,8 +123,11 @@ void TableNodeWidget::populateDockTitleBar(DashboardDockTitleWidget* tw)
//Sets the menu on the toolbutton
tw->optionsTb()->setMenu(menu);
+ //Add the bc to the titlebar
+ tw->setBcWidget(bcWidget_);
+
//Sets the title
- tw->slotUpdateTitle("<b>Table</b>");
+ //tw->slotUpdateTitle("<b>Table</b>");
QList<QAction*> acLst;
QAction* acFilterEdit=new QAction(this);
@@ -147,15 +152,14 @@ void TableNodeWidget::slotSelectionChangedInView(VInfo_ptr info)
void TableNodeWidget::on_actionBreadcrumbs_triggered(bool b)
{
- if(b)
- {
- bcWidget_->active(true);
- bcWidget_->setPath(view_->currentSelection());
- }
- else
- {
- bcWidget_->active(false);
- }
+ if(b)
+ {
+ bcWidget_->setMode(NodePathWidget::GuiMode);
+ }
+ else
+ {
+ bcWidget_->setMode(NodePathWidget::TextMode);
+ }
}
void TableNodeWidget::rerender()
@@ -205,7 +209,7 @@ void TableNodeWidget::readSettings(VSettings* vs)
//Synchronise the action and the breadcrumbs state
//This will not emit the trigered signal of the action!!
- actionBreadcrumbs->setChecked(bcWidget_->active());
+ actionBreadcrumbs->setChecked(bcWidget_->isGuiMode());
view_->readSettings(vs);
diff --git a/Viewer/src/TableNodeWidget.hpp b/Viewer/src/TableNodeWidget.hpp
index 491a6c3..81b01a9 100644
--- a/Viewer/src/TableNodeWidget.hpp
+++ b/Viewer/src/TableNodeWidget.hpp
@@ -1,6 +1,6 @@
/***************************** LICENSE START ***********************************
- Copyright 2015 ECMWF and INPE. This software is distributed under the terms
+ Copyright 2009-2017 ECMWF and INPE. This software is distributed under the terms
of the Apache License version 2.0. In applying this license, ECMWF does not
waive the privileges and immunities granted to it by virtue of its status as
an Intergovernmental Organization or submit itself to any jurisdiction.
diff --git a/Viewer/src/TableNodeWidget.ui b/Viewer/src/TableNodeWidget.ui
index eca75b6..f2bc2b1 100644
--- a/Viewer/src/TableNodeWidget.ui
+++ b/Viewer/src/TableNodeWidget.ui
@@ -17,17 +17,23 @@
<property name="spacing">
<number>0</number>
</property>
- <property name="margin">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
<number>0</number>
</property>
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="1">
+ <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="">
<property name="spacing">
<number>1</number>
</property>
- <item>
- <widget class="NodePathWidget" name="bcWidget_" native="true"/>
- </item>
</layout>
</item>
<item>
@@ -58,20 +64,12 @@
</widget>
<customwidgets>
<customwidget>
- <class>NodePathWidget</class>
- <extends>QWidget</extends>
- <header>NodePathWidget.hpp</header>
- <container>1</container>
- </customwidget>
- <customwidget>
<class>TableFilterWidget</class>
<extends>QWidget</extends>
<header>TableFilterWidget.hpp</header>
<container>1</container>
</customwidget>
</customwidgets>
- <resources>
- <include location="viewer.qrc"/>
- </resources>
+ <resources/>
<connections/>
</ui>
diff --git a/Viewer/src/TextEditSearchLine.cpp b/Viewer/src/TextEditSearchLine.cpp
index 65835f6..6a57534 100644
--- a/Viewer/src/TextEditSearchLine.cpp
+++ b/Viewer/src/TextEditSearchLine.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TextEditSearchLine.hpp b/Viewer/src/TextEditSearchLine.hpp
index 832ee61..859d933 100644
--- a/Viewer/src/TextEditSearchLine.hpp
+++ b/Viewer/src/TextEditSearchLine.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TextPager/TextPagerDocument.cpp b/Viewer/src/TextPager/TextPagerDocument.cpp
index daaa270..235eb51 100644
--- a/Viewer/src/TextPager/TextPagerDocument.cpp
+++ b/Viewer/src/TextPager/TextPagerDocument.cpp
@@ -469,20 +469,16 @@ TextPagerCursor TextPagerDocument::find(const QRegExp ®exp, const TextPagerCu
} else {
it.setMaxBoundary(limit);
}
- const QLatin1Char newline('\n');
- int last = pos;
+ const QLatin1Char newline('\n');
bool ok = true;
int progressInterval = 0;
- int lastProgress = pos;
- const int initialPos = pos;
- int maxFindLength = 0;
const FindScope scope(flags & FindAllowInterrupt ? &d->findState : 0);
QTime lastProgressTime;
if (flags & FindAllowInterrupt) {
progressInterval = qMax<int>(1, (reverse
? (static_cast<qreal>(pos) / static_cast<qreal>(TEXTDOCUMENT_FIND_INTERVAL_PERCENTAGE))
: (static_cast<qreal>(d->documentSize) - static_cast<qreal>(pos)) / 100.0));
- maxFindLength = (reverse ? pos : d->documentSize - pos);
+ //maxFindLength = (reverse ? pos : d->documentSize - pos);
lastProgressTime.start();
}
@@ -672,18 +668,14 @@ TextPagerCursor TextPagerDocument::find(const QString &in, const TextPagerCursor
bool ok = true;
QChar ch = it.current();
- int wordIndex = 0;
- int progressInterval = 0;
- int lastProgress = pos;
- const int initialPos = pos;
- int maxFindLength = 0;
+ //int progressInterval = 0;
const FindScope scope(flags & FindAllowInterrupt ? &d->findState : 0);
QTime lastProgressTime;
if (flags & FindAllowInterrupt) {
- progressInterval = qMax<int>(1, (reverse
- ? (static_cast<qreal>(pos) / static_cast<qreal>(TEXTDOCUMENT_FIND_INTERVAL_PERCENTAGE))
- : (static_cast<qreal>(d->documentSize) - static_cast<qreal>(pos)) / 100.0));
- maxFindLength = (reverse ? pos : d->documentSize - pos);
+ //progressInterval = qMax<int>(1, (reverse
+ // ? (static_cast<qreal>(pos) / static_cast<qreal>(TEXTDOCUMENT_FIND_INTERVAL_PERCENTAGE))
+ // : (static_cast<qreal>(d->documentSize) - static_cast<qreal>(pos)) / 100.0));
+ //maxFindLength = (reverse ? pos : d->documentSize - pos);
lastProgressTime.start();
}
diff --git a/Viewer/src/TextPager/TextPagerEdit.cpp b/Viewer/src/TextPager/TextPagerEdit.cpp
index 648db82..846101e 100644
--- a/Viewer/src/TextPager/TextPagerEdit.cpp
+++ b/Viewer/src/TextPager/TextPagerEdit.cpp
@@ -43,6 +43,7 @@ TextPagerEdit::TextPagerEdit(QWidget *parent) :
QAbstractScrollArea(parent),
d(new TextEditPrivate(this)),
useSearchHighlight_(false),
+ showLineNum_(false),
lineNumArea_(0),
fontProp_(NULL)
{
@@ -501,7 +502,8 @@ void TextPagerEdit::mousePressEvent(QMouseEvent *e)
e->accept();
//The cursor changed so wee need to update the selected line number
- lineNumArea_->update();
+ if(lineNumArea_ && showLineNum_)
+ lineNumArea_->update();
}
else {
QAbstractScrollArea::mousePressEvent(e);
@@ -570,7 +572,8 @@ void TextPagerEdit::mouseMoveEvent(QMouseEvent *e)
setCursorPosition(pos, TextPagerCursor::KeepAnchor);
//The cursor changed so wee need to update the selected line number
- lineNumArea_->update();
+ if(lineNumArea_ && showLineNum_)
+ lineNumArea_->update();
return;
}
@@ -805,7 +808,8 @@ void TextPagerEdit::changeEvent(QEvent *e)
d->adjustVerticalScrollBar();
- lineNumArea_->updateWidth();
+ if(lineNumArea_ && showLineNum_)
+ lineNumArea_->updateWidth();
d->layoutDirty = true;
viewport()->update();
@@ -1785,6 +1789,17 @@ void TextPagerEdit::notifyChange(VProperty* p)
}
}
+void TextPagerEdit::setShowLineNumbers(bool b)
+{
+ showLineNum_=b;
+ if(lineNumArea_)
+ {
+ lineNumArea_->setVisible(b);
+ //Initialise the width
+ lineNumArea_->updateWidth();
+ }
+}
+
void TextPagerEdit::setLineNumberArea(TextPagerLineNumberArea *a)
{
lineNumArea_=a;
@@ -1797,7 +1812,7 @@ void TextPagerEdit::setLineNumberArea(TextPagerLineNumberArea *a)
void TextPagerEdit::lineNumberAreaPaintEvent(QPaintEvent *e)
{
- if(!lineNumArea_)
+ if(!lineNumArea_ || !showLineNum_)
return;
QPainter painter(lineNumArea_);
diff --git a/Viewer/src/TextPager/TextPagerEdit.hpp b/Viewer/src/TextPager/TextPagerEdit.hpp
index 1c6f3dc..5bf0141 100644
--- a/Viewer/src/TextPager/TextPagerEdit.hpp
+++ b/Viewer/src/TextPager/TextPagerEdit.hpp
@@ -140,6 +140,7 @@ public:
void zoomIn();
void zoomOut();
+ void setShowLineNumbers(bool b);
void setLineNumberArea(TextPagerLineNumberArea *a);
enum ActionType {
@@ -189,6 +190,7 @@ private:
TextPagerSearchHighlighter* searchHighlight_;
bool useSearchHighlight_;
+ bool showLineNum_;
TextPagerLineNumberArea* lineNumArea_;
VProperty* fontProp_;
};
diff --git a/Viewer/src/TextPager/TextPagerSearchHighlighter.cpp b/Viewer/src/TextPager/TextPagerSearchHighlighter.cpp
index 4542e80..5683810 100644
--- a/Viewer/src/TextPager/TextPagerSearchHighlighter.cpp
+++ b/Viewer/src/TextPager/TextPagerSearchHighlighter.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TextPager/TextPagerSearchHighlighter.hpp b/Viewer/src/TextPager/TextPagerSearchHighlighter.hpp
index 9aa2462..2054b0d 100644
--- a/Viewer/src/TextPager/TextPagerSearchHighlighter.hpp
+++ b/Viewer/src/TextPager/TextPagerSearchHighlighter.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TextPager/TextPagerSearchInterface.cpp b/Viewer/src/TextPager/TextPagerSearchInterface.cpp
index f7fefbb..f8afee8 100644
--- a/Viewer/src/TextPager/TextPagerSearchInterface.cpp
+++ b/Viewer/src/TextPager/TextPagerSearchInterface.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TextPager/TextPagerSearchInterface.hpp b/Viewer/src/TextPager/TextPagerSearchInterface.hpp
index ff2af3d..b75c3f8 100644
--- a/Viewer/src/TextPager/TextPagerSearchInterface.hpp
+++ b/Viewer/src/TextPager/TextPagerSearchInterface.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TextPager/TextPagerWidget.cpp b/Viewer/src/TextPager/TextPagerWidget.cpp
index fb69582..606f1d9 100644
--- a/Viewer/src/TextPager/TextPagerWidget.cpp
+++ b/Viewer/src/TextPager/TextPagerWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TextPager/TextPagerWidget.hpp b/Viewer/src/TextPager/TextPagerWidget.hpp
index 7196ee8..cb7fc0e 100644
--- a/Viewer/src/TextPager/TextPagerWidget.hpp
+++ b/Viewer/src/TextPager/TextPagerWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TimeItemWidget.cpp b/Viewer/src/TimeItemWidget.cpp
index 9c0d82f..f297f5d 100644
--- a/Viewer/src/TimeItemWidget.cpp
+++ b/Viewer/src/TimeItemWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TimeItemWidget.hpp b/Viewer/src/TimeItemWidget.hpp
index 1b3b716..a3039e4 100644
--- a/Viewer/src/TimeItemWidget.hpp
+++ b/Viewer/src/TimeItemWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TreeNodeModel.cpp b/Viewer/src/TreeNodeModel.cpp
index a7c1825..99c10bf 100644
--- a/Viewer/src/TreeNodeModel.cpp
+++ b/Viewer/src/TreeNodeModel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -9,7 +9,6 @@
#include "TreeNodeModel.hpp"
-#include <QDebug>
#include <QMetaMethod>
#include "ConnectState.hpp"
@@ -71,8 +70,6 @@ int TreeNodeModel::columnCount( const QModelIndex& /*parent */ ) const
int TreeNodeModel::rowCount( const QModelIndex& parent) const
{
- //qDebug() << "rowCount" << parent;
-
//There is no data at all
if(!hasData())
{
@@ -117,67 +114,77 @@ Qt::ItemFlags TreeNodeModel::flags ( const QModelIndex & index) const
return defaultFlags;
}
-QVariant TreeNodeModel::data( const QModelIndex& index, int role ) const
+//This function can be called billions of times, so it has to be extremely fast.
+QVariant TreeNodeModel::data(const QModelIndex& index, int role ) const
{
- //Data lookup can be costly so we immediately return a default value for all
- //the cases where the default should be used.
- if( !index.isValid() ||
- (role != Qt::DisplayRole && role != Qt::ToolTipRole && role != Qt::BackgroundRole &&
- role != Qt::ForegroundRole &&
- role != IconRole && role != ServerRole && role != NodeNumRole &&
- role != InfoRole && role != LoadRole && role != ConnectionRole && role != AttributeRole && role != AttributeLineRole &&
- role != AbortedReasonRole && role != NodeTypeRole && role != NodeTypeForegroundRole && role != ServerPointerRole))
+ //Data lookup can be costly so we only enter the function for the valid cases
+ if(index.isValid() && (role > Qt::UserRole || role == Qt::DisplayRole ||
+ role == Qt::ToolTipRole || role == Qt::BackgroundRole ||
+ role == Qt::ForegroundRole))
{
- return QVariant();
- }
+ //At this point we know that the index is valid so we do not need to
+ //check it anymore.
- //Identifies server
- if(role == ServerRole)
- {
- if(isServer(index))
- return 0;
- else
- return -1;
- }
-
- if(role == AttributeRole)
- {
- return isAttribute(index);
- }
+ //This role is called millions of times when expanding or
+ //relayouting huge trees. So has to be HIGHLY optimised!!!!!
+ if(role == AttributeLineRole)
+ {
+ if(VTreeNode* node=indexToAttrParentNode(index))
+ {
+ VNode *vnode=node->vnode();
+ Q_ASSERT(vnode);
+ if(VAttribute* a=vnode->attribute(index.row(),atts_))
+ {
+ return a->lineNum();
+ }
+ }
+ return 0;
+ }
- //Server
- if(isServer(index))
- {
- if(role == AttributeLineRole)
- return 0;
+ //Identifies server
+ else if(role == ServerRole)
+ {
+ if(isServerForValid(index))
+ return 0;
+ else
+ return -1;
+ }
- return serverData(index,role);
- }
+ else if(role == AttributeRole)
+ {
+ return isAttribute(index);
+ }
- //We only continue for the relevant roles for nodes and attributes
- if(role == InfoRole || role == LoadRole)
- {
- return QVariant();
- }
+ //Server
+ else if(isServerForValid(index))
+ {
+ return serverData(index,role);
+ }
- //Node
- if(isNode(index))
- {
- if(role == AttributeLineRole)
- return 0;
+ //If we are here we can be sure that the index in not a server!
- return nodeData(index,role);
- }
+ //We only continue for the relevant roles for nodes and attributes
+ if(role == InfoRole || role == LoadRole)
+ {
+ return QVariant();
+ }
- //We only continue for the relevant roles for attributes
- if(role == IconRole)
- {
- return QVariant();
- }
+ bool itIsANode=false;
+ if(VTreeNode* node=indexToAttrParentOrNode(index,itIsANode))
+ {
+ //Attribute
+ if(itIsANode ==false)
+ {
+ return attributesData(index,role,node);
+ }
- //Attribute
- else if(isAttribute(index))
- return attributesData(index,role);
+ //Node
+ if(itIsANode)
+ {
+ return nodeData(index,role,node);
+ }
+ }
+ }
return QVariant();
}
@@ -217,8 +224,7 @@ QVariant TreeNodeModel::serverData(const QModelIndex& index,int role) const
//The number of nodes the server has
else if(role == NodeNumRole)
- {
- ConnectState* st=server->connectState();
+ {
if(server->activity() != ServerHandler::LoadActivity)
{
return server->vRoot()->totalNum();
@@ -241,19 +247,6 @@ QVariant TreeNodeModel::serverData(const QModelIndex& index,int role) const
else if(role == LoadRole)
return (server->activity() == ServerHandler::LoadActivity);
- //icon decoration
- /*else if(role == IconRole)
- {
- //TODO: add a proper iconprovider
- ConnectState* st=server->connectState();
- if(server->activity() != ServerHandler::LoadActivity &&
- st->state() != ConnectState::Normal)
- {
- return "d";
- }
- return QVariant();
- }*/
-
else if(role == IconRole)
{
if(icons_->isEmpty())
@@ -274,12 +267,11 @@ QVariant TreeNodeModel::serverData(const QModelIndex& index,int role) const
return QVariant();
}
-QVariant TreeNodeModel::nodeData(const QModelIndex& index, int role) const
+QVariant TreeNodeModel::nodeData(const QModelIndex& index, int role,VTreeNode* tnode) const
{
if(role == Qt::ToolTipRole && !nodeToolTip_)
return QVariant();
- VTreeNode* tnode=indexToNode(index);
if(!tnode)
return QVariant();
@@ -287,78 +279,77 @@ QVariant TreeNodeModel::nodeData(const QModelIndex& index, int role) const
if(!vnode || !vnode->node())
return QVariant();
- if(index.column() == 0)
- {
- //The colour of the server node
- if(role == ConnectionRole)
- {
- return (vnode->server()->connectState()->state() == ConnectState::Lost)?0:1;
- }
-
- else if(role == Qt::DisplayRole)
- return vnode->name();
+ if(role == NodePointerRole)
+ return qVariantFromValue((void *) vnode);
- else if(role == Qt::BackgroundRole)
- {
- if(vnode->isSuspended())
- {
- QVariantList lst;
- lst << vnode->stateColour() << vnode->realStateColour();
- return lst;
- }
- else
- return vnode->stateColour() ;
- }
+ else if(role == ConnectionRole)
+ {
+ return (vnode->server()->connectState()->state() == ConnectState::Lost)?0:1;
+ }
- else if(role == Qt::ForegroundRole)
- return vnode->stateFontColour();
+ else if(role == Qt::DisplayRole)
+ return vnode->name();
- else if(role == NodeTypeRole)
+ else if(role == Qt::BackgroundRole)
+ {
+ if(vnode->isSuspended())
{
- if(vnode->isTask()) return 2;
- else if(vnode->isSuite()) return 0;
- else if(vnode->isFamily()) return 1;
- else if(vnode->isAlias()) return 3;
- return 0;
+ QVariantList lst;
+ lst << vnode->stateColour() << vnode->realStateColour();
+ return lst;
}
- else if(role == NodeTypeForegroundRole)
+ else
+ return vnode->stateColour() ;
+ }
+
+ else if(role == Qt::ForegroundRole)
+ return vnode->stateFontColour();
+
+ else if(role == NodeTypeRole)
+ {
+ if(vnode->isTask()) return 2;
+ else if(vnode->isSuite()) return 0;
+ else if(vnode->isFamily()) return 1;
+ else if(vnode->isAlias()) return 3;
+ return 0;
+ }
+ else if(role == NodeTypeForegroundRole)
+ {
+ return vnode->typeFontColour();
+ }
+ else if(role == IconRole)
+ {
+ if(icons_->isEmpty())
+ return QVariant();
+ else
+ return VIcon::pixmapList(vnode,icons_);
+ }
+ else if(role == Qt::ToolTipRole)
+ {
+ QString txt=vnode->toolTip();
+ txt+=VIcon::toolTip(vnode,icons_);
+ return txt;
+ }
+
+ //The number of nodes a suite has
+ else if(role == NodeNumRole)
+ {
+ if(vnode->isTopLevel())
{
- return vnode->typeFontColour();
+ if(data_->isFilterComplete())
+ return vnode->server()->vRoot()->totalNumOfTopLevel(vnode);
+ else
+ return QString::number(tnode->root()->totalNumOfTopLevel(tnode)) + "/" +
+ QString::number(vnode->server()->vRoot()->totalNumOfTopLevel(vnode));
}
- else if(role == IconRole)
- {
- if(icons_->isEmpty())
- return QVariant();
- else
- return VIcon::pixmapList(vnode,icons_);
- }
- else if(role == Qt::ToolTipRole)
- {
- QString txt=vnode->toolTip();
- txt+=VIcon::toolTip(vnode,icons_);
- return txt;
- }
-
- //The number of nodes a suite has
- else if(role == NodeNumRole)
- {
- if(vnode->isTopLevel())
- {
- if(data_->isFilterComplete())
- return vnode->server()->vRoot()->totalNumOfTopLevel(vnode);
- else
- return QString::number(tnode->root()->totalNumOfTopLevel(tnode)) + "/" +
- QString::number(vnode->server()->vRoot()->totalNumOfTopLevel(vnode));
- }
- return QVariant();
- }
+ return QVariant();
+ }
- //The number of nodes a suite has
- else if(role == AbortedReasonRole && vnode->isAborted())
- {
- return QString::fromStdString(vnode->abortedReason());
- }
- }
+ //The number of nodes a suite has
+ else if(role == AbortedReasonRole && vnode->isAborted())
+ {
+ return QString::fromStdString(vnode->abortedReason());
+ }
return QVariant();
}
@@ -369,59 +360,34 @@ QVariant TreeNodeModel::nodeData(const QModelIndex& index, int role) const
//
//=======================================================================
-QVariant TreeNodeModel::attributesData(const QModelIndex& index, int role) const
+QVariant TreeNodeModel::attributesData(const QModelIndex& index, int role,VTreeNode* tnode) const
{
if(role == Qt::ToolTipRole && !attributeToolTip_)
return QVariant();
- if(role == IconRole)
- return QVariant();
-
- if(index.column()!=0)
- return QVariant();
-
- if(role != Qt::BackgroundRole && role != Qt::DisplayRole && role != Qt::ToolTipRole && role != ConnectionRole && role != AttributeLineRole )
- return QVariant();
-
if(role == Qt::BackgroundRole)
return QColor(220,220,220);
- VTreeNode* node=0;
- //Here we have to be sure this is an attribute!
-
- if(VModelServer *mserver=data_->server(index.internalPointer()))
- {
- VTreeServer *ts=mserver->treeServer();
- Q_ASSERT(ts);
- node=ts->tree();
- Q_ASSERT(node);
- }
- else
- {
- node=static_cast<VTreeNode*>(index.internalPointer());
- }
-
- Q_ASSERT(node);
- VNode *vnode=node->vnode();
+ VNode *vnode=tnode->vnode();
Q_ASSERT(vnode);
-
if(role == ConnectionRole)
{
return (vnode->server()->connectState()->state() == ConnectState::Lost)?0:1;
}
-
else if(role == Qt::DisplayRole)
- {
- return vnode->getAttributeData(index.row(),atts_);
- }
- else if(role == AttributeLineRole)
- {
- return vnode->getAttributeLineNum(index.row(),atts_);
+ {
+ if(VAttribute* a=vnode->attribute(index.row(),atts_))
+ return a->data();
+ else
+ return QStringList();
}
else if(role == Qt::ToolTipRole)
{
- return vnode->attributeToolTip(index.row(),atts_);
+ if(VAttribute* a=vnode->attribute(index.row(),atts_))
+ return a->toolTip();
+ else
+ return QString();
}
return QVariant();
@@ -445,8 +411,7 @@ QModelIndex TreeNodeModel::index( int row, int column, const QModelIndex & paren
{
//For the server the internal pointer is NULL
if(row < data_->count())
- {
- //qDebug() << "SERVER" << parent;
+ {
return createIndex(row,column,(void*)NULL);
}
}
@@ -457,25 +422,17 @@ QModelIndex TreeNodeModel::index( int row, int column, const QModelIndex & paren
//If "parent" is a server this index refers to a topLevel node (suite).
//We set the server as an internal pointer
if(VTreeServer* server=indexToServer(parent))
- {
- //qDebug() << "NODE1" << parent << server->realServer()->name().c_str();
+ {
return createIndex(row,column,server);
}
//If "parent" is not a server it must be a tree node. The internal pointer is the parent tree node.
else if(VTreeNode* parentNode=indexToNode(parent))
- {
- //qDebug() << "NODE2" << parent << parentNode->name().c_str() << VAttribute::totalNum(parentNode);
- //qDebug() << "NODE2" << parent << parentNode->node()->name().c_str();
+ {
return createIndex(row,column,parentNode);
}
-
- //qDebug() << "BAD" << parent;
}
-
- //qDebug() << "EMPTY" << parent;
return QModelIndex();
-
}
QModelIndex TreeNodeModel::parent(const QModelIndex &child) const
@@ -508,26 +465,12 @@ QModelIndex TreeNodeModel::parent(const QModelIndex &child) const
int serverAttrNum=root->attrNum(atts_);
return createIndex(serverAttrNum+row,0,ts);
-
-#if 0
- VModelServer *server=NULL;
- row=-1;
- if(data_->identifyTopLevelNode(parentNode,&server,row))
- {
- int serverAttrNum=server->attrNum();
-
- //qDebug() << "PARENT 1" << child << server->realServer()->name().c_str();
- return createIndex(serverAttrNum+row,0,server);
- }
-#endif
}
//The parent is a non topLevel node (non-suite): its internal pointer
//is its parent (i.e.. the grandparent)
else if(VTreeNode *grandParentNode=parentNode->parent())
{
- int num=grandParentNode->attrNum(atts_)+grandParentNode->indexOfChild(parentNode);
-
- //qDebug() << "PARENT 2" << child << grandParentNode->node()->name().c_str() << num;
+ int num=grandParentNode->attrNum(atts_)+grandParentNode->indexOfChild(parentNode);
return createIndex(num,0,grandParentNode);
}
}
@@ -543,8 +486,16 @@ QModelIndex TreeNodeModel::parent(const QModelIndex &child) const
bool TreeNodeModel::isServer(const QModelIndex & index) const
{
- //For the servers the internal pointer is NULL
- return (index.isValid() && index.internalPointer() == NULL);
+ //For the servers the internal pointer is NULL
+ return (index.isValid() && index.internalPointer() == 0);
+}
+
+//This has to be extrememly fast!
+//When we know that the index is valid.
+bool TreeNodeModel::isServerForValid(const QModelIndex & index) const
+{
+ //For the servers the internal pointer is NULL
+ return index.internalPointer() == 0;
}
bool TreeNodeModel::isNode(const QModelIndex & index) const
@@ -613,6 +564,91 @@ QModelIndex TreeNodeModel::serverToIndex(VModelServer* server) const
//
//----------------------------------------------
+//We can only call it when the index is valid!
+VTreeNode* TreeNodeModel::indexToAttrParentNode(const QModelIndex & index) const
+{
+ void *ip;
+ if((ip=index.internalPointer()) == NULL)
+ return 0;
+
+ //If it is not a sever ...
+
+ //If the internal pointer is a server it is either a server attribute or a
+ //top level node (suite)
+
+ if(VModelServer *mserver=data_->server(ip))
+ {
+ VTreeServer* server=mserver->treeServer();
+ //It is an attribute
+ if(index.row() < server->tree()->attrNum(atts_))
+ {
+ return server->tree();
+ }
+ }
+
+ //Otherwise the internal pointer points to the parent node.
+ else if(VTreeNode *parentNode=static_cast<VTreeNode*>(ip))
+ {
+ //It is an attribute
+ if(index.row() < parentNode->attrNum(atts_))
+ return parentNode;
+ }
+
+ return 0;
+}
+
+//We can only call it when the index is valid!
+VTreeNode* TreeNodeModel::indexToAttrParentOrNode(const QModelIndex & index,bool &itIsANode) const
+{
+ void *ip;
+ if((ip=index.internalPointer()) == NULL)
+ return 0;
+
+ //If it is not a sever ...
+
+ itIsANode=false;
+ //If the internal pointer is a server it is either a server attribute or a
+ //top level node (suite)
+ if(VModelServer *mserver=data_->server(ip))
+ {
+ VTreeServer* server=mserver->treeServer();
+ Q_ASSERT(server);
+
+ //It is an attribute
+ int serverAttNum=server->tree()->attrNum(atts_);
+
+ if(index.row() < serverAttNum)
+ {
+ return server->tree();
+ }
+ //It is a top level node
+ else
+ {
+ itIsANode=true;
+ return server->tree()->childAt(index.row()-serverAttNum);
+ }
+ }
+
+ //Otherwise the internal pointer points to the parent node.
+ else if(VTreeNode *parentNode=static_cast<VTreeNode*>(ip))
+ {
+ int attNum=parentNode->attrNum(atts_);
+
+ //It is an attribute
+ if(index.row() < attNum)
+ {
+ return parentNode;
+ }
+ else
+ {
+ itIsANode=true;
+ return parentNode->childAt(index.row()-attNum);
+ }
+ }
+
+ return 0;
+}
+
VTreeNode* TreeNodeModel::indexToNode( const QModelIndex & index) const
{
//If it is not a sever ...
@@ -793,7 +829,7 @@ QModelIndex TreeNodeModel::attributeToIndex(const VAttribute* a, int column) con
VTreeServer* server=mserver->treeServer();
Q_ASSERT(server);
- int row=a->absIndex(atts_);
+ int row=node->indexOfAttribute(a,atts_);
if(row != -1)
{
//This is a server!!!
@@ -857,6 +893,8 @@ void TreeNodeModel::selectionChanged(QModelIndexList lst)
if(data_->isFilterNull())
return;
+ UiLog().dbg() << "TreeNodeModel::selectionChanged -->";
+
Q_FOREACH(QModelIndex idx,lst)
{
VInfo_ptr info=nodeInfo(idx);
@@ -876,6 +914,12 @@ void TreeNodeModel::selectionChanged(QModelIndexList lst)
// the tree all over in the programme outside the view.
//------------------------------------------------------------------
+//WARNING: if we are in the middle of an attribute filter change it will not give
+//correct results, because atts_ contains the new filter state, but the whole VTree still
+//base on the previous atts_ state.!! However we can assume that the index vas visible in
+//the tree so attrNum() is cached on the tree nodes so we get correct results for nodes.
+//Attributes however cannot be identified correctly.
+
VInfo_ptr TreeNodeModel::nodeInfo(const QModelIndex& index)
{
//For invalid index no info is created.
@@ -891,7 +935,6 @@ VInfo_ptr TreeNodeModel::nodeInfo(const QModelIndex& index)
return VInfoServer::create(s);
}
-
//If the internal pointer is a server it is either a server attribute or a
//top level node (suite)
if(VModelServer *mserver=data_->server(index.internalPointer()))
@@ -899,6 +942,7 @@ VInfo_ptr TreeNodeModel::nodeInfo(const QModelIndex& index)
VTreeServer *server=mserver->treeServer();
Q_ASSERT(server);
+ //If the attrNum is cached it is correct!
int serverAttNum=server->tree()->attrNum(atts_);
//It is a top level node
@@ -915,29 +959,30 @@ VInfo_ptr TreeNodeModel::nodeInfo(const QModelIndex& index)
//Otherwise the internal pointer points to the parent node
else if(VTreeNode *parentNode=static_cast<VTreeNode*>(index.internalPointer()))
- {
+ {
+ //If the attrNum is cached it is correct!
int attNum=parentNode->attrNum(atts_);
//It is a node
if(index.row() >= attNum)
- {
+ {
VNode *n=parentNode->childAt(index.row()-attNum)->vnode();
- return VInfoNode::create(n);
- }
- //It is an attribute
- else
- {
- VNode *n=parentNode->vnode();
- Q_ASSERT(n);
- VItemTmp_ptr atmp=VAttributeType::itemForAbsIndex(n,index.row(),atts_);
- if(atmp->attribute())
+ return VInfoNode::create(n);
+ }
+ //It is an attribute
+ else
+ {
+ //This wil not work properly if we are in the middle of an attribute
+ //filter change! atts_ is the new filter state, but index.row() is based on
+ //the previous filter state!!
+ if(VAttribute* a=parentNode->vnode()->attribute(index.row(),atts_))
{
- //VInfo will take charge of the attribute!
- VInfo_ptr p=VInfoAttribute::create(atmp->attribute()->clone());
+ VInfo_ptr p=VInfoAttribute::create(a);
return p;
+
}
- }
- }
+ }
+ }
VInfo_ptr res;
return res;
@@ -1087,7 +1132,7 @@ void TreeNodeModel::slotEndAddRemoveAttributes(VTreeServer* server,const VTreeNo
//We need to update all the attributes to reflect the change!
//(Since we do not have information about what attribute was actually added
//we always add or remove attributes at the end of the attribute list!!! Then the
- //call below will update all the attributes of the node in the tree).
+ //slot below will update all the attributes of the node in the tree).
slotAttributesChanged(server,node);
}
@@ -1120,6 +1165,9 @@ void TreeNodeModel::slotEndServerScan(VModelServer* server,int num)
VTreeServer *ts=server->treeServer();
Q_ASSERT(ts);
Q_EMIT scanEnded(ts->tree());
+
+ if(ts->isFirstScan())
+ Q_EMIT firstScanEnded(ts);
}
//The server clear has started. It well remove all the nodes except the root node.
@@ -1249,3 +1297,12 @@ void TreeNodeModel::slotEndFilterUpdateInsertTop(VTreeServer* server,int)
Q_ASSERT(server);
endInsertRows();
}
+
+
+int TreeNodeModel::iconNum(VNode* n) const
+{
+ if(icons_->isEmpty())
+ return 0;
+ else
+ return VIcon::pixmapNum(n,icons_);
+}
diff --git a/Viewer/src/TreeNodeModel.hpp b/Viewer/src/TreeNodeModel.hpp
index 87f1c5d..f80d545 100644
--- a/Viewer/src/TreeNodeModel.hpp
+++ b/Viewer/src/TreeNodeModel.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -49,6 +49,7 @@ public:
QModelIndex nodeToIndex(const VNode*,int column=0) const;
VTreeServer* indexToServer(const QModelIndex & index) const;
VTreeServer* nameToServer(const std::string&) const;
+ VTreeNode* indexToNode( const QModelIndex & index) const;
QModelIndex attributeToIndex(const VAttribute* a, int column=0) const;
@@ -87,6 +88,10 @@ public Q_SLOTS:
void slotBeginServerClear(VModelServer* server,int);
void slotEndServerClear(VModelServer* server,int);
+ int iconNum(VNode*) const;
+ bool isNode(const QModelIndex & index) const;
+ bool isAttribute(const QModelIndex & index) const;
+
Q_SIGNALS:
void clearBegun(const VTreeNode*);
void scanEnded(const VTreeNode*);
@@ -94,27 +99,26 @@ Q_SIGNALS:
void filterUpdateAddEnded(const VTreeNode*);
void filterChangeBegun();
void filterChangeEnded();
+ void firstScanEnded(const VTreeServer*);
protected:
QModelIndex forceShowNode(const VNode* node) const;
QModelIndex forceShowAttribute(const VAttribute* a) const;
private:
- bool isServer(const QModelIndex & index) const;
- bool isNode(const QModelIndex & index) const;
- bool isAttribute(const QModelIndex & index) const;
+ bool isServer(const QModelIndex& index) const;
+ bool isServerForValid(const QModelIndex& index) const;
ServerHandler* indexToServerHandler(const QModelIndex & index) const;
QModelIndex serverToIndex(VModelServer* server) const;
QModelIndex serverToIndex(ServerHandler*) const;
QModelIndex nodeToIndex(VTreeServer*,const VTreeNode*,int column=0) const;
- VTreeNode* indexToNode( const QModelIndex & index) const;
-
+ VTreeNode* indexToAttrParentNode(const QModelIndex & index) const;
+ VTreeNode* indexToAttrParentOrNode(const QModelIndex & index,bool &itIsANode) const;
QVariant serverData(const QModelIndex& index,int role) const;
- QVariant nodeData(const QModelIndex& index,int role) const;
- QVariant attributesData(const QModelIndex& index,int role) const;
-
+ QVariant nodeData(const QModelIndex& index,int role,VTreeNode*) const;
+ QVariant attributesData(const QModelIndex& index,int role,VTreeNode*) const;
//Attribute filter
VTreeModelData* data_;
diff --git a/Viewer/src/TreeNodeView.cpp b/Viewer/src/TreeNodeView.cpp
index d18cd74..f402f02 100644
--- a/Viewer/src/TreeNodeView.cpp
+++ b/Viewer/src/TreeNodeView.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -9,11 +9,12 @@
#include "TreeNodeView.hpp"
+#include <QtAlgorithms>
#include <QApplication>
-#include <QDebug>
#include <QHeaderView>
#include <QPalette>
#include <QScrollBar>
+#include <QTime>
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
#include <QGuiApplication>
@@ -48,14 +49,14 @@ TreeNodeView::TreeNodeView(TreeNodeModel* model,NodeFilterDef* filterDef,QWidget
setProperty("style","nodeView");
setProperty("view","tree");
- expandState_=new ExpandState(this,model_);
+ //expandState_=new ExpandState(this,model_);
actionHandler_=new ActionHandler(this);
//Set the model.
setModel(model_);
//Create delegate to the view
- delegate_=new TreeNodeViewDelegate(this);
+ delegate_=new TreeNodeViewDelegate(model_,this);
setItemDelegate(delegate_);
connect(delegate_,SIGNAL(sizeHintChangedGlobal()),
@@ -132,7 +133,7 @@ TreeNodeView::TreeNodeView(TreeNodeModel* model,NodeFilterDef* filterDef,QWidget
TreeNodeView::~TreeNodeView()
{
- delete expandState_;
+ qDeleteAll(expandStates_);
delete actionHandler_;
delete prop_;
}
@@ -184,6 +185,7 @@ void TreeNodeView::selectionChanged(const QItemSelection &selected, const QItemS
#endif
Q_EMIT selectionChanged(info);
}
+ lastSelection_=info;
}
QTreeView::selectionChanged(selected, deselected);
@@ -219,6 +221,10 @@ void TreeNodeView::setCurrentSelection(VInfo_ptr info)
#endif
setCurrentIndex(idx);
}
+ else
+ {
+ lastSelection_.reset();
+ }
setCurrentIsRunning_=false;
}
@@ -271,9 +277,7 @@ void TreeNodeView::handleContextMenu(QModelIndex indexClicked,QModelIndexList in
{
//Node actions
if(indexClicked.isValid() && indexClicked.column() == 0) //indexLst[0].isValid() && indexLst[0].column() == 0)
- {
- //qDebug() << "context menu" << indexClicked;
-
+ {
std::vector<VInfo_ptr> nodeLst;
for(int i=0; i < indexLst.count(); i++)
{
@@ -299,11 +303,18 @@ void TreeNodeView::slotViewCommand(VInfo_ptr info,QString cmd)
if(idx.isValid())
{
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
- QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+ QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+#endif
+#ifdef _UI_TREENODEVIEW_DEBUG
+ QTime t;
+ t.start();
+#endif
+ expandAll(idx);
+#ifdef _UI_TREENODEVIEW_DEBUG
+ UiLog().dbg() << "expandAll time=" << t.elapsed()/1000. << "s";
#endif
- expandAll(idx);
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
- QGuiApplication::restoreOverrideCursor();
+ QGuiApplication::restoreOverrideCursor();
#endif
}
@@ -313,7 +324,7 @@ void TreeNodeView::slotViewCommand(VInfo_ptr info,QString cmd)
QModelIndex idx=model_->infoToIndex(info);
if(idx.isValid())
{
- collapseAll(idx);
+ collapseAll(idx);
}
}
@@ -380,8 +391,6 @@ void TreeNodeView::adjustStyleSheet()
if(styleSheet_.contains("branch"))
sh+=styleSheet_["branch"];
- qDebug() << "stylesheet" << sh;
-
setStyleSheet(sh);
}
@@ -500,24 +509,18 @@ void TreeNodeView::expandTo(const QModelIndex& idxTo)
QModelIndex idx=model_->parent(idxTo);
QModelIndexList lst;
- qDebug() << idxTo << idx;
-
while(idx.isValid())
{
lst.push_front(idx);
idx=idx.parent();
}
- qDebug() << lst;
-
Q_FOREACH(QModelIndex d,lst)
{
expand(d);
- qDebug() << "expand" << d << isExpanded(d);
}
}
-
//Save all
void TreeNodeView::slotSaveExpand()
{
@@ -526,21 +529,19 @@ void TreeNodeView::slotSaveExpand()
QModelIndex serverIdx=model_->index(i, 0);
VTreeServer* ts=model_->indexToServer(serverIdx);
Q_ASSERT(ts);
- ExpandStateTree* es=expandState_->add();
+
+ TreeViewExpandState* es=new TreeViewExpandState(this,model_);
+ expandStates_ << es;
es->save(ts->tree());
- }
- VInfo_ptr s=currentSelection();
- if(s)
- {
- expandState_->selection_=s;
+ //ExpandStateTree* es=expandState_->add();
+ //es->save(ts->tree());
}
-
}
void TreeNodeView::slotRestoreExpand()
{
- Q_FOREACH(ExpandStateTree* es,expandState_->items())
+ Q_FOREACH(TreeViewExpandState* es,expandStates_)
{
if(es->root())
{
@@ -552,69 +553,58 @@ void TreeNodeView::slotRestoreExpand()
}
}
- if(expandState_->selection_)
- {
- VInfo_ptr s=currentSelection();
- if(!s)
- {
- expandState_->selection_->regainData();
- if(!expandState_->selection_->hasData())
- {
- expandState_->selection_.reset();
- }
- else
- {
- setCurrentSelectionFromExpand(expandState_->selection_);
- }
- }
- }
-
- expandState_->clear();
+ qDeleteAll(expandStates_);
+ expandStates_.clear();
+ regainSelectionFromExpand();
}
//Save the expand state for the given node (it can be a server as well)
void TreeNodeView::slotSaveExpand(const VTreeNode* node)
{
- VInfo_ptr s=currentSelection();
- if(s)
- {
- if(node->server()->realServer() == s->server())
- expandState_->selection_=s;
- }
-
-
- ExpandStateTree* es=expandState_->add();
+ TreeViewExpandState* es=new TreeViewExpandState(this,model_);
+ expandStates_ << es;
es->save(node);
+
+ //TreeViewExpandState* es=expandState_->add();
+ //es->save(node);
}
//Restore the expand state for the given node (it can be a server as well)
void TreeNodeView::slotRestoreExpand(const VTreeNode* node)
{
- Q_FOREACH(ExpandStateTree* es,expandState_->items())
+ for(int i=0; i < expandStates_.count(); i++)
{
- if(es->rootSameAs(node->vnode()->strName()))
+ TreeViewExpandState* es=expandStates_[i];
{
- es->restore(node);
-
- if(expandState_->selection_)
+ if(es->rootSameAs(node->vnode()->strName()))
{
- VInfo_ptr s=currentSelection();
- if(!s)
- {
- expandState_->selection_->regainData();
- if(!expandState_->selection_->hasData())
- {
- expandState_->selection_.reset();
- }
- else if(node->server()->realServer() == expandState_->selection_->server())
- {
- setCurrentSelectionFromExpand(expandState_->selection_);
- expandState_->selection_.reset();
- }
- }
+ es->restore(node);
+ expandStates_.remove(i);
+ delete es;
+ break;
}
+ }
+ }
- expandState_->remove(es);
+ regainSelectionFromExpand();
+}
+
+void TreeNodeView::regainSelectionFromExpand()
+{
+ VInfo_ptr s=currentSelection();
+ if(!s)
+ {
+ if(lastSelection_)
+ {
+ lastSelection_->regainData();
+ if(!lastSelection_->hasData())
+ {
+ lastSelection_.reset();
+ }
+ else
+ {
+ setCurrentSelectionFromExpand(lastSelection_);
+ }
}
}
}
diff --git a/Viewer/src/TreeNodeView.hpp b/Viewer/src/TreeNodeView.hpp
index 663ea14..6f883cd 100644
--- a/Viewer/src/TreeNodeView.hpp
+++ b/Viewer/src/TreeNodeView.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -15,19 +15,23 @@
#include "NodeViewBase.hpp"
+#include "ExpandState.hpp"
#include "VInfo.hpp"
#include "VProperty.hpp"
class ActionHandler;
class Animation;
class ExpandNode;
-class ExpandState;
class TableNodeSortModel;
class PropertyMapper;
class TreeNodeModel;
class TreeNodeViewDelegate;
+//class TreeViewExpandState;
class VTreeNode;
+//class TreeNodeView;
+//typedef ExpandState<TreeNodeView> TreeViewExpandState;
+
class TreeNodeView : public QTreeView, public NodeViewBase, public VPropertyObserver
{
Q_OBJECT
@@ -62,6 +66,9 @@ public Q_SLOTS:
void slotRerender();
void slotSizeHintChangedGlobal();
+protected Q_SLOTS:
+ void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
+
Q_SIGNALS:
void selectionChanged(VInfo_ptr);
void infoPanelCommand(VInfo_ptr,QString);
@@ -71,8 +78,7 @@ protected:
void resizeEvent(QResizeEvent*);
QModelIndexList selectedList();
void handleContextMenu(QModelIndex indexClicked,QModelIndexList indexLst,QPoint globalPos,QPoint widgetPos,QWidget *widget);
- void saveExpand(ExpandNode *parentExpand,const QModelIndex& idx);
- void restoreExpand(ExpandNode *expand,const VNode* node);
+
void adjustIndentation(int);
void adjustBackground(QColor col,bool asjustStyleSheet=true);
void adjustBranchLines(bool,bool asjustStyleSheet=true);
@@ -80,22 +86,26 @@ protected:
void adjustServerToolTip(bool);
void adjustNodeToolTip(bool);
void adjustAttributeToolTip(bool);
+
void expandAll(const QModelIndex& idx);
void collapseAll(const QModelIndex& idx);
void expandTo(const QModelIndex& idxTo);
- void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
void setCurrentSelectionFromExpand(VInfo_ptr info);
+ void regainSelectionFromExpand();
TreeNodeModel* model_;
ActionHandler* actionHandler_;
- ExpandState *expandState_;
- bool needItemsLayout_;
+ bool needItemsLayout_;
int defaultIndentation_;
TreeNodeViewDelegate* delegate_;
PropertyMapper* prop_;
QMap<QString,QString> styleSheet_;
bool setCurrentIsRunning_;
bool setCurrentFromExpand_;
+ VInfo_ptr lastSelection_;
+
+ typedef ExpandState<TreeNodeView> TreeViewExpandState;
+ QVector<TreeViewExpandState*> expandStates_;
};
#endif
diff --git a/Viewer/src/TreeNodeViewDelegate.cpp b/Viewer/src/TreeNodeViewDelegate.cpp
index 99719d7..ca8f8fe 100644
--- a/Viewer/src/TreeNodeViewDelegate.cpp
+++ b/Viewer/src/TreeNodeViewDelegate.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -17,199 +17,97 @@
#include "AbstractNodeModel.hpp"
#include "Animation.hpp"
+#include "FontMetrics.hpp"
#include "IconProvider.hpp"
#include "PropertyMapper.hpp"
#include "ServerHandler.hpp"
+#include "UiLog.hpp"
+#if 0
static std::vector<std::string> propVec;
static QColor typeFgColourClassic=QColor(Qt::white);
static QColor typeBgColourClassic=QColor(150,150,150);
static QColor childCountColour=QColor(90,91,92);
+#endif
-
-struct NodeShape
-{
- QColor col_;
- QPolygon shape_;
-};
-
-struct NodeText
-{
- QColor fgCol_;
- QColor bgCol_;
- QRect br_;
- QString text_;
+struct TreeNodeDelegateBox : public NodeDelegateBox
+{
+ TreeNodeDelegateBox() {
+ topMargin=2;
+ bottomMargin=2;
+ leftMargin=8;
+ rightMargin=2;
+ topPadding=0;
+ bottomPadding=0;
+ leftPadding=2;
+ rightPadding=2;
+ }
};
-struct ServerUpdateData
-{
- QRect br_;
- int prevTime_;
- int nextTime_;
- QString prevText_;
- QString nextText_;
- float prog_;
+struct TreeAttrDelegateBox : public AttrDelegateBox
+{
+ TreeAttrDelegateBox() {
+ topMargin=2;
+ bottomMargin=2;
+ leftMargin=8;
+ rightMargin=2;
+ topPadding=0;
+ bottomPadding=0;
+ leftPadding=2;
+ rightPadding=0;
+ }
};
-TreeNodeViewDelegate::TreeNodeViewDelegate(QWidget *parent) :
- nodeRectRad_(0),
- drawChildCount_(true),
- nodeStyle_(ClassicNodeStyle),
- indentation_(0),
- drawNodeType_(true),
- bgCol_(Qt::white)
+TreeNodeViewDelegate::TreeNodeViewDelegate(TreeNodeModel* model,QWidget *parent) :
+ TreeNodeViewDelegateBase(model,parent)
{
- drawAttrSelectionRect_=true;
-
- attrFont_=font_;
- attrFont_.setPointSize(8);
+ nodeBox_=new TreeNodeDelegateBox;
+ attrBox_=new TreeAttrDelegateBox;
- serverInfoFont_=font_;
-
- serverInfoFont_=font_;
- //serverNumFont_.setBold(true);
-
- suiteNumFont_=font_;
- //suiteNumFont_.setBold(true);
-
- abortedReasonFont_=font_;
- abortedReasonFont_.setBold(true);
+ nodeBox_->adjust(font_);
+ attrBox_->adjust(attrFont_);
typeFont_=font_;
typeFont_.setBold(true);
typeFont_.setPointSize(font_.pointSize()-1);
- adjustIconSize();
-
- //Property
- if(propVec.empty())
- {
- propVec.push_back("view.tree.nodeFont");
- propVec.push_back("view.tree.attributeFont");
- propVec.push_back("view.tree.display_child_count");
- propVec.push_back("view.tree.displayNodeType");
- propVec.push_back("view.tree.background");
- propVec.push_back("view.common.node_style");
-
- //Base settings
- addBaseSettings(propVec);
- }
-
- prop_=new PropertyMapper(propVec,this);
-
updateSettings();
-
- //The parent must be the view!!!
- animation_=new AnimationHandler(parent);
}
TreeNodeViewDelegate::~TreeNodeViewDelegate()
{
- delete animation_;
}
-/*void TreeNodeViewDelegate::notifyChange(VProperty* p)
-{
- updateSettings();
-}*/
-
-void TreeNodeViewDelegate::updateSettings()
+QSize TreeNodeViewDelegate::sizeHint(const QStyleOptionViewItem&, const QModelIndex & index ) const
{
- if(VProperty* p=prop_->find("view.common.node_style"))
- {
- if(p->value().toString() == "classic")
- nodeStyle_=ClassicNodeStyle;
- else
- nodeStyle_=BoxAndTextNodeStyle;
- }
- if(VProperty* p=prop_->find("view.tree.nodeRectRadius"))
- {
- nodeRectRad_=p->value().toInt();
- }
- if(VProperty* p=prop_->find("view.tree.nodeFont"))
- {
- QFont newFont=p->value().value<QFont>();
-
- if(font_ != newFont )
- {
- font_=newFont;
- serverInfoFont_=font_;
- serverNumFont_.setFamily(font_.family());
- serverNumFont_.setPointSize(font_.pointSize()-1);
- suiteNumFont_.setFamily(font_.family());
- suiteNumFont_.setPointSize(font_.pointSize()-1);
- abortedReasonFont_.setFamily(font_.family());
- abortedReasonFont_.setPointSize(font_.pointSize());
- typeFont_.setFamily(font_.family());
- typeFont_.setPointSize(font_.pointSize()-1);
- adjustIconSize();
-
- Q_EMIT sizeHintChangedGlobal();
- }
- }
- if(VProperty* p=prop_->find("view.tree.attributeFont"))
- {
- QFont newFont=p->value().value<QFont>();
-
- if(attrFont_ != newFont)
- {
- attrFont_=newFont;
- Q_EMIT sizeHintChangedGlobal();
- }
- }
-
- if(VProperty* p=prop_->find("view.tree.display_child_count"))
- {
- drawChildCount_=p->value().toBool();
- }
-
- if(VProperty* p=prop_->find("view.tree.displayNodeType"))
- {
- drawNodeType_=p->value().toBool();
- }
-
- if(VProperty* p=prop_->find("view.tree.background"))
- {
- bgCol_=p->value().value<QColor>();
- }
-
- //Update the settings handled by the base class
- updateBaseSettings();
-}
-
-QSize TreeNodeViewDelegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index ) const
-{
- QSize size=QStyledItemDelegate::sizeHint(option,index);
+ //QSize size=QStyledItemDelegate::sizeHint(option,index);
+ //QSize size(100,fontHeight_+8);
int attLineNum=0;
if((attLineNum=index.data(AbstractNodeModel::AttributeLineRole).toInt()) > 0)
{
- QFontMetrics fm(attrFont_);
- int h=fm.height();
if(attLineNum==1)
- return QSize(size.width(),h+6);
+ return attrBox_->sizeHintCache;
else
{
- QStringList lst;
+ QFontMetrics fm(attrFont_);
+ QStringList lst;
for(int i=0; i < attLineNum; i++)
lst << "1";
- return QSize(size.width(),fm.size(0,lst.join(QString('\n'))).height()+6);
+ return QSize(100,fm.size(0,lst.join(QString('\n'))).height()+6);
}
}
- QFontMetrics fm(font_);
- int h=fm.height();
- return QSize(size.width(),h+8);
+ return nodeBox_->sizeHintCache;
}
-
void TreeNodeViewDelegate::paint(QPainter *painter,const QStyleOptionViewItem &option,
const QModelIndex& index) const
{
//Background
- QStyleOptionViewItemV4 vopt(option);
+ QStyleOptionViewItem vopt(option);
initStyleOption(&vopt, index);
//Both the plastique and fusion styles render the tree expand indicator in the middle of the
@@ -222,9 +120,6 @@ void TreeNodeViewDelegate::paint(QPainter *painter,const QStyleOptionViewItem &o
//vopt.rect.setLeft(vopt.rect.x()-indentation_/2 + 10);
vopt.rect.setLeft(vopt.rect.x()-indentation_/2 + 5);
- const QStyle *style = vopt.widget ? vopt.widget->style() : QApplication::style();
- const QWidget* widget = vopt.widget;
-
//Save painter state
painter->save();
@@ -263,9 +158,7 @@ void TreeNodeViewDelegate::paint(QPainter *painter,const QStyleOptionViewItem &o
//First column (nodes)
if(index.column() == 0)
{
- QVariant tVar=index.data(Qt::DisplayRole);
- QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &vopt, widget);
-
+ QVariant tVar=index.data(Qt::DisplayRole);
painter->setFont(font_);
if(tVar.type() == QVariant::String)
@@ -295,760 +188,10 @@ void TreeNodeViewDelegate::paint(QPainter *painter,const QStyleOptionViewItem &o
}
}
- }
- //rest of the columns
- else if(index.column() < 3)
- {
- QString text=index.data(Qt::DisplayRole).toString();
- QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &vopt, widget);
- painter->setPen(Qt::black);
- painter->drawText(textRect,Qt::AlignLeft | Qt::AlignVCenter,text);
-
- }
+ }
painter->restore();
//else
// QStyledItemDelegate::paint(painter,option,index);
}
-
-
-void TreeNodeViewDelegate::renderServer(QPainter *painter,const QModelIndex& index,
- const QStyleOptionViewItemV4& option,QString text) const
-{
- ServerHandler* server=static_cast<ServerHandler*>(index.data(AbstractNodeModel::ServerPointerRole).value<void*>());
- Q_ASSERT(server);
-
- bool selected=option.state & QStyle::State_Selected;
- int offset=4;
-
- QFontMetrics fm(font_);
- int deltaH=(option.rect.height()-(fm.height()+4))/2;
-
- //The initial filled rect (we will adjust its width)
- //QRect fillRect=option.rect.adjusted(offset,1,0,-2);
- QRect itemRect=option.rect.adjusted(2*offset,deltaH+2,0,-deltaH-2);
- if(option.state & QStyle::State_Selected)
- itemRect.adjust(0,0,0,0);
-
-#if 0
- painter->setPen(QColor(190,190,190));
- painter->drawLine(0,option.rect.y()+1,painter->device()->width(),option.rect.y()+1);
- painter->drawLine(0,option.rect.bottom()-1,painter->device()->width(),option.rect.bottom()-1);
-#endif
-#if 0
-
- QRect progRect(0,itemRect.y()-deltaH,painter->device()->width(),itemRect.height()+2*deltaH);
- progRect.setWidth(painter->device()->width());
- painter->setBrush(Qt::NoBrush);
- painter->setPen(QColor(190,190,190));
- painter->drawRect(progRect);
- painter->setBrush(QColor(230,230,230));
- painter->drawRect(progRect.adjusted(0,0,-progRect.width()*0.4,0));
-#endif
- int currentRight=itemRect.left();
-
- NodeShape stateShape;
- stateShape.col_=index.data(Qt::BackgroundRole).value<QColor>();
-
- NodeText nodeText;
- nodeText.text_=text;
- int textWidth=fm.width(text);
-
- if(nodeStyle_ == BoxAndTextNodeStyle)
- {
- stateShape.shape_=QPolygon(QRect(itemRect.x(),itemRect.y(),itemRect.height(),itemRect.height()));
- currentRight=stateShape.shape_.boundingRect().right()+offset;
- nodeText.br_=QRect(currentRight+offset,itemRect.y(),textWidth, itemRect.height());
- nodeText.fgCol_=QColor(Qt::black);
- currentRight=nodeText.br_.right();
- }
- else
- {
- stateShape.shape_=QPolygon(QRect(itemRect.x(),itemRect.y(),textWidth+2*offset+1,itemRect.height()));
- nodeText.br_=QRect(itemRect.x()+offset,itemRect.y(),textWidth, itemRect.height());
- nodeText.fgCol_=index.data(Qt::ForegroundRole).value<QColor>();
- currentRight=stateShape.shape_.boundingRect().right()+offset;
- }
-
- //Refresh timer
- /* bool hasTimer=true;
- QRect timeRect(currentRight+offset,itemRect.y()-1,itemRect.height()+2,itemRect.height()+2);
- currentRight=timeRect.right();*/
-
- //Icons area
- QList<QPixmap> pixLst;
- QList<QRect> pixRectLst;
-
- QVariant va=index.data(AbstractNodeModel::IconRole);
- if(va.type() == QVariant::List)
- {
- QVariantList lst=va.toList();
- int xp=currentRight+5;
- int yp=itemRect.center().y()-iconSize_/2;
- for(int i=0; i < lst.count(); i++)
- {
- int id=lst[i].toInt();
- if(id != -1)
- {
- pixLst << IconProvider::pixmap(id,iconSize_);
- pixRectLst << QRect(xp,yp,pixLst.back().width(),pixLst.back().height());
- xp+=pixLst.back().width()+iconGap_;
- }
- }
-
- if(!pixRectLst.isEmpty())
- currentRight=pixRectLst.back().right();
- }
-
- //The pixmap (optional)
- bool hasPix=false;
- QRect pixRect;
-
- //The info rectangle (optional)
- QRect infoRect;
- QString infoTxt=index.data(AbstractNodeModel::InfoRole).toString();
- bool hasInfo=(infoTxt.isEmpty() == false);
-
- if(hasInfo)
- {
- //infoFont.setBold(true);
- fm=QFontMetrics(serverInfoFont_);
-
- int infoWidth=fm.width(infoTxt);
- infoRect = nodeText.br_;
- infoRect.setLeft(currentRight+fm.width('A'));
- infoRect.setWidth(infoWidth);
- currentRight=infoRect.right();
- }
-
- //The load icon (optional)
- QRect loadRect;
- bool hasLoad=index.data(AbstractNodeModel::LoadRole).toBool();
- Animation* an=0;
-
- //Update load animation
- if(hasLoad)
- {
- an=animation_->find(Animation::ServerLoadType,true);
-
- loadRect = QRect(currentRight+fm.width('A'),
- itemRect.top()+(itemRect.height()-an->scaledSize().height())/2,
- an->scaledSize().width(),
- an->scaledSize().height());
-
- currentRight=loadRect.right();
-
- //Add this index to the animations
- //There is no guarantee that this index will be valid in the future!!!
- an->addTarget(server->vRoot());
- }
- //Stops load animation
- else
- {
- if((an=animation_->find(Animation::ServerLoadType,false)) != NULL)
- an->removeTarget(server->vRoot());
- }
-
- //The node number (optional)
- QRect numRect;
- QString numTxt;
- bool hasNum=false;
-
- if(drawChildCount_)
- {
- QVariant va=index.data(AbstractNodeModel::NodeNumRole);
- hasNum=(va.isNull() == false);
- if(hasNum)
- {
- numTxt="(" + QString::number(va.toInt()) + ")";
-
- QFontMetrics fmNum(serverNumFont_);
-
- int numWidth=fmNum.width(numTxt);
- numRect = nodeText.br_;
- numRect.setLeft(currentRight+fmNum.width('A'));
- numRect.setWidth(numWidth);
- currentRight=numRect.right();
- }
- }
-
- //Update
- bool hasUpdate=false;
- ServerUpdateData updateData;
-#if 0
- if(server)
- {
- hasUpdate=true;
- updateData.br_=QRect(currentRight+3*offset,itemRect.y()-1,0,itemRect.height()+2);
- updateData.prevTime_=server->secsSinceLastRefresh();
- updateData.nextTime_=server->secsTillNextRefresh();
- if(updateData.prevTime_ >=0)
- {
- if(updateData.nextTime_ >=0)
- {
- updateData.prevText_="-" + formatTime(updateData.prevTime_);
- updateData.nextText_="+" +formatTime(updateData.nextTime_);
- updateData.prog_=(static_cast<float>(updateData.prevTime_)/static_cast<float>(updateData.prevTime_+updateData.nextTime_));
- updateData.br_.setWidth(fm.width("ABCDE")+fm.width(updateData.prevText_)+fm.width(updateData.nextText_)+2*offset);
- }
- else
- {
- updateData.prevText_="last update: " + formatTime(updateData.prevTime_);
- updateData.prog_=0;
- updateData.br_.setWidth(fm.width(updateData.prevText_));
- }
- currentRight=updateData.br_.right();
- }
- else
- {
- hasUpdate=false;
- }
- }
-#endif
-
- //Define clipping
- int rightPos=currentRight+1;
- const bool setClipRect = rightPos > option.rect.right();
- if(setClipRect)
- {
- painter->save();
- painter->setClipRect(option.rect);
- }
-
- //Draw state/node rect
- renderServerCell(painter,stateShape,nodeText,selected);
-
- //Draw timer
- /*int remaining=6*60*1000; // server->remainingTimeToRefresh();
- int total=10*60*1000; //server->refreshPeriod() ;
- renderTimer(painter,timeRect,remaining,total);*/
-
- //Draw icons
- for(int i=0; i < pixLst.count(); i++)
- {
- painter->drawPixmap(pixRectLst[i],pixLst[i]);
- }
-
- //Draw pixmap if needed
- if(hasPix)
- {
- painter->drawPixmap(pixRect,errPix_);
- }
-
- //Draw info
- if(hasInfo)
- {
- painter->setPen(Qt::black);
- painter->setFont(serverInfoFont_);
- painter->drawText(infoRect,Qt::AlignLeft | Qt::AlignVCenter,infoTxt);
- }
-
- //Draw number
- if(hasNum)
- {
- painter->setPen(childCountColour);
- painter->setFont(serverNumFont_);
- painter->drawText(numRect,Qt::AlignLeft | Qt::AlignVCenter,numTxt);
- }
-
- //Draw load animation
- if(hasLoad)
- {
- Animation* an=animation_->find(Animation::ServerLoadType,false);
- if(an)
- {
- painter->drawPixmap(loadRect,an->currentPixmap());
- }
- }
-#if 0
- if(hasUpdate)
- {
- renderServerUpdate(painter,updateData);
- }
-#endif
- if(setClipRect)
- {
- painter->restore();
- }
-}
-
-
-void TreeNodeViewDelegate::renderNode(QPainter *painter,const QModelIndex& index,
- const QStyleOptionViewItemV4& option,QString text) const
-{
-
- bool selected=option.state & QStyle::State_Selected;
- int offset=4;
-
- QFontMetrics fm(font_);
- int deltaH=(option.rect.height()-(fm.height()+4))/2;
-
- //The initial filled rect (we will adjust its width)
- QRect itemRect=option.rect.adjusted(2*offset,deltaH+1+1,0,-deltaH-1-1);
- if(option.state & QStyle::State_Selected)
- itemRect.adjust(0,0,0,-0);
-
- NodeShape stateShape;
- NodeShape realShape;
- NodeText nodeText;
- NodeText typeText;
-
- //get the colours
- QVariant bgVa=index.data(Qt::BackgroundRole);
- bool hasRealBg=false;
- if(bgVa.type() == QVariant::List)
- {
- QVariantList lst=bgVa.toList();
- if(lst.count() == 2)
- {
- hasRealBg=true;
- stateShape.col_=lst[0].value<QColor>();
- realShape.col_=lst[1].value<QColor>();
- }
- }
- else
- {
- stateShape.col_=bgVa.value<QColor>();
- }
-
- int currentRight=itemRect.left();
-
- //Node type
- QFontMetrics fmType(typeFont_);
- int typeWidth=fmType.width(" S");
-
- if(drawNodeType_)
- {
- int nodeType=index.data(AbstractNodeModel::NodeTypeRole).toInt();
- switch(nodeType)
- {
- case 0: typeText.text_="S"; break;
- case 1: typeText.text_="F"; break;
- case 2: typeText.text_="T"; break;
- case 3: typeText.text_="A"; break;
- default: break;
- }
- }
-
- //The text rectangle
- nodeText.text_=text;
- int textWidth=fm.width(text);
-
- if(nodeStyle_ == BoxAndTextNodeStyle)
- {
- int realW=itemRect.height()/4;
-
- QRect r1(currentRight,itemRect.y(),itemRect.height(),itemRect.height());
- if(hasRealBg)
- r1.adjust(0,0,-realW,0);
-
- stateShape.shape_=QPolygon(r1);
-
- if(hasRealBg)
- {
- QRect r2(r1.right(),r1.top(),realW+1,r1.height());
- realShape.shape_=QPolygon(r2);
- currentRight=r2.right()+2;
- }
- else
- currentRight=r1.right()+2;
-
- if(drawNodeType_)
- {
- typeText.br_=r1;
- typeText.fgCol_=index.data(AbstractNodeModel::NodeTypeForegroundRole).value<QColor>();
- }
-
- nodeText.br_=QRect(currentRight+offset,r1.top(),textWidth,r1.height());
- nodeText.fgCol_=QColor(Qt::black);
- currentRight=nodeText.br_.right();
-
- }
- //Classic style
- else
- {
- if(drawNodeType_)
- {
- typeText.br_=QRect(currentRight,itemRect.y(),typeWidth,itemRect.height());
- typeText.fgCol_=typeFgColourClassic;
- typeText.bgCol_=typeBgColourClassic;
- currentRight=typeText.br_.right()+2;
- }
-
- QRect r1(currentRight,itemRect.y(),textWidth+2*offset+1,itemRect.height());
- stateShape.shape_=QPolygon(r1);
- currentRight=r1.right()+2;
-
- nodeText.br_=QRect(r1.left()+offset,r1.top(),textWidth,r1.height());
- nodeText.fgCol_=index.data(Qt::ForegroundRole).value<QColor>();
-
- if(hasRealBg)
- {
- int realW=6;
- QRect r2(r1.right(),r1.top(),realW+1,r1.height());
- realShape.shape_=QPolygon(r2);
- currentRight=r2.right()+2;
- }
- }
-
- //Icons area
- QList<QPixmap> pixLst;
- QList<QRect> pixRectLst;
-
- QVariant va=index.data(AbstractNodeModel::IconRole);
- if(va.type() == QVariant::List)
- {
- QVariantList lst=va.toList();
- int xp=currentRight+5;
- int yp=itemRect.center().y()-iconSize_/2;
- for(int i=0; i < lst.count(); i++)
- {
- int id=lst[i].toInt();
- if(id != -1)
- {
- pixLst << IconProvider::pixmap(id,iconSize_);
- pixRectLst << QRect(xp,yp,pixLst.back().width(),pixLst.back().height());
- xp+=pixLst.back().width()+iconGap_;
- }
- }
-
- if(!pixRectLst.isEmpty())
- currentRight=pixRectLst.back().right();
- }
-
- //The node number (optional)
- QRect numRect;
- QString numTxt;
- bool hasNum=false;
-
- if(drawChildCount_)
- {
- va=index.data(AbstractNodeModel::NodeNumRole);
- hasNum=(va.isNull() == false);
-
- if(hasNum)
- {
- numTxt="(" + va.toString() + ")";
- QFontMetrics fmNum(suiteNumFont_);
-
- int numWidth=fmNum.width(numTxt);
- numRect = nodeText.br_;
- numRect.setLeft(currentRight+fmNum.width('A'));
- numRect.setWidth(numWidth);
- currentRight=numRect.right();
- }
- }
-
- //The aborted reason
- QRect reasonRect;
- QString reasonTxt=index.data(AbstractNodeModel::AbortedReasonRole).toString();
- if(reasonTxt.contains('\n'))
- reasonTxt=reasonTxt.split("\n").first();
-
- bool hasReason=(!reasonTxt.isEmpty());
- if(hasReason)
- {
- QFontMetrics fmReason(abortedReasonFont_);
- reasonRect = nodeText.br_;
- reasonRect.setLeft(currentRight+fmReason.width('A'));
- reasonTxt=fmReason.elidedText(reasonTxt,Qt::ElideRight,220);
- reasonRect.setWidth(fmReason.width(reasonTxt));
- currentRight=reasonRect.right();
- }
-
- //Define clipping
- int rightPos=currentRight+1;
- const bool setClipRect = rightPos > option.rect.right();
- if(setClipRect)
- {
- painter->save();
- painter->setClipRect(option.rect);
- }
-
- renderNodeCell(painter,stateShape,realShape,nodeText,typeText,selected);
-
- //Draw icons
- for(int i=0; i < pixLst.count(); i++)
- {
- painter->drawPixmap(pixRectLst[i],pixLst[i]);
- }
-
- //Draw number
- if(hasNum)
- {
- painter->setPen(childCountColour);
- painter->setFont(suiteNumFont_);
- painter->drawText(numRect,Qt::AlignLeft | Qt::AlignVCenter,numTxt);
- }
-
- //Draw aborted reason
- if(hasReason)
- {
- painter->setPen(stateShape.col_.darker(120));
- painter->setFont(abortedReasonFont_);
- painter->drawText(reasonRect,Qt::AlignLeft | Qt::AlignVCenter,reasonTxt);
- }
-
- if(setClipRect)
- {
- painter->restore();
- }
-}
-
-void TreeNodeViewDelegate::renderServerCell(QPainter *painter,const NodeShape& stateShape,
- const NodeText& text,bool selected) const
-{
- renderNodeShape(painter,stateShape);
-
- //Draw text
- painter->setFont(font_);
- painter->setPen(QPen(text.fgCol_,0));
- painter->drawText(text.br_,Qt::AlignLeft | Qt::AlignVCenter,text.text_);
-
- //selection
- painter->setPen(nodeSelectPen_);
- painter->setBrush(Qt::NoBrush);
- QPolygon sel=stateShape.shape_;
-
- if(selected)
- {
- if(nodeStyle_ == BoxAndTextNodeStyle)
- {
- sel=sel.united(QPolygon(text.br_.adjusted(0,0,2,0)));
- }
- painter->drawRect(sel.boundingRect());
- }
-}
-
-void TreeNodeViewDelegate::renderNodeCell(QPainter *painter,const NodeShape& stateShape,const NodeShape &realShape,
- const NodeText& nodeText,const NodeText& typeText,bool selected) const
-{
- renderNodeShape(painter,stateShape);
- renderNodeShape(painter,realShape);
-
- //Draw type
- if(drawNodeType_)
- {
- if(typeText.bgCol_.isValid())
- painter->fillRect(typeText.br_,typeText.bgCol_);
- painter->setFont(typeFont_);
- painter->setPen(typeText.fgCol_);
- painter->setBrush(Qt::NoBrush);
- painter->drawText(typeText.br_,Qt::AlignCenter,typeText.text_);
- }
-
- //Draw text
- painter->setFont(font_);
- painter->setPen(QPen(nodeText.fgCol_,0));
- painter->drawText(nodeText.br_,Qt::AlignLeft | Qt::AlignVCenter,nodeText.text_);
-
- //selection
- painter->setPen(nodeSelectPen_);
- painter->setBrush(Qt::NoBrush);
- QPolygon sel=stateShape.shape_;
-
- if(selected)
- {
- if(nodeStyle_ == BoxAndTextNodeStyle)
- {
- if(!realShape.shape_.isEmpty())
- sel=sel.united(realShape.shape_);
-
- sel=sel.united(QPolygon(nodeText.br_.adjusted(0,0,2,0)));
- }
- else
- {
- if(!realShape.shape_.isEmpty())
- sel=sel.united(realShape.shape_);
- }
- painter->drawRect(sel.boundingRect());
- }
-
- /*
-
- if(nodeStyle_ == BoxAndTextNodeStyle)
- {
- painter->setFont(typeFont_);
- painter->setPen();
- painter->drawText(typeText.br_,Qt::AlignCenter,typeText.text_);
- }
- else
- {
- painter->setPen(Qt::NoPen);
-
- if(typeTxt == "S")
- painter->setBrush(QColor(150,150,150)); //bgBrush);
- else if(typeTxt == "F")
- painter->setBrush(QColor(150,150,150)); //bgBrush);
- else
- painter->setBrush(QColor(190,190,190)); //bgBrush);
-
- painter->drawRect(typeRect);
-
- painter->setPen(Qt::white);
- painter->setFont(typeFont_);
- painter->drawText(typeRect,Qt::AlignCenter,typeTxt);
- }
- }
-
- //Draw text
- painter->setFont(font_);
- painter->setPen(QPen(fg,0));
- painter->drawText(textRect,Qt::AlignLeft | Qt::AlignVCenter,text);
-
- //selection
- painter->setPen(nodeSelectPen_);
- painter->setBrush(Qt::NoBrush);
- QPolygon sel=stateShape.shape_;
-
- if(selected)
- {
- if(nodeStyle_ == BoxAndTextNodeStyle)
- {
- if(!realShape.shape_.isEmpty())
- sel=sel.united(realShape.shape_);
-
- sel=sel.united(QPolygon(textRect.adjusted(0,0,2,0)));
- }
- else
- {
- if(!realShape.shape_.isEmpty())
- sel=sel.united(realShape.shape_);
- }
- painter->drawRect(sel.boundingRect());
- //painter->drawPolygon(sel);
- }
-*/
- //painter->setRenderHints(QPainter::Antialiasing,false);
-}
-
-
-void TreeNodeViewDelegate::renderNodeShape(QPainter* painter,const NodeShape& shape) const
-{
- if(shape.shape_.isEmpty())
- return;
-
- QColor bg=shape.col_;
- QColor bgLight;
- if(bg.value() < 235)
- bgLight=bg.lighter(130);
- else
- bgLight=bg.lighter(lighter_);
-
- QColor borderCol=bg.darker(150); //125
-
- QBrush bgBrush;
- if(useStateGrad_)
- {
- grad_.setColorAt(0,bgLight);
- grad_.setColorAt(1,bg);
- bgBrush=QBrush(grad_);
- }
- else
- bgBrush=QBrush(bg);
-
- //Fill shape
- painter->setPen(borderCol);
- painter->setBrush(bgBrush);
- painter->drawPolygon(shape.shape_);
-}
-
-void TreeNodeViewDelegate::renderTimer(QPainter *painter,QRect target,int remaining, int total) const
-{
- QImage img(target.width(),target.height(),QImage::Format_ARGB32_Premultiplied);
- QRect r=img.rect().adjusted(2,2,-2,-2);
- img.fill(Qt::transparent);
- QPainter p(&img);
- p.setRenderHint(QPainter::Antialiasing,true);
-
- int angle=static_cast<int>(360.*static_cast<float>(total-remaining)/static_cast<float>(total));
- /*angle-=90.;
- if(angle >=0 && angle <= 90) angle=90-angle;
- else
- angle=450-angle;*/
-
- QColor c(43,97,158);
-
- QBrush b(c);
- p.setBrush(b);
- p.setPen(c);
- p.drawPie(r,90*16,-angle*16);
- p.setBrush(Qt::NoBrush);
- p.drawEllipse(r);
-
- painter->drawImage(target,img,img.rect());
-}
-
-
-void TreeNodeViewDelegate::renderServerUpdate(QPainter* painter,const ServerUpdateData& data) const
-{
- QFont font(font_);
- font.setPointSize(font_.pointSize()-1);
- QFontMetrics fm(font);
- painter->setFont(font);
- painter->setPen(Qt::black);
-
- QColor minCol=QColor(198,215,253);
- QColor maxCol=QColor(43,97,158);
-
- QRect r1=data.br_;
- r1.setWidth(fm.width(data.prevText_));
- painter->setPen(minCol);
- //painter->setPen(Qt::red);
- painter->drawText(r1,Qt::AlignLeft | Qt::AlignVCenter,data.prevText_);
-
- if(!data.prevText_.isEmpty())
- {
- QRect r2=data.br_;
- r2.setX(data.br_.right()-fm.width(data.nextText_));
- //painter->setPen(QColor(1,128,73));
- painter->setPen(maxCol);
- painter->drawText(r2,Qt::AlignRight | Qt::AlignVCenter,data.nextText_);
-
- int dh=(data.br_.height()-fm.height()+1)/2;
- QRect r=data.br_.adjusted(r1.width()+4,2*dh,-r2.width()-4,-2*dh);
-
- int pos=static_cast<int>(data.prog_* r.width());
- QRect rPrev=r.adjusted(0,0,-(r.width()-pos),0);
-
- QLinearGradient grad;
- grad.setCoordinateMode(QGradient::ObjectBoundingMode);
- grad.setStart(0,0);
- grad.setFinalStop(1,0);
- QColor posCol=interpolate(minCol,maxCol,data.prog_);
-
- grad.setColorAt(0,minCol);
- grad.setColorAt(1,posCol);
- painter->setPen(Qt::NoPen);
- painter->setBrush(grad);
- painter->drawRect(rPrev);
-
- painter->setBrush(Qt::NoBrush);
- painter->setPen(QColor(190,190,190));
- painter->drawRect(r);
- }
-}
-
-QString TreeNodeViewDelegate::formatTime(int timeInSec) const
-{
- int h=timeInSec/3600;
- int r=timeInSec%3600;
- int m=r/60;
- int s=r%60;
-
- QTime t(h,m,s);
- if(h > 0)
- return t.toString("h:mm:ss");
- else
- return t.toString("m:ss");
-
- return QString();
-}
-
-QColor TreeNodeViewDelegate::interpolate(QColor c1,QColor c2,float r) const
-{
- return QColor::fromRgbF(c1.redF()+r*(c2.redF()-c1.redF()),
- c1.greenF()+r*(c2.greenF()-c1.greenF()),
- c1.blueF()+r*(c2.blueF()-c1.blueF()));
-}
diff --git a/Viewer/src/TreeNodeViewDelegate.hpp b/Viewer/src/TreeNodeViewDelegate.hpp
index 1728584..67bdf40 100644
--- a/Viewer/src/TreeNodeViewDelegate.hpp
+++ b/Viewer/src/TreeNodeViewDelegate.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -11,80 +11,18 @@
#ifndef TreeNodeViewDelegate_HPP_
#define TreeNodeViewDelegate_HPP_
-#include <QBrush>
-#include <QMap>
-#include <QPen>
-#include <QStyledItemDelegate>
+#include "TreeNodeViewDelegateBase.hpp"
-#include "NodeViewDelegate.hpp"
-#include "VProperty.hpp"
-
-#include <string>
-
-class AnimationHandler;
-class PropertyMapper;
-class NodeShape;
-class NodeText;
-class ServerUpdateData;
-
-class TreeNodeViewDelegate : public NodeViewDelegate
+class TreeNodeViewDelegate : public TreeNodeViewDelegateBase
{
-Q_OBJECT
-
public:
- explicit TreeNodeViewDelegate(QWidget *parent=0);
+ explicit TreeNodeViewDelegate(TreeNodeModel* model,QWidget *parent=0);
~TreeNodeViewDelegate();
void paint(QPainter *painter,const QStyleOptionViewItem &option,
const QModelIndex& index) const;
- QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index ) const;
-
- void setIndentation(int o) {indentation_=o;}
-
-
-Q_SIGNALS:
- void sizeHintChangedGlobal();
-
-protected:
- void updateSettings();
-
- void renderServer(QPainter *painter,const QModelIndex& index,
- const QStyleOptionViewItemV4& option,QString text) const;
-
- void renderNode(QPainter *painter,const QModelIndex& index,
- const QStyleOptionViewItemV4& option,QString text) const;
-
- void renderServerCell(QPainter *painter,const NodeShape& stateShape,
- const NodeText& text,bool selected) const;
-
- void renderNodeCell(QPainter *painter,const NodeShape& stateShape,const NodeShape &realShape,
- const NodeText& nodeText,const NodeText& typeText,bool selected) const;
-
- void renderNodeShape(QPainter* painter,const NodeShape& shape) const;
- void renderTimer(QPainter *painter,QRect target, int remaining, int total) const;
- void renderServerUpdate(QPainter* painter,const ServerUpdateData&) const;
-
- QString formatTime(int timeInSec) const;
- QColor interpolate(QColor c1,QColor c2,float r) const;
-
- enum NodeStyle {ClassicNodeStyle,BoxAndTextNodeStyle};
-
- AnimationHandler* animation_;
-
- int nodeRectRad_;
- bool drawChildCount_;
- NodeStyle nodeStyle_;
- int indentation_;
- bool drawNodeType_;
- QColor typeBgCol_;
-
- QFont serverNumFont_;
- QFont suiteNumFont_;
- QFont serverInfoFont_;
- QFont abortedReasonFont_;
- QFont typeFont_;
- QColor bgCol_;
+ QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex& index ) const;
};
#endif
diff --git a/Viewer/src/TreeNodeViewDelegateBase.cpp b/Viewer/src/TreeNodeViewDelegateBase.cpp
new file mode 100644
index 0000000..f6a318a
--- /dev/null
+++ b/Viewer/src/TreeNodeViewDelegateBase.cpp
@@ -0,0 +1,1128 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//============================================================================
+
+#include "TreeNodeViewDelegateBase.hpp"
+
+#include <QApplication>
+#include <QDebug>
+#include <QImageReader>
+#include <QLinearGradient>
+#include <QPainter>
+
+#include "AbstractNodeModel.hpp"
+#include "Animation.hpp"
+#include "FontMetrics.hpp"
+#include "IconProvider.hpp"
+#include "Palette.hpp"
+#include "PropertyMapper.hpp"
+#include "ServerHandler.hpp"
+#include "TreeNodeModel.hpp"
+#include "UiLog.hpp"
+
+static std::vector<std::string> propVec;
+
+static QColor typeFgColourClassic=QColor(Qt::white);
+static QColor typeBgColourClassic=QColor(150,150,150);
+static QColor childCountColour=QColor(90,91,92);
+
+
+struct NodeShape
+{
+ QColor col_;
+ QPolygon shape_;
+};
+
+struct NodeText
+{
+ QColor fgCol_;
+ QColor bgCol_;
+ QRect br_;
+ QString text_;
+};
+
+struct ServerUpdateData
+{
+ QRect br_;
+ int prevTime_;
+ int nextTime_;
+ QString prevText_;
+ QString nextText_;
+ float prog_;
+};
+
+
+TreeNodeViewDelegateBase::TreeNodeViewDelegateBase(TreeNodeModel* model,QWidget *parent) :
+ nodeRectRad_(0),
+ drawChildCount_(true),
+ nodeStyle_(ClassicNodeStyle),
+ indentation_(0),
+ drawNodeType_(true),
+ bgCol_(Qt::white),
+ model_(model)
+{
+ drawAttrSelectionRect_=true;
+
+ attrFont_=font_;
+ attrFont_.setPointSize(8);
+ serverInfoFont_=font_;
+ suiteNumFont_=font_;
+ abortedReasonFont_=font_;
+ abortedReasonFont_.setBold(true);
+ typeFont_=font_;
+ typeFont_.setBold(true);
+ typeFont_.setPointSize(font_.pointSize()-1);
+
+ //Property
+ if(propVec.empty())
+ {
+ propVec.push_back("view.tree.nodeFont");
+ propVec.push_back("view.tree.attributeFont");
+ propVec.push_back("view.tree.display_child_count");
+ propVec.push_back("view.tree.displayNodeType");
+ propVec.push_back("view.tree.background");
+ propVec.push_back("view.common.node_style");
+
+ //Base settings
+ addBaseSettings(propVec);
+ }
+
+ prop_=new PropertyMapper(propVec,this);
+
+ //WARNING: updateSettings() cannot be called from here because
+ //nodeBox_ and attrBox_ are only created in the derived classes. So it muse be
+ //called from those derived classes.
+
+ //The parent must be the view!!!
+ animation_=new AnimationHandler(parent);
+}
+
+TreeNodeViewDelegateBase::~TreeNodeViewDelegateBase()
+{
+ delete animation_;
+}
+
+void TreeNodeViewDelegateBase::updateSettings()
+{
+ Q_ASSERT(nodeBox_);
+ Q_ASSERT(attrBox_);
+
+ if(VProperty* p=prop_->find("view.common.node_style"))
+ {
+ if(p->value().toString() == "classic")
+ nodeStyle_=ClassicNodeStyle;
+ else
+ nodeStyle_=BoxAndTextNodeStyle;
+ }
+ if(VProperty* p=prop_->find("view.tree.nodeRectRadius"))
+ {
+ nodeRectRad_=p->value().toInt();
+ }
+ if(VProperty* p=prop_->find("view.tree.nodeFont"))
+ {
+ QFont newFont=p->value().value<QFont>();
+
+ if(font_ != newFont )
+ {
+ font_=newFont;
+ nodeBox_->adjust(font_);
+ serverInfoFont_=font_;
+ serverNumFont_.setFamily(font_.family());
+ serverNumFont_.setPointSize(font_.pointSize()-1);
+ suiteNumFont_.setFamily(font_.family());
+ suiteNumFont_.setPointSize(font_.pointSize()-1);
+ abortedReasonFont_.setFamily(font_.family());
+ abortedReasonFont_.setPointSize(font_.pointSize());
+ typeFont_.setFamily(font_.family());
+ typeFont_.setPointSize(font_.pointSize()-1);
+
+ Q_EMIT sizeHintChangedGlobal();
+ }
+ }
+ if(VProperty* p=prop_->find("view.tree.attributeFont"))
+ {
+ QFont newFont=p->value().value<QFont>();
+
+ if(attrFont_ != newFont)
+ {
+ attrFont_=newFont;
+ attrBox_->adjust(attrFont_);
+ Q_EMIT sizeHintChangedGlobal();
+ }
+ }
+
+ if(VProperty* p=prop_->find("view.tree.display_child_count"))
+ {
+ drawChildCount_=p->value().toBool();
+ }
+
+ if(VProperty* p=prop_->find("view.tree.displayNodeType"))
+ {
+ drawNodeType_=p->value().toBool();
+ }
+
+ if(VProperty* p=prop_->find("view.tree.background"))
+ {
+ bgCol_=p->value().value<QColor>();
+ }
+
+ //Update the settings handled by the base class
+ updateBaseSettings();
+}
+
+
+int TreeNodeViewDelegateBase::renderServer(QPainter *painter,const QModelIndex& index,
+ const QStyleOptionViewItem& option,QString text) const
+{
+ ServerHandler* server=static_cast<ServerHandler*>(index.data(AbstractNodeModel::ServerPointerRole).value<void*>());
+ Q_ASSERT(server);
+
+ int totalWidth=0;
+ bool selected=option.state & QStyle::State_Selected;
+ //int offset=nodeBox_->leftMargin;
+ QFontMetrics fm(font_);
+
+ //The initial filled rect (we will adjust its width)
+ QRect itemRect=option.rect.adjusted(nodeBox_->leftMargin,nodeBox_->topMargin,0,-nodeBox_->bottomMargin);
+
+#if 0
+ painter->setPen(QColor(190,190,190));
+ painter->drawLine(0,option.rect.y()+1,painter->device()->width(),option.rect.y()+1);
+ painter->drawLine(0,option.rect.bottom()-1,painter->device()->width(),option.rect.bottom()-1);
+#endif
+#if 0
+
+ QRect progRect(0,itemRect.y()-deltaH,painter->device()->width(),itemRect.height()+2*deltaH);
+ progRect.setWidth(painter->device()->width());
+ painter->setBrush(Qt::NoBrush);
+ painter->setPen(QColor(190,190,190));
+ painter->drawRect(progRect);
+ painter->setBrush(QColor(230,230,230));
+ painter->drawRect(progRect.adjusted(0,0,-progRect.width()*0.4,0));
+#endif
+
+ int currentRight=itemRect.x();
+
+ NodeShape stateShape;
+ stateShape.col_=index.data(Qt::BackgroundRole).value<QColor>();
+
+ NodeText nodeText;
+ nodeText.text_=text;
+ int textWidth=fm.width(text);
+
+ if(nodeStyle_ == BoxAndTextNodeStyle)
+ {
+ stateShape.shape_=QPolygon(QRect(itemRect.x(),itemRect.y(),itemRect.height(),itemRect.height()));
+ QRect shBr=stateShape.shape_.boundingRect();
+ currentRight=shBr.x()+shBr.width()+2;
+ nodeText.br_=QRect(currentRight,itemRect.y(),textWidth+nodeBox_->leftPadding, itemRect.height());
+ nodeText.fgCol_=QColor(Qt::black);
+ currentRight=nodeText.br_.x()+nodeText.br_.width();
+ }
+ else
+ {
+ stateShape.shape_=QPolygon(QRect(itemRect.x(),itemRect.y(),textWidth+nodeBox_->leftPadding+nodeBox_->rightPadding,itemRect.height()));
+ nodeText.br_=QRect(itemRect.x()+nodeBox_->leftPadding,itemRect.y(),textWidth, itemRect.height());
+ nodeText.fgCol_=index.data(Qt::ForegroundRole).value<QColor>();
+ QRect shBr=stateShape.shape_.boundingRect();
+ currentRight=shBr.x()+shBr.width();;
+ }
+
+ //Refresh timer
+ /* bool hasTimer=true;
+ QRect timeRect(currentRight+offset,itemRect.y()-1,itemRect.height()+2,itemRect.height()+2);
+ currentRight=timeRect.right();*/
+
+ //Icons area
+ QList<QPixmap> pixLst;
+ QList<QRect> pixRectLst;
+
+ QVariant va=index.data(AbstractNodeModel::IconRole);
+ if(va.type() == QVariant::List)
+ {
+ QVariantList lst=va.toList();
+ if(lst.count() >0)
+ {
+ int xp=currentRight+nodeBox_->iconPreGap;
+ int yp=itemRect.center().y()+1-nodeBox_->iconSize/2;
+ for(int i=0; i < lst.count(); i++)
+ {
+ int id=lst[i].toInt();
+ if(id != -1)
+ {
+ pixLst << IconProvider::pixmap(id,nodeBox_->iconSize);
+ pixRectLst << QRect(xp,yp,nodeBox_->iconSize,nodeBox_->iconSize);
+ xp+=nodeBox_->iconSize+nodeBox_->iconGap;
+ }
+ }
+
+ if(!pixLst.isEmpty())
+ {
+ currentRight=xp-nodeBox_->iconGap;
+ }
+ }
+ }
+
+ //The pixmap (optional)
+ bool hasPix=false;
+ QRect pixRect;
+
+ //The info rectangle (optional)
+ QRect infoRect;
+ QString infoTxt=index.data(AbstractNodeModel::InfoRole).toString();
+ bool hasInfo=(infoTxt.isEmpty() == false);
+
+ if(hasInfo)
+ {
+ //infoFont.setBold(true);
+ fm=QFontMetrics(serverInfoFont_);
+
+ int infoWidth=fm.width(infoTxt);
+ infoRect = nodeText.br_;
+ infoRect.setLeft(currentRight+fm.width('A'));
+ infoRect.setWidth(infoWidth);
+ currentRight=infoRect.x()+infoRect.width();
+ }
+
+ //The load icon (optional)
+ QRect loadRect;
+ bool hasLoad=index.data(AbstractNodeModel::LoadRole).toBool();
+ Animation* an=0;
+
+ //Update load animation
+ if(hasLoad)
+ {
+ an=animation_->find(Animation::ServerLoadType,true);
+
+ loadRect = QRect(currentRight+fm.width('A'),
+ itemRect.top()+(itemRect.height()-an->scaledSize().height())/2,
+ an->scaledSize().width(),
+ an->scaledSize().height());
+
+ currentRight=loadRect.x()+loadRect.width();
+
+ //Add this index to the animations
+ //There is no guarantee that this index will be valid in the future!!!
+ an->addTarget(server->vRoot());
+ }
+ //Stops load animation
+ else
+ {
+ if((an=animation_->find(Animation::ServerLoadType,false)) != NULL)
+ an->removeTarget(server->vRoot());
+ }
+
+ //The node number (optional)
+ QRect numRect;
+ QString numTxt;
+ bool hasNum=false;
+
+ if(drawChildCount_)
+ {
+ QVariant va=index.data(AbstractNodeModel::NodeNumRole);
+ hasNum=(va.isNull() == false);
+ if(hasNum)
+ {
+ numTxt="(" + QString::number(va.toInt()) + ")";
+
+ QFontMetrics fmNum(serverNumFont_);
+
+ int numWidth=fmNum.width(numTxt);
+ numRect = nodeText.br_;
+ numRect.setLeft(currentRight+fmNum.width('A')/2);
+ numRect.setWidth(numWidth);
+ currentRight=numRect.x()+numRect.width();
+ }
+ }
+
+ //Update
+ bool hasUpdate=false;
+ ServerUpdateData updateData;
+#if 0
+ if(server)
+ {
+ hasUpdate=true;
+ updateData.br_=QRect(currentRight+3*offset,itemRect.y()-1,0,itemRect.height()+2);
+ updateData.prevTime_=server->secsSinceLastRefresh();
+ updateData.nextTime_=server->secsTillNextRefresh();
+ if(updateData.prevTime_ >=0)
+ {
+ if(updateData.nextTime_ >=0)
+ {
+ updateData.prevText_="-" + formatTime(updateData.prevTime_);
+ updateData.nextText_="+" +formatTime(updateData.nextTime_);
+ updateData.prog_=(static_cast<float>(updateData.prevTime_)/static_cast<float>(updateData.prevTime_+updateData.nextTime_));
+ updateData.br_.setWidth(fm.width("ABCDE")+fm.width(updateData.prevText_)+fm.width(updateData.nextText_)+2*offset);
+ }
+ else
+ {
+ updateData.prevText_="last update: " + formatTime(updateData.prevTime_);
+ updateData.prog_=0;
+ updateData.br_.setWidth(fm.width(updateData.prevText_));
+ }
+ currentRight=updateData.br_.right();
+ }
+ else
+ {
+ hasUpdate=false;
+ }
+ }
+#endif
+
+ //Define clipping
+ int rightPos=currentRight+1;
+ totalWidth=rightPos-option.rect.left();
+ const bool setClipRect = rightPos > option.rect.right();
+ if(setClipRect)
+ {
+ painter->save();
+ painter->setClipRect(option.rect);
+ }
+
+ //Draw state/node rect
+ renderServerCell(painter,stateShape,nodeText,selected);
+
+ //Draw timer
+ /*int remaining=6*60*1000; // server->remainingTimeToRefresh();
+ int total=10*60*1000; //server->refreshPeriod() ;
+ renderTimer(painter,timeRect,remaining,total);*/
+
+ //Draw icons
+ for(int i=0; i < pixLst.count(); i++)
+ {
+ painter->drawPixmap(pixRectLst[i],pixLst[i]);
+ }
+
+ //Draw pixmap if needed
+ if(hasPix)
+ {
+ painter->drawPixmap(pixRect,errPix_);
+ }
+
+ //Draw info
+ if(hasInfo)
+ {
+ painter->setPen(Qt::black);
+ painter->setFont(serverInfoFont_);
+ painter->drawText(infoRect,Qt::AlignLeft | Qt::AlignVCenter,infoTxt);
+ }
+
+ //Draw number
+ if(hasNum)
+ {
+ painter->setPen(childCountColour);
+ painter->setFont(serverNumFont_);
+ painter->drawText(numRect,Qt::AlignLeft | Qt::AlignVCenter,numTxt);
+ }
+
+ //Draw load animation
+ if(hasLoad)
+ {
+ Animation* an=animation_->find(Animation::ServerLoadType,false);
+ if(an)
+ {
+ painter->drawPixmap(loadRect,an->currentPixmap());
+ }
+ }
+#if 0
+ if(hasUpdate)
+ {
+ renderServerUpdate(painter,updateData);
+ }
+#endif
+ if(setClipRect)
+ {
+ painter->restore();
+ }
+
+ return totalWidth;
+}
+
+int TreeNodeViewDelegateBase::renderNode(QPainter *painter,const QModelIndex& index,
+ const QStyleOptionViewItem& option,QString text) const
+{
+ int totalWidth=0;
+ bool selected=option.state & QStyle::State_Selected;
+ QFontMetrics fm(font_);
+
+ //The initial filled rect (we will adjust its width)
+ QRect itemRect=option.rect.adjusted(nodeBox_->leftMargin,nodeBox_->topMargin,0,-nodeBox_->bottomMargin);
+
+ NodeShape stateShape;
+ NodeShape realShape;
+ NodeText nodeText;
+ NodeText typeText;
+
+ //get the colours
+ QVariant bgVa=index.data(Qt::BackgroundRole);
+ bool hasRealBg=false;
+ if(bgVa.type() == QVariant::List)
+ {
+ QVariantList lst=bgVa.toList();
+ if(lst.count() == 2)
+ {
+ hasRealBg=true;
+ stateShape.col_=lst[0].value<QColor>();
+ realShape.col_=lst[1].value<QColor>();
+ }
+ }
+ else
+ {
+ stateShape.col_=bgVa.value<QColor>();
+ }
+
+ int currentRight=itemRect.x();
+
+ //Node type
+ QFontMetrics fmType(typeFont_);
+ int typeWidth=fmType.width(" S");
+
+ if(drawNodeType_)
+ {
+ int nodeType=index.data(AbstractNodeModel::NodeTypeRole).toInt();
+ switch(nodeType)
+ {
+ case 0: typeText.text_="S"; break;
+ case 1: typeText.text_="F"; break;
+ case 2: typeText.text_="T"; break;
+ case 3: typeText.text_="A"; break;
+ default: break;
+ }
+ }
+
+ //The text rectangle
+ nodeText.text_=text;
+ int textWidth=fm.width(text);
+
+ if(nodeStyle_ == BoxAndTextNodeStyle)
+ {
+ int realW=itemRect.height()/4;
+
+ QRect r1(currentRight,itemRect.y(),itemRect.height(),itemRect.height());
+ if(hasRealBg)
+ r1.adjust(0,0,-realW,0);
+
+ stateShape.shape_=QPolygon(r1);
+
+ if(hasRealBg)
+ {
+ QRect r2(r1.x()+r1.width(),r1.top(),realW+1,r1.height());
+ realShape.shape_=QPolygon(r2);
+ currentRight=r2.x()+r2.width()+2;
+ }
+ else
+ currentRight=r1.x()+r1.width()+2;
+
+ if(drawNodeType_)
+ {
+ typeText.br_=r1;
+ typeText.fgCol_=index.data(AbstractNodeModel::NodeTypeForegroundRole).value<QColor>();
+ }
+
+ nodeText.br_=QRect(currentRight,r1.top(),textWidth+nodeBox_->leftPadding,r1.height());
+ nodeText.fgCol_=QColor(Qt::black);
+ currentRight=nodeText.br_.x() + nodeText.br_.width();
+
+#if 0
+ if(nodeStyle_ == BoxAndTextNodeStyle)
+ {
+ int realW=itemRect.height()/4;
+
+ //state box
+ currentRight+=itemRect.height();
+ if(hasRealBg)
+ {
+ currentRight+=1;
+ }
+ currentRight+=2;
+
+ //node name
+ currentRight+=textWidth+nodeBox_->leftPadding;
+ }
+#endif
+
+ }
+ //Classic style
+ else
+ {
+ if(drawNodeType_)
+ {
+ typeText.br_=QRect(currentRight,itemRect.y(),typeWidth,itemRect.height());
+ typeText.fgCol_=typeFgColourClassic;
+ typeText.bgCol_=typeBgColourClassic;
+ currentRight=typeText.br_.x()+typeText.br_.width()+2;
+ }
+
+ QRect r1(currentRight,itemRect.y(),textWidth+nodeBox_->leftPadding+nodeBox_->rightPadding,itemRect.height());
+ stateShape.shape_=QPolygon(r1);
+ currentRight=r1.x()+r1.width();
+
+ nodeText.br_=QRect(r1.left()+nodeBox_->leftPadding,r1.top(),textWidth,r1.height());
+ nodeText.fgCol_=index.data(Qt::ForegroundRole).value<QColor>();
+
+ if(hasRealBg)
+ {
+ int realW=6;
+ QRect r2(r1.x()+r1.width(),r1.top(),realW+1,r1.height());
+ realShape.shape_=QPolygon(r2);
+ currentRight=r2.x()+r2.width();
+ }
+ }
+
+ //Icons area
+ QList<QPixmap> pixLst;
+ QList<QRect> pixRectLst;
+
+ QVariant va=index.data(AbstractNodeModel::IconRole);
+ if(va.type() == QVariant::List)
+ {
+ QVariantList lst=va.toList();
+ if(lst.count() >0)
+ {
+ int xp=currentRight+nodeBox_->iconPreGap;
+ int yp=itemRect.center().y()+1-nodeBox_->iconSize/2;
+ for(int i=0; i < lst.count(); i++)
+ {
+ int id=lst[i].toInt();
+ if(id != -1)
+ {
+ pixLst << IconProvider::pixmap(id,nodeBox_->iconSize);
+ pixRectLst << QRect(xp,yp,nodeBox_->iconSize,nodeBox_->iconSize);
+ xp+=nodeBox_->iconSize+nodeBox_->iconGap;
+ }
+ }
+
+ if(!pixLst.isEmpty())
+ {
+ currentRight=xp-nodeBox_->iconGap;
+ }
+ }
+ }
+
+ //The node number (optional)
+ QRect numRect;
+ QString numTxt;
+ bool hasNum=false;
+
+ if(drawChildCount_)
+ {
+ va=index.data(AbstractNodeModel::NodeNumRole);
+ hasNum=(va.isNull() == false);
+
+ if(hasNum)
+ {
+ numTxt="(" + va.toString() + ")";
+ QFontMetrics fmNum(suiteNumFont_);
+
+ int numWidth=fmNum.width(numTxt);
+ numRect = nodeText.br_;
+ numRect.setLeft(currentRight+fmNum.width('A')/2);
+ numRect.setWidth(numWidth);
+ currentRight=numRect.x()+numRect.width();
+ }
+ }
+
+ //The aborted reason
+ QRect reasonRect;
+ QString reasonTxt=index.data(AbstractNodeModel::AbortedReasonRole).toString();
+ if(reasonTxt.contains('\n'))
+ reasonTxt=reasonTxt.split("\n").first();
+
+ bool hasReason=(!reasonTxt.isEmpty());
+ if(hasReason)
+ {
+ QFontMetrics fmReason(abortedReasonFont_);
+ reasonRect = nodeText.br_;
+ reasonRect.setLeft(currentRight+fmReason.width('A')/2);
+ reasonTxt=fmReason.elidedText(reasonTxt,Qt::ElideRight,220);
+ reasonRect.setWidth(fmReason.width(reasonTxt));
+ currentRight=reasonRect.x()+reasonRect.width();
+ }
+
+ //Define clipping
+ int rightPos=currentRight+1;
+ totalWidth=rightPos-option.rect.left();
+
+#if 0
+ const bool setClipRect = rightPos > option.rect.right();
+ if(setClipRect)
+ {
+ painter->save();
+ painter->setClipRect(option.rect);
+ }
+#endif
+
+
+ renderNodeCell(painter,stateShape,realShape,nodeText,typeText,selected);
+
+ //Draw icons
+ for(int i=0; i < pixLst.count(); i++)
+ {
+ //painter->fillRect(pixRectLst[i],Qt::black);
+ painter->drawPixmap(pixRectLst[i],pixLst[i]);
+ }
+
+ //Draw number
+ if(hasNum)
+ {
+ painter->setPen(childCountColour);
+ painter->setFont(suiteNumFont_);
+ painter->drawText(numRect,Qt::AlignLeft | Qt::AlignVCenter,numTxt);
+ }
+
+ //Draw aborted reason
+ if(hasReason)
+ {
+ painter->setPen(stateShape.col_.darker(120));
+ painter->setFont(abortedReasonFont_);
+ painter->drawText(reasonRect,Qt::AlignLeft | Qt::AlignVCenter,reasonTxt);
+ }
+#if 0
+ if(setClipRect)
+ {
+ painter->restore();
+ }
+#endif
+ return totalWidth;
+}
+
+void TreeNodeViewDelegateBase::renderServerCell(QPainter *painter,const NodeShape& stateShape,
+ const NodeText& text,bool selected) const
+{
+ renderNodeShape(painter,stateShape);
+
+ //Draw text
+ painter->setFont(font_);
+ painter->setPen(QPen(text.fgCol_,0));
+ painter->drawText(text.br_,Qt::AlignHCenter | Qt::AlignVCenter,text.text_);
+
+ //selection
+ painter->setPen(nodeSelectPen_);
+ painter->setBrush(Qt::NoBrush);
+ QPolygon sel=stateShape.shape_;
+
+ if(selected)
+ {
+ if(nodeStyle_ == BoxAndTextNodeStyle)
+ {
+ sel=sel.united(QPolygon(text.br_.adjusted(0,0,2,0)));
+ }
+ painter->drawRect(sel.boundingRect());
+ }
+}
+
+void TreeNodeViewDelegateBase::renderNodeCell(QPainter *painter,const NodeShape& stateShape,const NodeShape &realShape,
+ const NodeText& nodeText,const NodeText& typeText,bool selected) const
+{
+ renderNodeShape(painter,stateShape);
+ renderNodeShape(painter,realShape);
+
+ //Draw type
+ if(drawNodeType_)
+ {
+ if(typeText.bgCol_.isValid())
+ {
+ //painter->fillRect(typeText.br_,typeText.bgCol_);
+ painter->setBrush(typeText.bgCol_);
+ painter->setPen(typeText.bgCol_);
+ painter->drawRect(typeText.br_);
+ }
+ painter->setFont(typeFont_);
+ painter->setPen(typeText.fgCol_);
+ painter->setBrush(Qt::NoBrush);
+ painter->drawText(typeText.br_,Qt::AlignCenter,typeText.text_);
+ }
+
+ //Draw text
+ painter->setFont(font_);
+ painter->setPen(QPen(nodeText.fgCol_,0));
+ painter->drawText(nodeBox_->adjustTextRect(nodeText.br_),Qt::AlignHCenter | Qt::AlignVCenter,nodeText.text_);
+
+ //selection
+ painter->setPen(nodeSelectPen_);
+ painter->setBrush(Qt::NoBrush);
+ QPolygon sel=stateShape.shape_;
+
+ if(selected)
+ {
+ if(nodeStyle_ == BoxAndTextNodeStyle)
+ {
+ if(!realShape.shape_.isEmpty())
+ sel=sel.united(realShape.shape_);
+
+ sel=sel.united(QPolygon(nodeText.br_.adjusted(0,0,0,0)));
+ }
+ else
+ {
+ if(!realShape.shape_.isEmpty())
+ sel=sel.united(realShape.shape_);
+ }
+ painter->drawRect(sel.boundingRect());
+ }
+
+ /*
+
+ if(nodeStyle_ == BoxAndTextNodeStyle)
+ {
+ painter->setFont(typeFont_);
+ painter->setPen();
+ painter->drawText(typeText.br_,Qt::AlignCenter,typeText.text_);
+ }
+ else
+ {
+ painter->setPen(Qt::NoPen);
+
+ if(typeTxt == "S")
+ painter->setBrush(QColor(150,150,150)); //bgBrush);
+ else if(typeTxt == "F")
+ painter->setBrush(QColor(150,150,150)); //bgBrush);
+ else
+ painter->setBrush(QColor(190,190,190)); //bgBrush);
+
+ painter->drawRect(typeRect);
+
+ painter->setPen(Qt::white);
+ painter->setFont(typeFont_);
+ painter->drawText(typeRect,Qt::AlignCenter,typeTxt);
+ }
+ }
+
+ //Draw text
+ painter->setFont(font_);
+ painter->setPen(QPen(fg,0));
+ painter->drawText(textRect,Qt::AlignLeft | Qt::AlignVCenter,text);
+
+ //selection
+ painter->setPen(nodeSelectPen_);
+ painter->setBrush(Qt::NoBrush);
+ QPolygon sel=stateShape.shape_;
+
+ if(selected)
+ {
+ if(nodeStyle_ == BoxAndTextNodeStyle)
+ {
+ if(!realShape.shape_.isEmpty())
+ sel=sel.united(realShape.shape_);
+
+ sel=sel.united(QPolygon(textRect.adjusted(0,0,2,0)));
+ }
+ else
+ {
+ if(!realShape.shape_.isEmpty())
+ sel=sel.united(realShape.shape_);
+ }
+ painter->drawRect(sel.boundingRect());
+ //painter->drawPolygon(sel);
+ }
+*/
+ //painter->setRenderHints(QPainter::Antialiasing,false);
+}
+
+
+void TreeNodeViewDelegateBase::renderNodeShape(QPainter* painter,const NodeShape& shape) const
+{
+ if(shape.shape_.isEmpty())
+ return;
+
+ QColor bg=shape.col_;
+ QColor bgLight, borderCol;
+ Palette::statusColours(bg,bgLight,borderCol);
+
+ QBrush bgBrush;
+ if(useStateGrad_)
+ {
+ grad_.setColorAt(0,bgLight);
+ grad_.setColorAt(1,bg);
+ bgBrush=QBrush(grad_);
+ }
+ else
+ bgBrush=QBrush(bg);
+
+ //Fill shape
+ painter->setPen(borderCol);
+ painter->setBrush(bgBrush);
+ painter->drawPolygon(shape.shape_);
+}
+
+void TreeNodeViewDelegateBase::renderTimer(QPainter *painter,QRect target,int remaining, int total) const
+{
+ QImage img(target.width(),target.height(),QImage::Format_ARGB32_Premultiplied);
+ QRect r=img.rect().adjusted(2,2,-2,-2);
+ img.fill(Qt::transparent);
+ QPainter p(&img);
+ p.setRenderHint(QPainter::Antialiasing,true);
+
+ int angle=static_cast<int>(360.*static_cast<float>(total-remaining)/static_cast<float>(total));
+ /*angle-=90.;
+ if(angle >=0 && angle <= 90) angle=90-angle;
+ else
+ angle=450-angle;*/
+
+ QColor c(43,97,158);
+
+ QBrush b(c);
+ p.setBrush(b);
+ p.setPen(c);
+ p.drawPie(r,90*16,-angle*16);
+ p.setBrush(Qt::NoBrush);
+ p.drawEllipse(r);
+
+ painter->drawImage(target,img,img.rect());
+}
+
+
+void TreeNodeViewDelegateBase::renderServerUpdate(QPainter* painter,const ServerUpdateData& data) const
+{
+ QFont font(font_);
+ font.setPointSize(font_.pointSize()-1);
+ QFontMetrics fm(font);
+ painter->setFont(font);
+ painter->setPen(Qt::black);
+
+ QColor minCol=QColor(198,215,253);
+ QColor maxCol=QColor(43,97,158);
+
+ QRect r1=data.br_;
+ r1.setWidth(fm.width(data.prevText_));
+ painter->setPen(minCol);
+ //painter->setPen(Qt::red);
+ painter->drawText(r1,Qt::AlignLeft | Qt::AlignVCenter,data.prevText_);
+
+ if(!data.prevText_.isEmpty())
+ {
+ QRect r2=data.br_;
+ r2.setX(data.br_.right()-fm.width(data.nextText_));
+ //painter->setPen(QColor(1,128,73));
+ painter->setPen(maxCol);
+ painter->drawText(r2,Qt::AlignRight | Qt::AlignVCenter,data.nextText_);
+
+ int dh=(data.br_.height()-fm.height()+1)/2;
+ QRect r=data.br_.adjusted(r1.width()+4,2*dh,-r2.width()-4,-2*dh);
+
+ int pos=static_cast<int>(data.prog_* r.width());
+ QRect rPrev=r.adjusted(0,0,-(r.width()-pos),0);
+
+ QLinearGradient grad;
+ grad.setCoordinateMode(QGradient::ObjectBoundingMode);
+ grad.setStart(0,0);
+ grad.setFinalStop(1,0);
+ QColor posCol=interpolate(minCol,maxCol,data.prog_);
+
+ grad.setColorAt(0,minCol);
+ grad.setColorAt(1,posCol);
+ painter->setPen(Qt::NoPen);
+ painter->setBrush(grad);
+ painter->drawRect(rPrev);
+
+ painter->setBrush(Qt::NoBrush);
+ painter->setPen(QColor(190,190,190));
+ painter->drawRect(r);
+ }
+}
+
+void TreeNodeViewDelegateBase::widthHintServer(const QModelIndex& index,int& itemWidth, QString text) const
+{
+ ServerHandler* server=static_cast<ServerHandler*>(index.data(AbstractNodeModel::ServerPointerRole).value<void*>());
+ Q_ASSERT(server);
+
+ QFontMetrics fm(font_);
+
+ //The initial filled rect. We only care of the width
+ QRect itemRect(nodeBox_->leftMargin,0,10,10);
+ int currentRight=itemRect.left();
+
+ NodeShape stateShape;
+
+ NodeText nodeText;
+ nodeText.text_=text;
+ int textWidth=fm.width(text);
+
+ if(nodeStyle_ == BoxAndTextNodeStyle)
+ {
+ currentRight+=2+textWidth+nodeBox_->leftPadding;
+ }
+ else
+ {
+ currentRight+=textWidth+nodeBox_->leftPadding+nodeBox_->rightPadding;
+ }
+
+ //Icons area
+ int pixNum=model_->iconNum(server->vRoot());
+ if(pixNum > 0)
+ {
+ currentRight+=nodeBox_->iconPreGap+pixNum*nodeBox_->iconSize + (pixNum-1)*nodeBox_->iconGap;
+ }
+
+ //The info rectangle (optional)
+ QString infoTxt=index.data(AbstractNodeModel::InfoRole).toString();
+ bool hasInfo=(infoTxt.isEmpty() == false);
+
+ if(hasInfo)
+ {
+ fm=QFontMetrics(serverInfoFont_);
+ int infoWidth=fm.width(infoTxt);
+ currentRight+=fm.width('A')+infoWidth;
+ }
+
+ //The load icon (optional)
+ bool hasLoad=index.data(AbstractNodeModel::LoadRole).toBool();
+ Animation* an=0;
+
+ //Update load animation
+ if(hasLoad)
+ {
+ an=animation_->find(Animation::ServerLoadType,true);
+ currentRight+=fm.width('A')+an->scaledSize().width();
+ }
+ //Stops load animation
+ else
+ {
+ //if((an=animation_->find(Animation::ServerLoadType,false)) != NULL)
+ // an->removeTarget(server->vRoot());
+ }
+
+ //The node number (optional)
+ QString numTxt;
+ bool hasNum=false;
+
+ if(drawChildCount_)
+ {
+ QVariant va=index.data(AbstractNodeModel::NodeNumRole);
+ hasNum=(va.isNull() == false);
+ if(hasNum)
+ {
+ numTxt="(" + QString::number(va.toInt()) + ")";
+ QFontMetrics fmNum(serverNumFont_);
+ int numWidth=fmNum.width(numTxt);
+ currentRight+=fmNum.width('A')/2+numWidth;
+ }
+ }
+
+ itemWidth=currentRight+1;
+}
+
+int TreeNodeViewDelegateBase::nodeWidth(const QModelIndex& index,QString text) const
+{
+ VNode* node=static_cast<VNode*>(index.data(AbstractNodeModel::NodePointerRole).value<void*>());
+ Q_ASSERT(node);
+
+ int offset=nodeBox_->leftMargin;
+ QFontMetrics fm(font_);
+
+ //The initial filled rect. We only care about the width!
+ QRect itemRect(offset,0,10,10);
+ int currentRight=itemRect.left();
+
+ bool hasRealBg=node->isSuspended();
+
+ //Node type
+ QFontMetrics fmType(typeFont_);
+ int typeWidth=fmType.width(" S");
+
+ //The text rectangle
+ int textWidth=fm.width(text);
+
+ if(nodeStyle_ == BoxAndTextNodeStyle)
+ {
+ int realW=itemRect.height()/4;
+
+ //state box
+ currentRight+=itemRect.height();
+ if(hasRealBg)
+ {
+ currentRight+=1;
+ }
+ currentRight+=2;
+
+ //node name
+ currentRight+=textWidth+nodeBox_->leftPadding;
+ }
+ //Classic style
+ else
+ {
+ //node type box
+ if(drawNodeType_)
+ {
+ currentRight+=typeWidth+2;
+ }
+
+ //node name + state
+ currentRight+=textWidth+nodeBox_->leftPadding+nodeBox_->rightPadding;
+
+ if(hasRealBg)
+ {
+ int realW=6;
+ currentRight+=realW+1;
+ }
+ }
+
+ //Icons area
+ int pixNum=model_->iconNum(node);
+ if(pixNum > 0)
+ {
+ currentRight+=nodeBox_->iconPreGap+pixNum*nodeBox_->iconSize + (pixNum-1)*nodeBox_->iconGap;
+ }
+
+ //The node number (optional)
+ if(drawChildCount_)
+ {
+ if(node->isTopLevel())
+ {
+ QVariant va=index.data(AbstractNodeModel::NodeNumRole);
+ if(va.isNull() == false)
+ {
+ QString numTxt="(" + va.toString() + ")";
+ QFontMetrics fmNum(suiteNumFont_);
+ int numWidth=fmNum.width(numTxt);
+ currentRight+=fmNum.width('A')/2+numWidth;
+ }
+ }
+ }
+
+ //The aborted reason
+ if(node->isAborted())
+ {
+ QString reasonTxt=QString::fromStdString(node->abortedReason());
+ if(reasonTxt.contains('\n'))
+ reasonTxt=reasonTxt.split("\n").first();
+
+ bool hasReason=(!reasonTxt.isEmpty());
+ if(hasReason)
+ {
+ QFontMetrics fmReason(abortedReasonFont_);
+ reasonTxt=fmReason.elidedText(reasonTxt,Qt::ElideRight,220);
+ currentRight+=fmReason.width('A')/2+fmReason.width(reasonTxt);
+ }
+ }
+
+ return currentRight+1;
+}
+
+
+QString TreeNodeViewDelegateBase::formatTime(int timeInSec) const
+{
+ int h=timeInSec/3600;
+ int r=timeInSec%3600;
+ int m=r/60;
+ int s=r%60;
+
+ QTime t(h,m,s);
+ if(h > 0)
+ return t.toString("h:mm:ss");
+ else
+ return t.toString("m:ss");
+
+ return QString();
+}
+
+QColor TreeNodeViewDelegateBase::interpolate(QColor c1,QColor c2,float r) const
+{
+ return QColor::fromRgbF(c1.redF()+r*(c2.redF()-c1.redF()),
+ c1.greenF()+r*(c2.greenF()-c1.greenF()),
+ c1.blueF()+r*(c2.blueF()-c1.blueF()));
+}
diff --git a/Viewer/src/TreeNodeViewDelegate.hpp b/Viewer/src/TreeNodeViewDelegateBase.hpp
similarity index 68%
copy from Viewer/src/TreeNodeViewDelegate.hpp
copy to Viewer/src/TreeNodeViewDelegateBase.hpp
index 1728584..b9078c8 100644
--- a/Viewer/src/TreeNodeViewDelegate.hpp
+++ b/Viewer/src/TreeNodeViewDelegateBase.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -8,8 +8,8 @@
//
//============================================================================
-#ifndef TreeNodeViewDelegate_HPP_
-#define TreeNodeViewDelegate_HPP_
+#ifndef TREENODEVIEWDELEGATEBASE_HPP
+#define TREENODEVIEWDELEGATEBASE_HPP
#include <QBrush>
#include <QMap>
@@ -26,34 +26,29 @@ class PropertyMapper;
class NodeShape;
class NodeText;
class ServerUpdateData;
+class TreeNodeModel;
-class TreeNodeViewDelegate : public NodeViewDelegate
+class TreeNodeViewDelegateBase : public NodeViewDelegate
{
Q_OBJECT
public:
- explicit TreeNodeViewDelegate(QWidget *parent=0);
- ~TreeNodeViewDelegate();
-
- void paint(QPainter *painter,const QStyleOptionViewItem &option,
- const QModelIndex& index) const;
-
- QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index ) const;
+ explicit TreeNodeViewDelegateBase(TreeNodeModel* model,QWidget *parent=0);
+ ~TreeNodeViewDelegateBase();
void setIndentation(int o) {indentation_=o;}
-
Q_SIGNALS:
void sizeHintChangedGlobal();
protected:
void updateSettings();
- void renderServer(QPainter *painter,const QModelIndex& index,
- const QStyleOptionViewItemV4& option,QString text) const;
+ int renderServer(QPainter *painter,const QModelIndex& index,
+ const QStyleOptionViewItem& option,QString text) const;
- void renderNode(QPainter *painter,const QModelIndex& index,
- const QStyleOptionViewItemV4& option,QString text) const;
+ int renderNode(QPainter *painter,const QModelIndex& index,
+ const QStyleOptionViewItem& option,QString text) const;
void renderServerCell(QPainter *painter,const NodeShape& stateShape,
const NodeText& text,bool selected) const;
@@ -65,29 +60,35 @@ protected:
void renderTimer(QPainter *painter,QRect target, int remaining, int total) const;
void renderServerUpdate(QPainter* painter,const ServerUpdateData&) const;
+ void widthHintServer(const QModelIndex& index,int& itemWidth,QString text) const;
+ int nodeWidth(const QModelIndex& index,QString text) const;
+
QString formatTime(int timeInSec) const;
QColor interpolate(QColor c1,QColor c2,float r) const;
enum NodeStyle {ClassicNodeStyle,BoxAndTextNodeStyle};
-
+
AnimationHandler* animation_;
int nodeRectRad_;
- bool drawChildCount_;
+ bool drawChildCount_;
NodeStyle nodeStyle_;
int indentation_;
+
bool drawNodeType_;
QColor typeBgCol_;
QFont serverNumFont_;
- QFont suiteNumFont_;
- QFont serverInfoFont_;
- QFont abortedReasonFont_;
+ QFont suiteNumFont_;
+ QFont serverInfoFont_;
+ QFont abortedReasonFont_;
QFont typeFont_;
QColor bgCol_;
+
+ TreeNodeModel* model_;
};
-#endif
+#endif // TREENODEVIEWDELEGATEBASE_HPP
diff --git a/Viewer/src/TreeNodeWidget.cpp b/Viewer/src/TreeNodeWidget.cpp
index 21b93c5..35cc7bf 100644
--- a/Viewer/src/TreeNodeWidget.cpp
+++ b/Viewer/src/TreeNodeWidget.cpp
@@ -1,6 +1,6 @@
/***************************** LICENSE START ***********************************
- Copyright 2015 ECMWF and INPE. This software is distributed under the terms
+ Copyright 2009-2017 ECMWF and INPE. This software is distributed under the terms
of the Apache License version 2.0. In applying this license, ECMWF does not
waive the privileges and immunities granted to it by virtue of its status as
an Intergovernmental Organization or submit itself to any jurisdiction.
@@ -9,17 +9,18 @@
#include "TreeNodeWidget.hpp"
-#include <QDebug>
#include <QHBoxLayout>
#include "AbstractNodeModel.hpp"
#include "DashboardDock.hpp"
+#include "CompactNodeView.hpp"
#include "NodePathWidget.hpp"
#include "NodeViewBase.hpp"
#include "TreeNodeModel.hpp"
#include "TreeNodeView.hpp"
#include "VFilter.hpp"
#include "VConfig.hpp"
+#include "VModelData.hpp"
#include "VSettings.hpp"
#include "WidgetNameProvider.hpp"
@@ -27,7 +28,10 @@
AttributeFilter* TreeNodeWidget::lastAtts_=NULL;
-TreeNodeWidget::TreeNodeWidget(ServerFilter* serverFilter,QWidget* parent) : NodeWidget("tree",serverFilter,parent)
+TreeNodeWidget::TreeNodeWidget(ServerFilter* serverFilter,QWidget* parent) :
+ NodeWidget("tree",serverFilter,parent),
+ layoutProp_(0),
+ viewLayoutMode_(StandardLayoutMode)
{
//Init qt-creator form
setupUi(this);
@@ -39,6 +43,9 @@ TreeNodeWidget::TreeNodeWidget(ServerFilter* serverFilter,QWidget* parent) : Nod
initAtts();
+ //Create the breadcrumbs (it will be reparented)
+ bcWidget_=new NodePathWidget(this);
+
//This defines how to filter the nodes in the tree. We only want to filter according to node status.
filterDef_=new NodeFilterDef(serverFilter_,NodeFilterDef::NodeStateScope);
@@ -49,52 +56,31 @@ TreeNodeWidget::TreeNodeWidget(ServerFilter* serverFilter,QWidget* parent) : Nod
QHBoxLayout *hb=new QHBoxLayout(viewHolder_);
hb->setContentsMargins(0,0,0,0);
hb->setSpacing(0);
- TreeNodeView *tv=new TreeNodeView((TreeNodeModel*)model_,filterDef_,this);
- hb->addWidget(tv);
- //Store the pointer to the (non-QObject) base class of the view!!!
- view_=tv;
+ layoutProp_=VConfig::instance()->find("view.tree.layoutStyle");
+ Q_ASSERT(layoutProp_);
+ layoutProp_->addObserver(this);
- //Signals-slots
- connect(view_->realWidget(),SIGNAL(selectionChanged(VInfo_ptr)),
- this,SLOT(slotSelectionChangedInView(VInfo_ptr)));
+ if(layoutProp_->value() == "compact")
+ {
+ viewLayoutMode_=CompactLayoutMode;
+ }
- connect(view_->realWidget(),SIGNAL(infoPanelCommand(VInfo_ptr,QString)),
- this,SIGNAL(popInfoPanel(VInfo_ptr,QString)));
+ Q_ASSERT(view_==0);
+ setViewLayoutMode(viewLayoutMode_);
- connect(view_->realWidget(),SIGNAL(dashboardCommand(VInfo_ptr,QString)),
- this,SIGNAL(dashboardCommand(VInfo_ptr,QString)));
+ connect(model_,SIGNAL(firstScanEnded(const VTreeServer*)),
+ this,SLOT(firstScanEnded(const VTreeServer*)));
connect(bcWidget_,SIGNAL(selected(VInfo_ptr)),
this,SLOT(slotSelectionChangedInBc(VInfo_ptr)));
- connect(model_,SIGNAL(clearBegun(const VTreeNode*)),
- view_->realWidget(),SLOT(slotSaveExpand(const VTreeNode*)));
-
- connect(model_,SIGNAL(scanEnded(const VTreeNode*)),
- view_->realWidget(),SLOT(slotRestoreExpand(const VTreeNode*)));
-
- connect(model_,SIGNAL(rerender()),
- view_->realWidget(),SLOT(slotRerender()));
-
- connect(model_,SIGNAL(filterChangeBegun()),
- view_->realWidget(),SLOT(slotSaveExpand()));
-
- connect(model_,SIGNAL(filterChangeEnded()),
- view_->realWidget(),SLOT(slotRestoreExpand()));
-
- connect(model_,SIGNAL(filterUpdateRemoveBegun(const VTreeNode*)),
- view_->realWidget(),SLOT(slotSaveExpand(const VTreeNode*)));
-
- connect(model_,SIGNAL(filterUpdateAddEnded(const VTreeNode*)),
- view_->realWidget(),SLOT(slotRestoreExpand(const VTreeNode*)));
-
connect(atts_,SIGNAL(changed()),
this,SLOT(slotAttsChanged()));
//This will not emit the trigered signal of the action!!
//Synchronise the action and the breadcrumbs state
- actionBreadcrumbs->setChecked(bcWidget_->active());
+ actionBreadcrumbs->setChecked(bcWidget_->isGuiMode());
//The node status filter is exposed via a menu. So we need a reference to it.
states_=filterDef_->nodeState();
@@ -107,6 +93,68 @@ TreeNodeWidget::~TreeNodeWidget()
{
}
+void TreeNodeWidget::setViewLayoutMode(TreeNodeWidget::ViewLayoutMode mode)
+{
+ if(view_ && viewLayoutMode_ == mode)
+ return;
+
+ viewLayoutMode_ = mode;
+
+ if(view_)
+ {
+ viewHolder_->layout()->removeWidget(view_->realWidget());
+ delete view_;
+ view_=0;
+ }
+
+ if(viewLayoutMode_ == CompactLayoutMode)
+ {
+ CompactNodeView* gv=new CompactNodeView((TreeNodeModel*)model_,filterDef_,this);
+ viewHolder_->layout()->addWidget(gv);
+ //Store the pointer to the (non-QObject) base class of the view!!!
+ view_=gv;
+ }
+ else
+ {
+ TreeNodeView *tv=new TreeNodeView((TreeNodeModel*)model_,filterDef_,this);
+ viewHolder_->layout()->addWidget(tv);
+ //Store the pointer to the (non-QObject) base class of the view!!!
+ view_=tv;
+ }
+
+ //Signals-slots
+ connect(view_->realWidget(),SIGNAL(selectionChanged(VInfo_ptr)),
+ this,SLOT(slotSelectionChangedInView(VInfo_ptr)));
+
+ connect(view_->realWidget(),SIGNAL(infoPanelCommand(VInfo_ptr,QString)),
+ this,SIGNAL(popInfoPanel(VInfo_ptr,QString)));
+
+ connect(view_->realWidget(),SIGNAL(dashboardCommand(VInfo_ptr,QString)),
+ this,SIGNAL(dashboardCommand(VInfo_ptr,QString)));
+
+ connect(model_,SIGNAL(clearBegun(const VTreeNode*)),
+ view_->realWidget(),SLOT(slotSaveExpand(const VTreeNode*)));
+
+ connect(model_,SIGNAL(scanEnded(const VTreeNode*)),
+ view_->realWidget(),SLOT(slotRestoreExpand(const VTreeNode*)));
+
+ connect(model_,SIGNAL(rerender()),
+ view_->realWidget(),SLOT(slotRerender()));
+
+ connect(model_,SIGNAL(filterChangeBegun()),
+ view_->realWidget(),SLOT(slotSaveExpand()));
+
+ connect(model_,SIGNAL(filterChangeEnded()),
+ view_->realWidget(),SLOT(slotRestoreExpand()));
+
+ connect(model_,SIGNAL(filterUpdateRemoveBegun(const VTreeNode*)),
+ view_->realWidget(),SLOT(slotSaveExpand(const VTreeNode*)));
+
+ connect(model_,SIGNAL(filterUpdateAddEnded(const VTreeNode*)),
+ view_->realWidget(),SLOT(slotRestoreExpand(const VTreeNode*)));
+
+}
+
void TreeNodeWidget::initAtts()
{
if(VProperty *prop=VConfig::instance()->find("view.tree.attributesPolicy"))
@@ -117,7 +165,6 @@ void TreeNodeWidget::initAtts()
}
else if(VProperty *propDef=VConfig::instance()->find("view.tree.defaultAttributes"))
{
- //qDebug() << "atts" << propDef->value().toString() << propDef->value().toString().split("/");
atts_->setCurrent(propDef->value().toString().split("/"));
}
}
@@ -148,9 +195,9 @@ void TreeNodeWidget::populateDockTitleBar(DashboardDockTitleWidget* tw)
//Sets the menu on the toolbutton
tw->optionsTb()->setMenu(menu);
- //Sets the title
- tw->slotUpdateTitle("<b>Tree</b>");
-
+ //Add the bc to the titlebar (bc will have a new parent)
+ tw->setBcWidget(bcWidget_);
+
QList<QAction*> acLst;
QAction* acState=new QAction(this);
@@ -179,14 +226,13 @@ void TreeNodeWidget::slotSelectionChangedInView(VInfo_ptr info)
void TreeNodeWidget::on_actionBreadcrumbs_triggered(bool b)
{
- if(b)
+ if(b)
{
- bcWidget_->active(true);
- bcWidget_->setPath(view_->currentSelection());
+ bcWidget_->setMode(NodePathWidget::GuiMode);
}
else
{
- bcWidget_->active(false);
+ bcWidget_->setMode(NodePathWidget::TextMode);
}
}
@@ -196,10 +242,28 @@ void TreeNodeWidget::rerender()
view_->rerender();
}
-bool TreeNodeWidget::selectFirstServerInView()
+
+bool TreeNodeWidget::initialSelectionInView()
+{
+ //Seeting the initail selection is probably unsuccessful because at
+ //this point the servers are probably not fully loaded
+ VInfo_ptr selInfo=VInfo::createFromPath(firstSelectionPath_);
+ if(selInfo)
+ view_->setCurrentSelection(selInfo);
+ else
+ view_->selectFirstServer();
+
+ return true;
+}
+
+//When the first successful scan ended we try to set the initial selection
+void TreeNodeWidget::firstScanEnded(const VTreeServer* s)
{
- view_->selectFirstServer();
- return true;
+ VInfo_ptr selInfo=VInfo::createFromPath(firstSelectionPath_);
+ if(selInfo && selInfo->server() == s->realServer())
+ {
+ view_->setCurrentSelection(selInfo);
+ }
}
void TreeNodeWidget::slotAttsChanged()
@@ -207,11 +271,32 @@ void TreeNodeWidget::slotAttsChanged()
lastAtts_->setCurrent(atts_->current());
}
+void TreeNodeWidget::notifyChange(VProperty* p)
+{
+ if(p == layoutProp_)
+ {
+ if(layoutProp_->value() == "compact")
+ {
+ setViewLayoutMode(CompactLayoutMode);
+ }
+ else
+ {
+ setViewLayoutMode(StandardLayoutMode);
+ }
+ }
+}
+
void TreeNodeWidget::writeSettings(VSettings* vs)
{
vs->put("type",type_);
vs->put("dockId",id_);
+ VInfo_ptr sel=currentSelection();
+ if(sel)
+ {
+ vs->put("selection",sel->storedPath());
+ }
+
bcWidget_->writeSettings(vs);
states_->writeSettings(vs);
@@ -227,6 +312,9 @@ void TreeNodeWidget::readSettings(VSettings* vs)
if(type != type_)
return;
+ //The selection on last exit. We will use it later when the server is fully loaded.
+ firstSelectionPath_=vs->get<std::string>("selection","");
+
//This will not emit the changed signal. So the "observers" will
//not notice the change.
states_->readSettings(vs);
@@ -249,7 +337,7 @@ void TreeNodeWidget::readSettings(VSettings* vs)
//Synchronise the action and the breadcrumbs state
//This will not emit the trigered signal of the action!!
- actionBreadcrumbs->setChecked(bcWidget_->active());
+ actionBreadcrumbs->setChecked(bcWidget_->isGuiMode());
attrFilterMenu_->reload();
iconFilterMenu_->reload();
diff --git a/Viewer/src/TreeNodeWidget.hpp b/Viewer/src/TreeNodeWidget.hpp
index f7c169f..f2de834 100644
--- a/Viewer/src/TreeNodeWidget.hpp
+++ b/Viewer/src/TreeNodeWidget.hpp
@@ -1,6 +1,6 @@
/***************************** LICENSE START ***********************************
- Copyright 2015 ECMWF and INPE. This software is distributed under the terms
+ Copyright 2009-2017 ECMWF and INPE. This software is distributed under the terms
of the Apache License version 2.0. In applying this license, ECMWF does not
waive the privileges and immunities granted to it by virtue of its status as
an Intergovernmental Organization or submit itself to any jurisdiction.
@@ -13,15 +13,15 @@
#include "ui_TreeNodeWidget.h"
#include "NodeWidget.hpp"
+#include "VProperty.hpp"
class AttributeFilter;
class NodeStateFilter;
class ServerFilter;
class VParamFilterMenu;
class VSettings;
-
-
-class TreeNodeWidget : public NodeWidget, protected Ui::TreeNodeWidget
+class VTreeServer;
+class TreeNodeWidget : public NodeWidget, public VPropertyObserver, protected Ui::TreeNodeWidget
{
Q_OBJECT
@@ -32,24 +32,35 @@ public:
void populateDockTitleBar(DashboardDockTitleWidget* tw);
void rerender();
- bool selectFirstServerInView();
+ bool initialSelectionInView();
void writeSettings(VSettings*);
void readSettings(VSettings*);
+ void notifyChange(VProperty*);
+
protected Q_SLOTS:
void on_actionBreadcrumbs_triggered(bool b);
void slotSelectionChangedInView(VInfo_ptr info);
void slotAttsChanged();
+ void firstScanEnded(const VTreeServer*);
protected:
- void initAtts();
+ enum ViewLayoutMode {StandardLayoutMode,CompactLayoutMode};
+
+ void initAtts();
void detachedChanged() {}
+ void setViewLayoutMode(ViewLayoutMode);
VParamFilterMenu *stateFilterMenu_;
VParamFilterMenu *attrFilterMenu_;
VParamFilterMenu *iconFilterMenu_;
+ ViewLayoutMode viewLayoutMode_;
+ VProperty* layoutProp_;
+
static AttributeFilter* lastAtts_;
+
+ std::string firstSelectionPath_;
};
#endif
diff --git a/Viewer/src/TreeNodeWidget.ui b/Viewer/src/TreeNodeWidget.ui
index 45240f0..686f935 100644
--- a/Viewer/src/TreeNodeWidget.ui
+++ b/Viewer/src/TreeNodeWidget.ui
@@ -13,16 +13,22 @@
<property name="windowTitle">
<string>Form</string>
</property>
- <layout class="QVBoxLayout" name="verticalLayout" stretch="0,1">
+ <layout class="QVBoxLayout" name="verticalLayout" stretch="1">
<property name="spacing">
<number>0</number>
</property>
- <property name="margin">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
<number>0</number>
</property>
- <item>
- <widget class="NodePathWidget" name="bcWidget_" native="true"/>
- </item>
<item>
<widget class="QWidget" name="viewHolder_" native="true">
<property name="sizePolicy">
@@ -57,16 +63,6 @@
</property>
</action>
</widget>
- <customwidgets>
- <customwidget>
- <class>NodePathWidget</class>
- <extends>QWidget</extends>
- <header>NodePathWidget.hpp</header>
- <container>1</container>
- </customwidget>
- </customwidgets>
- <resources>
- <include location="viewer.qrc"/>
- </resources>
+ <resources/>
<connections/>
</ui>
diff --git a/Viewer/src/TreeView.cpp b/Viewer/src/TreeView.cpp
index 1ce1863..aed40c7 100644
--- a/Viewer/src/TreeView.cpp
+++ b/Viewer/src/TreeView.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TreeView.hpp b/Viewer/src/TreeView.hpp
index 0538eed..e1a25c2 100644
--- a/Viewer/src/TreeView.hpp
+++ b/Viewer/src/TreeView.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TriggerBrowser.cpp b/Viewer/src/TriggerBrowser.cpp
index b0d6fe4..c5df50d 100644
--- a/Viewer/src/TriggerBrowser.cpp
+++ b/Viewer/src/TriggerBrowser.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TriggerBrowser.hpp b/Viewer/src/TriggerBrowser.hpp
index 9bf166c..13bad0a 100644
--- a/Viewer/src/TriggerBrowser.hpp
+++ b/Viewer/src/TriggerBrowser.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TriggerCollector.cpp b/Viewer/src/TriggerCollector.cpp
index 8c62ee3..4a58a72 100644
--- a/Viewer/src/TriggerCollector.cpp
+++ b/Viewer/src/TriggerCollector.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -21,7 +21,7 @@ TriggerListCollector::~TriggerListCollector()
clear();
}
-bool TriggerListCollector::add(VItemTmp_ptr t, VItemTmp_ptr dep,Mode mode)
+bool TriggerListCollector::add(VItem* t, VItem* dep,Mode mode)
{
TriggerListItem *item=new TriggerListItem(t,dep,mode) ;
items_.push_back(item);
@@ -44,17 +44,17 @@ void TriggerListCollector::setDependency(bool b)
void TriggerListCollector::clear()
{
- for(size_t i=0; i < items_.size(); i++)
+ /*for(size_t i=0; i < items_.size(); i++)
{
delete items_[i];
- }
+ }*/
items_.clear();
}
-bool TriggerChildCollector::add(VItemTmp_ptr t, VItemTmp_ptr,Mode)
+bool TriggerChildCollector::add(VItem* t, VItem*,Mode)
{
- if(!t->item()->isAncestor(node_->item()))
+ if(!t->isAncestor(node_))
{
// child is a kid of n whose trigger_panel is outside its subtree
return collector_->add(t,child_,TriggerCollector::Child);
@@ -62,16 +62,16 @@ bool TriggerChildCollector::add(VItemTmp_ptr t, VItemTmp_ptr,Mode)
return false;
}
-bool TriggerParentCollector::add(VItemTmp_ptr t, VItemTmp_ptr,Mode)
+bool TriggerParentCollector::add(VItem* t, VItem*,Mode)
{
return collector_->add(t,parent_,TriggerCollector::Parent);
}
-bool TriggeredCollector::add(VItemTmp_ptr trigger, VItemTmp_ptr,Mode)
+bool TriggeredCollector::add(VItem* trigger, VItem*,Mode)
{
- if(VNode *n=trigger->item()->isNode())
+ if(VNode *n=trigger->isNode())
{
- n->addTriggeredData(node_->item());
+ n->addTriggeredData(node_);
}
return false;
diff --git a/Viewer/src/TriggerCollector.hpp b/Viewer/src/TriggerCollector.hpp
index 1ce8af9..2a1ea5a 100644
--- a/Viewer/src/TriggerCollector.hpp
+++ b/Viewer/src/TriggerCollector.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -16,8 +16,8 @@
#include <stdio.h>
class TriggerListItem;
+class VItem;
-#include "VItemTmp.hpp"
#include "VNode.hpp"
class TriggerCollector
@@ -32,7 +32,7 @@ public:
Hierarchy = 3 // Through child
};
- virtual bool add(VItemTmp_ptr, VItemTmp_ptr,Mode) = 0;
+ virtual bool add(VItem*, VItem*,Mode) = 0;
virtual bool scanParents() { return false; }
virtual bool scanKids() { return false; }
virtual bool scanSelf() { return true; }
@@ -49,7 +49,7 @@ public:
extended_(extended) {}
~TriggerListCollector();
- bool add(VItemTmp_ptr, VItemTmp_ptr,Mode);
+ bool add(VItem*, VItem*,Mode);
bool scanParents() { return extended_; }
bool scanKids() { return extended_; }
void setDependency(bool);
@@ -66,13 +66,13 @@ class TriggerChildCollector : public TriggerCollector
{
public:
TriggerChildCollector(VItem *n,VItem* child,TriggerCollector* collector) :
- node_(VItemTmp::create(n)), child_(VItemTmp::create(child)), collector_(collector) {}
+ node_(n), child_(child), collector_(collector) {}
- bool add(VItemTmp_ptr, VItemTmp_ptr,Mode);
+ bool add(VItem*, VItem*,Mode);
private:
- VItemTmp_ptr node_;
- VItemTmp_ptr child_;
+ VItem* node_;
+ VItem* child_;
TriggerCollector* collector_;
};
@@ -80,12 +80,12 @@ class TriggerParentCollector : public TriggerCollector
{
public:
TriggerParentCollector(VItem* parent,TriggerCollector* collector) :
- parent_(VItemTmp::create(parent)), collector_(collector) {}
+ parent_(parent), collector_(collector) {}
- bool add(VItemTmp_ptr, VItemTmp_ptr,Mode);
+ bool add(VItem*, VItem*,Mode);
private:
- VItemTmp_ptr parent_;
+ VItem* parent_;
TriggerCollector* collector_;
};
@@ -93,26 +93,26 @@ class TriggeredCollector : public TriggerListCollector
{
public:
TriggeredCollector(VNode* n) :
- TriggerListCollector(false), node_(VItemTmp::create(n)) {}
- bool add(VItemTmp_ptr, VItemTmp_ptr,Mode);
+ TriggerListCollector(false), node_(n) {}
+ bool add(VItem*, VItem*,Mode);
private:
- VItemTmp_ptr node_;
+ VItem* node_;
};
class TriggerListItem
{
public:
- TriggerListItem(VItemTmp_ptr t,VItemTmp_ptr dep,TriggerCollector::Mode mode) :
+ TriggerListItem(VItem* t,VItem* dep,TriggerCollector::Mode mode) :
t_(t), dep_(dep), mode_(mode) {}
- VItem* item() const {return (t_)?t_->item():NULL;}
- VItem* dep() const {return (dep_)?dep_->item():NULL;}
+ VItem* item() const {return t_;}
+ VItem* dep() const {return dep_;}
TriggerCollector::Mode mode() const {return mode_;}
protected:
- VItemTmp_ptr t_; //trigger or triggered
- VItemTmp_ptr dep_;
+ VItem* t_; //trigger or triggered
+ VItem* dep_;
TriggerCollector::Mode mode_;
};
diff --git a/Viewer/src/TriggerEditor.cpp b/Viewer/src/TriggerEditor.cpp
index 9aebe5c..d3ba6bc 100644
--- a/Viewer/src/TriggerEditor.cpp
+++ b/Viewer/src/TriggerEditor.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TriggerEditor.hpp b/Viewer/src/TriggerEditor.hpp
index a573605..d2fc03d 100644
--- a/Viewer/src/TriggerEditor.hpp
+++ b/Viewer/src/TriggerEditor.hpp
@@ -2,7 +2,7 @@
#define TRIGGEREDITOR_HPP
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TriggerItemWidget.cpp b/Viewer/src/TriggerItemWidget.cpp
index a55d219..dc67cf4 100644
--- a/Viewer/src/TriggerItemWidget.cpp
+++ b/Viewer/src/TriggerItemWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TriggerItemWidget.hpp b/Viewer/src/TriggerItemWidget.hpp
index b79ca76..2327f04 100644
--- a/Viewer/src/TriggerItemWidget.hpp
+++ b/Viewer/src/TriggerItemWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TriggerProvider.cpp b/Viewer/src/TriggerProvider.cpp
index 68464d3..20c1ca0 100644
--- a/Viewer/src/TriggerProvider.cpp
+++ b/Viewer/src/TriggerProvider.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -10,7 +10,6 @@
#include "TriggerProvider.hpp"
-#include "LogServer.hpp"
#include "OutputDirClient.hpp"
#include "VNode.hpp"
#include "VReply.hpp"
diff --git a/Viewer/src/TriggerProvider.hpp b/Viewer/src/TriggerProvider.hpp
index d202237..1fdf4cd 100644
--- a/Viewer/src/TriggerProvider.hpp
+++ b/Viewer/src/TriggerProvider.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TriggerTextWidget.cpp b/Viewer/src/TriggerTextWidget.cpp
index 4bfb544..5425521 100644
--- a/Viewer/src/TriggerTextWidget.cpp
+++ b/Viewer/src/TriggerTextWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TriggerTextWidget.hpp b/Viewer/src/TriggerTextWidget.hpp
index aa292cd..11fb926 100644
--- a/Viewer/src/TriggerTextWidget.hpp
+++ b/Viewer/src/TriggerTextWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TriggerView.cpp b/Viewer/src/TriggerView.cpp
index 648302d..0400eb6 100644
--- a/Viewer/src/TriggerView.cpp
+++ b/Viewer/src/TriggerView.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TriggerView.hpp b/Viewer/src/TriggerView.hpp
index f54f0ed..ae6819c 100644
--- a/Viewer/src/TriggerView.hpp
+++ b/Viewer/src/TriggerView.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TriggeredScanner.cpp b/Viewer/src/TriggeredScanner.cpp
index ff481e1..60ff4b5 100644
--- a/Viewer/src/TriggeredScanner.cpp
+++ b/Viewer/src/TriggeredScanner.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/TriggeredScanner.hpp b/Viewer/src/TriggeredScanner.hpp
index 8a5a7d3..9688248 100644
--- a/Viewer/src/TriggeredScanner.hpp
+++ b/Viewer/src/TriggeredScanner.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/UIDebug.cpp b/Viewer/src/UIDebug.cpp
index 1e85cea..ba9f0b6 100644
--- a/Viewer/src/UIDebug.cpp
+++ b/Viewer/src/UIDebug.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/UIDebug.hpp b/Viewer/src/UIDebug.hpp
index c626d7a..1af0a9b 100644
--- a/Viewer/src/UIDebug.hpp
+++ b/Viewer/src/UIDebug.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/UiLog.cpp b/Viewer/src/UiLog.cpp
index 2c5e283..c244f69 100644
--- a/Viewer/src/UiLog.cpp
+++ b/Viewer/src/UiLog.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -14,6 +14,8 @@
#include <QDebug>
#include <QModelIndex>
+#include <QRegion>
+#include <QRect>
#include <QString>
#include <QStringList>
#include <QVariant>
@@ -134,3 +136,30 @@ std::ostream& operator <<(std::ostream &stream,const QStringList &lst)
stream << s.toStdString();
return stream;
}
+
+std::ostream& operator <<(std::ostream &stream,const QRegion &r)
+{
+ QString s;
+ QDebug ts(&s);
+ ts << r;
+ stream << s.toStdString();
+ return stream;
+}
+
+std::ostream& operator <<(std::ostream &stream,const QRect &r)
+{
+ QString s;
+ QDebug ts(&s);
+ ts << r;
+ stream << s.toStdString();
+ return stream;
+}
+
+std::ostream& operator <<(std::ostream &stream,const QPoint &p)
+{
+ QString s;
+ QDebug ts(&s);
+ ts << p;
+ stream << s.toStdString();
+ return stream;
+}
diff --git a/Viewer/src/UiLog.hpp b/Viewer/src/UiLog.hpp
index da604ca..12adc3a 100644
--- a/Viewer/src/UiLog.hpp
+++ b/Viewer/src/UiLog.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -17,6 +17,9 @@ class QString;
class QModelIndex;
class QStringList;
class QVariant;
+class QPoint;
+class QRegion;
+class QRect;
class ServerHandler;
@@ -37,6 +40,13 @@ public:
static void enableTruncation();
+ static std::string toString(int i) {
+ std::stringstream ss;
+ ss << i;
+ return ss.str();
+ }
+
+
protected:
void output(const std::string& msg);
void appendType(std::string& s,Type t) const;
@@ -55,6 +65,9 @@ std::ostream& operator <<(std::ostream&,const QString &);
std::ostream& operator <<(std::ostream&,const QModelIndex&);
std::ostream& operator <<(std::ostream&,const QVariant&);
std::ostream& operator <<(std::ostream&,const QStringList&);
+std::ostream& operator <<(std::ostream&,const QRegion&);
+std::ostream& operator <<(std::ostream&,const QRect&);
+std::ostream& operator <<(std::ostream&,const QPoint&);
#endif // UILOG_HPP
diff --git a/Viewer/src/UpdateTimer.cpp b/Viewer/src/UpdateTimer.cpp
index d905281..e954310 100644
--- a/Viewer/src/UpdateTimer.cpp
+++ b/Viewer/src/UpdateTimer.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/UpdateTimer.hpp b/Viewer/src/UpdateTimer.hpp
index f5dab33..6e10c61 100644
--- a/Viewer/src/UpdateTimer.hpp
+++ b/Viewer/src/UpdateTimer.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/UserMessage.cpp b/Viewer/src/UserMessage.cpp
index c04528d..0cc8935 100644
--- a/Viewer/src/UserMessage.cpp
+++ b/Viewer/src/UserMessage.cpp
@@ -1,6 +1,6 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -24,7 +24,6 @@ UserMessage::UserMessage()
void UserMessage::message(MessageType type, bool popup, const std::string& message)
{
-
if (echoToCout_)
{
#if 0
@@ -53,15 +52,16 @@ void UserMessage::message(MessageType type, bool popup, const std::string& messa
if (popup)
{
QMessageBox::Icon icon;
+ QString title;
switch (type)
{
- case INFO: icon = QMessageBox::Information; break;
- case WARN: icon = QMessageBox::Warning; break;
- case ERROR: icon = QMessageBox::Critical; break;
- case DBG: icon = QMessageBox::NoIcon; break;
- default: icon = QMessageBox::NoIcon; break;
+ case INFO: icon = QMessageBox::Information; title="Info"; break;
+ case WARN: icon = QMessageBox::Warning; title="Warning"; break;
+ case ERROR: icon = QMessageBox::Critical; title="Error"; break;
+ case DBG: icon = QMessageBox::NoIcon; title="Debug"; break;
+ default: icon = QMessageBox::NoIcon; title="Info"; break;
}
- QString title("EcFlowUI");
+ title="ecFlowUI - " + title;
QString qmsg = QString::fromStdString(message);
QMessageBox box(icon, title, qmsg);
diff --git a/Viewer/src/UserMessage.hpp b/Viewer/src/UserMessage.hpp
index 56cb0d7..8a4ec19 100644
--- a/Viewer/src/UserMessage.hpp
+++ b/Viewer/src/UserMessage.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VAttribute.cpp b/Viewer/src/VAttribute.cpp
index 43290f3..deb394c 100644
--- a/Viewer/src/VAttribute.cpp
+++ b/Viewer/src/VAttribute.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -8,7 +8,6 @@
//
//============================================================================
-
#include "VAttribute.hpp"
#include "VAttributeType.hpp"
@@ -19,37 +18,15 @@
//#define _UI_VATTRIBUTE_DEBUG
-static unsigned int totalAttrNum=0;
-
-VAttribute::VAttribute(VNode *parent,VAttributeType* type,int indexInType) :
- VItem(parent)
-{
- UI_ASSERT(indexInType >=0, "Index = " << UIDebug::longToString(indexInType));
- assert(type);
- id_=indexToId(type,indexInType);
- totalAttrNum++;
-}
-VAttribute::VAttribute(VNode *parent,int id) :
+VAttribute::VAttribute(VNode *parent,int index) :
VItem(parent),
- id_(id)
+ index_(index)
{
- totalAttrNum++;
}
VAttribute::~VAttribute()
{
- totalAttrNum--;
-}
-
-VAttribute* VAttribute::clone() const
-{
- return new VAttribute(parent_,id_);
-}
-
-unsigned int VAttribute::totalNum()
-{
- return totalAttrNum;
}
VServer* VAttribute::root() const
@@ -63,18 +40,20 @@ QString VAttribute::toolTip() const
return (t)?(t->toolTip(data())):QString();
}
-VAttributeType* VAttribute::type() const
-{
- return idToType(id_);
-}
-
const std::string& VAttribute::typeName() const
{
VAttributeType* t=type();
+ assert(t);
static std::string e;
return (t)?(t->strName()):e;
}
+const std::string& VAttribute::subType() const
+{
+ static std::string e;
+ return e;
+}
+
std::string VAttribute::fullPath() const
{
return (parent_)?(parent_->fullPath() + ":" + strName()):"";
@@ -86,25 +65,52 @@ bool VAttribute::sameContents(VItem* item) const
return false;
if(VAttribute *a=item->isAttribute())
- { return a->parent() == parent() && a->id_ == id_;
+ { return a->parent() == parent() &&
+ a->type() == type() &&
+ name() == name();
}
return false;
}
-QStringList VAttribute::data() const
+QString VAttribute::name() const
+{
+ return QString::fromStdString(strName());
+}
+
+std::string VAttribute::strName() const
{
- QStringList d;
- if(id_ ==-1) return d;
- VAttributeType *t=idToType(id_);
- assert(t);
- int idx=idToTypeIndex(id_);
- t->itemData(parent(),idx,d);
- return d;
+ static std::string eStr;
+ return eStr;
+}
+
+bool VAttribute::value(const std::string& key,std::string& val) const
+{
+ int idx=type()->searchKeyToDataIndex(key);
+ if(idx != -1)
+ {
+ QStringList d=data();
+ val=d[idx].toStdString();
+ return true;
+ }
+ return false;
}
-int VAttribute::absIndex(AttributeFilter *filter) const
+bool VAttribute::sameAs(QStringList d) const
{
- return VAttributeType::absIndexOf(this,filter);
+ if(d.count() >=2)
+ {
+ VAttributeType* t=type();
+
+ if(t->name() == d[0])
+ {
+ int idx=t->searchKeyToDataIndex("name");
+ if(idx != -1 && idx < d.count())
+ {
+ return name() == d[idx];
+ }
+ }
+ }
+ return false;
}
void VAttribute::buildAlterCommand(std::vector<std::string>& cmd,
@@ -123,7 +129,6 @@ void VAttribute::buildAlterCommand(std::vector<std::string>& cmd,
}
cmd.push_back("<full_name>");
-
}
void VAttribute::buildAlterCommand(std::vector<std::string>& cmd,
@@ -139,113 +144,3 @@ void VAttribute::buildAlterCommand(std::vector<std::string>& cmd,
cmd.push_back("<full_name>");
}
-QString VAttribute::name() const
-{
- std::string s;
- value("name",s);
- return QString::fromStdString(s);
-
-#if 0
- QStringList d=data();
- if(d.count() >= 2)
- return d[1];
-
- return QString();
-#endif
-}
-
-std::string VAttribute::strName() const
-{
- return name().toStdString();
-}
-
-bool VAttribute::isValid(VNode* parent,QStringList data)
-{
- if(VAttributeType* t=type())
- {
- return t->exists(parent,data);
- }
- return false;
-}
-
-bool VAttribute::value(const std::string& key,std::string& val) const
-{
- QStringList d=data();
- VAttributeType* t=type();
- if(d.isEmpty() || !t)
- return false;
-
- int idx=t->searchKeyToDataIndex(key);
-
-#ifdef _UI_VATTRIBUTE_DEBUG
- qDebug() << QString::fromStdString(key) << QString::fromStdString(val);
- qDebug() << " data=" << d;
- qDebug() << " idx=" << idx;
-#endif
-
- if(idx != -1)
- {
- val=d[idx].toStdString();
- return true;
- }
- return false;
-}
-
-VAttribute* VAttribute::make(VNode* n,const std::string& type,const std::string& name)
-{
- if(!n) return NULL;
- VAttributeType *t=VAttributeType::find(type);
- assert(t);
- VItemTmp_ptr item=t->item(n,name);
- return (item)?item->attribute()->clone():NULL;
-}
-
-VAttribute* VAttribute::makeFromId(VNode* n,int id)
-{
- if(id ==-1) return NULL;
- VAttributeType *t=idToType(id);
- assert(t);
- QStringList d;
- int idx=idToTypeIndex(id);
- return NULL;
- //return t->getSearchData(n,idx,d);
-}
-
-VAttribute* VAttribute::make(VNode *parent,QStringList data)
-{
- assert(parent);
- if(data.count() >=2)
- {
- std::string type=data[0].toStdString();
- VAttributeType *t=VAttributeType::find(type);
- assert(t);
-
- int idx=t->searchKeyToDataIndex("name");
- if(idx != -1 && idx < data.count())
- {
- std::string name=data[idx].toStdString();
- VItemTmp_ptr item=t->item(parent,name);
- return (item)?item->attribute()->clone():NULL;
- }
- }
- return 0;
-}
-
-int VAttribute::indexToId(VAttributeType* t,int idx)
-{
- return (idx >=0)?(t->id()*10000+idx):-1;
-}
-
-VAttributeType* VAttribute::idToType(int id)
-{
- if(id < 0) return NULL;
- return VAttributeType::find(id/10000);
-}
-
-int VAttribute::idToTypeIndex(int id)
-{
- if(id < 0) return -1;
- return id-(id/10000)*10000;
-}
-
-
diff --git a/Viewer/src/VAttribute.hpp b/Viewer/src/VAttribute.hpp
index 994b2b3..5981704 100644
--- a/Viewer/src/VAttribute.hpp
+++ b/Viewer/src/VAttribute.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -17,42 +17,32 @@
#include <string>
#include <vector>
-#include <boost/shared_ptr.hpp>
-
class AttributeFilter;
class VAttributeType;
class VNode;
-
class VAttribute;
-typedef boost::shared_ptr<VAttribute> VAttribute_ptr;
class VAttribute : public VItem
{
public:
- VAttribute(VNode *parent,VAttributeType* type,int indexInType);
+ VAttribute(VNode *parent,int index);
~VAttribute();
- VAttribute* clone() const;
+ virtual VAttributeType* type() const=0;
+ virtual const std::string& subType() const;
+ virtual int lineNum() const {return 1;}
VServer* root() const;
VAttribute* isAttribute() const {return const_cast<VAttribute*>(this);}
- VAttributeType* type() const;
- QStringList data() const;
QString toolTip() const;
QString name() const;
std::string strName() const;
const std::string& typeName() const;
std::string fullPath() const;
+ virtual QStringList data() const=0;
+ bool sameAs(QStringList d) const;
bool sameContents(VItem*) const;
- int id() const {return id_;}
- int absIndex(AttributeFilter *filter) const;
-
- bool isValid(VNode* parent,QStringList);
bool value(const std::string& key,std::string& val) const;
- static VAttribute* make(VNode* n,const std::string& type,const std::string& name);
- static VAttribute* makeFromId(VNode*,int);
- static VAttribute* make(VNode *parent,QStringList data);
-
static void buildAlterCommand(std::vector<std::string>& cmd,
const std::string& action, const std::string& type,
const std::string& name,const std::string& value);
@@ -61,16 +51,10 @@ public:
const std::string& action, const std::string& type,
const std::string& value);
- static unsigned int totalNum();
protected:
- VAttribute(VNode *parent,int id);
-
- static int indexToId(VAttributeType* t,int idx);
- static VAttributeType* idToType(int id);
- static int idToTypeIndex(int id);
- int id_;
+ int index_;
};
#endif // VATTRIBUTE_HPP
diff --git a/Viewer/src/VAttributeType.cpp b/Viewer/src/VAttributeType.cpp
index 2ee6d62..b3447bd 100644
--- a/Viewer/src/VAttributeType.cpp
+++ b/Viewer/src/VAttributeType.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -24,9 +24,9 @@
#include "VConfigLoader.hpp"
#include "VProperty.hpp"
#include "VFilter.hpp"
-#include "VRepeat.hpp"
#include "VAttribute.hpp"
#include "UiLog.hpp"
+#include "UserMessage.hpp"
#include "UIDebug.hpp"
std::map<std::string,VAttributeType*> VAttributeType::typesMap_;
@@ -37,9 +37,8 @@ std::vector<VAttributeType*> VAttributeType::types_;
VAttributeType::VAttributeType(const std::string& name) :
VParam(name),
dataCount_(0),
- id_(types_.size())
+ typeId_(types_.size())
{
- //items_.push_back(this);
typesMap_[name]=this;
types_.push_back(this);
}
@@ -47,10 +46,8 @@ VAttributeType::VAttributeType(const std::string& name) :
std::vector<VParam*> VAttributeType::filterItems()
{
std::vector<VParam*> v;
- for(std::map<std::string,VAttributeType*>::const_iterator it=typesMap_.begin(); it != typesMap_.end(); ++it)
- {
- v.push_back(it->second);
- }
+ for(TypeIterator it=types_.begin(); it != types_.end(); ++it)
+ v.push_back(*it);
return v;
}
@@ -59,17 +56,9 @@ VAttributeType* VAttributeType::find(const std::string& name)
{
std::map<std::string,VAttributeType*>::const_iterator it=typesMap_.find(name);
if(it != typesMap_.end())
- return it->second;
+ return it->second;
return 0;
-
- /* for(std::vector<VAttribute*>::const_iterator it=items_.begin(); it != items_.end(); it++)
- {
- if((*it)->stdName() == name)
- return *it;
- }
-
- return NULL;*/
}
VAttributeType* VAttributeType::find(int id)
@@ -78,257 +67,11 @@ VAttributeType* VAttributeType::find(int id)
return types_[id];
}
-int VAttributeType::totalNum(const VNode *vnode, AttributeFilter *filter)
-{
- if(!vnode)
- return 0;
-
- int total=0;
- for(std::map<std::string,VAttributeType*>::const_iterator it=typesMap_.begin(); it != typesMap_.end(); ++it)
- {
- if(!filter || filter->isSet(it->second) )
- {
- total+=it->second->num(vnode);
- }
- //If the filter contains a forceShow item
- else if(filter->matchForceShowAttr(vnode,it->second))
- {
- total+=1;
- }
- }
-
- return total;
-}
-
-VAttributeType* VAttributeType::getType(const VNode *vnode,int absRowInFilter,AttributeFilter *filter)
-{
- if(!vnode)
- return NULL;
-
- int totalRow=0;
- for(std::map<std::string,VAttributeType*>::const_iterator it=typesMap_.begin(); it != typesMap_.end(); ++it)
- {
- if(!filter || filter->isSet(it->second))
- {
- int size=it->second->num(vnode);
- if(absRowInFilter-totalRow >=0 && absRowInFilter-totalRow < size)
- {
- return it->second;
- }
- totalRow+=size;
- }
- else if(filter && filter->matchForceShowAttr(vnode,it->second))
- {
- int size=1;
- if(absRowInFilter-totalRow >=0 && absRowInFilter-totalRow < size)
- {
- return it->second;
- }
- totalRow+=size;
- }
- }
-
- return NULL;
-}
-
-bool VAttributeType::getData(VNode *vnode,int absRowInFilter,VAttributeType* &type,QStringList& data,AttributeFilter *filter)
-{
- type=0;
-
- if(!vnode)
- return false;
-
- int totalRow=0;
- for(std::map<std::string,VAttributeType*>::const_iterator it=typesMap_.begin(); it != typesMap_.end(); ++it)
- {
- if(!filter || filter->isSet(it->second))
- {
- int size=0;
- if(it->second->getData(vnode,absRowInFilter-totalRow,size,data))
- {
- type=it->second;
- return true;
- }
- totalRow+=size;
- }
- else if(filter && filter->matchForceShowAttr(vnode,it->second))
- {
- if(absRowInFilter == totalRow)
- {
- VAttribute* a=filter->forceShowAttr();
- Q_ASSERT(a);
- data=a->data();
- type=it->second;
- return true;
- }
- totalRow+=1;
- }
- }
-
- return false;
-}
-
-bool VAttributeType::getData(const std::string& type,VNode* vnode,int rowInType,QStringList& data)
-{
- if(VAttributeType* va=find(type))
- {
- int size=0;
- return va->getData(vnode,rowInType,size,data);
- }
- return false;
-}
-
-int VAttributeType::getLineNum(const VNode *vnode,int absRowInFilter,AttributeFilter *filter)
-{
- if(!vnode)
- return 1;
-
- int totalRow=0;
- for(std::map<std::string,VAttributeType*>::const_iterator it=typesMap_.begin(); it != typesMap_.end(); ++it)
- {
- if(!filter || filter->isSet(it->second))
- {
- int size=it->second->num(vnode);
- if(absRowInFilter-totalRow >=0 && absRowInFilter-totalRow < size)
- {
- return it->second->lineNum(vnode,absRowInFilter-totalRow);
- }
- totalRow+=size;
- }
- }
-
- //TODO:: add forceShowAttr
-
- return 1;
-}
-
-#if 0
-int VAttributeType::getRow(const VNode *vnode,int row,AttributeFilter *filter)
-{
- if(!vnode)
- return -1;
-
- if(!filter)
- return row;
-
- int totalRow=0;
- int realRow=0;
- for(std::map<std::string,VAttributeType*>::const_iterator it=typesMap_.begin(); it != typesMap_.end(); ++it)
- {
- if(!filter || filter->isSet(it->second))
- {
- int size=it->second->num(vnode);
- if(row-totalRow >=0 && row-totalRow < size)
- {
- return realRow+row-totalRow;
- }
- totalRow+=size;
- realRow+=size;
- }
- else
- {
- realRow+=it->second->num(vnode);
- }
- }
-
- return -1;
-}
-#endif
-
-VItemTmp_ptr VAttributeType::itemForAbsIndex(const VNode *vnode,int absIndex,AttributeFilter *filter) //,VAttributeType* &type,int& indexInType)
-{
- if(!vnode)
- return VItemTmp_ptr();
-
- int totalNum=0;
- for(std::map<std::string,VAttributeType*>::const_iterator it=typesMap_.begin(); it != typesMap_.end(); ++it)
- {
- if(!filter || filter->isSet(it->second))
- {
- int size=it->second->num(vnode);
- if(absIndex-totalNum >=0 && absIndex-totalNum < size)
- {
- int indexInType=absIndex-totalNum;
- return VItemTmp::create(new VAttribute(const_cast<VNode*>(vnode),it->second,indexInType));
- }
- totalNum+=size;
- }
- else if(filter && filter->matchForceShowAttr(vnode,it->second))
- {
- int size=1;
- if(absIndex-totalNum >=0 && absIndex-totalNum < size)
- {
- VAttribute* a=filter->forceShowAttr();
- Q_ASSERT(a);
- return VItemTmp::create(a->clone());
- }
- totalNum+=size;
- }
- }
-
- return VItemTmp_ptr();
-}
-
-//Returns the absolute index of the given attribute within the whole list of attributes of a given node.
-int VAttributeType::absIndexOf(const VAttribute* a,AttributeFilter *filter)
-{
- if(!a)
- return -1;
-
- VNode* vnode=a->parent();
- if(!vnode)
- return -1;
-
- if(filter && !filter->isSet(a->type()) &&
- a->sameContents(filter->forceShowAttr()) == false)
- return -1;
-
- int absIndex=-1;
- for(std::map<std::string,VAttributeType*>::const_iterator it=typesMap_.begin(); it != typesMap_.end(); ++it)
- {
- if(a->type() == it->second)
- {
- int idx=-1;
- if(filter && a->sameContents(filter->forceShowAttr()))
- idx=0;
- else
- idx=it->second->indexOf(a);
-
- return (idx != -1)?(absIndex+idx+1):-1;
- }
-
- if(!filter || filter->isSet(it->second))
- {
- int size=it->second->num(vnode);
- if(size > 0)
- absIndex+=size;
- }
- else if(filter->matchForceShowAttr(vnode,it->second))
- {
- absIndex+=1;
- }
- }
-
- return -1;
-}
-
-//Returns the index of the given attribute within the given type
-int VAttributeType::indexOf(const VAttribute* a)
-{
- if(a && a->parent())
- return indexOf(a->parent(),a->data());
-
- return -1;
-}
-
-void VAttributeType::load(VProperty* group)
+void VAttributeType::scan(VNode* vnode,std::vector<VAttribute*>& v)
{
- Q_FOREACH(VProperty* p,group->children())
+ for(TypeIterator it=types_.begin(); it != types_.end(); ++it)
{
- if(VAttributeType* obj=VAttributeType::find(p->strName()))
- {
- obj->setProperty(p);
- }
+ (*it)->scanProc()(vnode,v);
}
}
@@ -360,1912 +103,42 @@ QStringList VAttributeType::searchKeys() const
return lst;
}
-void VAttributeType::items(const VNode* vnode,QList<VItemTmp_ptr>& lst)
-{
- int cnt=num(vnode);
- for(int i=0; i < cnt; i++)
- lst << VItemTmp::create(new VAttribute(const_cast<VNode*>(vnode),this,i));
-}
-
-void VAttributeType::items(const std::string& type,const VNode* vnode,QList<VItemTmp_ptr>& lst)
-{
- VAttributeType *t=VAttributeType::find(type);
- Q_ASSERT(t);
- t->items(vnode,lst);
-}
-
-VItemTmp_ptr VAttributeType::item(const VNode* vnode,const std::string& name)
-{
- std::vector<std::string> nameVec;
- itemNames(vnode,nameVec);
- for(size_t i=0; i < nameVec.size(); i++)
- if(nameVec[i] == name)
- return VItemTmp::create(new VAttribute(const_cast<VNode*>(vnode),this,i));
-
- return VItemTmp_ptr();
-}
-
-//================================
-// Meters
-//================================
-
-class VMeterAttribute : public VAttributeType
-{
-public:
- explicit VMeterAttribute(const std::string& n);
- int num(const VNode *node);
- bool getData(VNode *node,int row,int& size,QStringList& data);
- QString toolTip(QStringList d) const;
- int indexOf(const VNode* vnode,QStringList) const;
- bool itemData(const VNode*,int index,QStringList&);
-
-private:
- enum DataIndex {TypeIndex=0,NameIndex=1,ValueIndex=2,MinIndex=3, MaxIndex=4,ThresholdIndex=5};
- void itemNames(const VNode* vnode,std::vector<std::string>& nameVec);
- void getData(const Meter& m,QStringList& data) const;
-};
-
-VMeterAttribute::VMeterAttribute(const std::string& n) :
- VAttributeType(n)
-{
- dataCount_=6;
- searchKeyToData_["meter_name"]=NameIndex;
- searchKeyToData_["meter_value"]=ValueIndex;
- searchKeyToData_["name"]=NameIndex;
-}
-
-int VMeterAttribute::num(const VNode *vnode)
-{
- if(vnode->isServer())
- return 0;
-
- node_ptr node=vnode->node();
- return (node.get())?static_cast<int>(node->meters().size()):0;
-}
-
-bool VMeterAttribute::getData(VNode *vnode,int row,int& size,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node.get())
- return false;
-
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << "VMeterAttribute::getData -->";
-#endif
- const std::vector<Meter>& v=node->meters();
- if(row >=0 && row < v.size())
- {
- getData(v[row],data);
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " data=" << data.join(",");
-#endif
- return true;
- }
-
- size=v.size();
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " size=" << size;
-#endif
- return false;
-}
-
-QString VMeterAttribute::toolTip(QStringList d) const
-{
- QString t="<b>Type:</b> Meter<br>";
- if(d.count() == dataCount_)
- {
- t+="<b>Name:</b> " + d[NameIndex] + "<br>";
- t+="<b>Value:</b> " + d[ValueIndex]+ "<br>";
- t+="<b>Minimum:</b> " + d[MinIndex] + "<br>";
- t+="<b>Maximum:</b> " + d[MaxIndex];
- }
- return t;
-}
-
-int VMeterAttribute::indexOf(const VNode* vnode,QStringList data) const
-{
- if(vnode->isServer())
- return -1;
-
- node_ptr node=vnode->node();
- if(!node)
- return -1;
-
- if(data.count() != dataCount_ && data[TypeIndex] != qName_)
- return -1;
-
- const std::vector<Meter>& v=node->meters();
- for(size_t i=0; i < v.size(); i++)
- {
- if(v[i].name() == data[NameIndex].toStdString())
- return i;
- }
-
- return -1;
-}
-
-void VMeterAttribute::itemNames(const VNode* vnode,std::vector<std::string>& nameVec)
-{
- if(vnode->isServer())
- return;
-
- node_ptr node=vnode->node();
- if(!node)
- return;
-
- const std::vector<Meter>& v=node->meters();
- for(size_t i=0; i < v.size(); i++)
- {
- nameVec.push_back(v[i].name());
- }
-}
-
-bool VMeterAttribute::itemData(const VNode* vnode,int index,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node)
- return false;
-
- const std::vector<Meter>& v=node->meters();
- assert(index >=0 && index < v.size());
- getData(v[index],data);
- return true;
-}
-
-void VMeterAttribute::getData(const Meter& m,QStringList& data) const
-{
- data << qName_ <<
- QString::fromStdString(m.name()) <<
- QString::number(m.value()) << QString::number(m.min()) << QString::number(m.max()) <<
- QString::number(m.colorChange());
-}
-
-//================================
-// Labels
-//================================
-
-class VLabelAttribute : public VAttributeType
-{
-public:
- explicit VLabelAttribute(const std::string& n);
- int num(const VNode *node);
- bool getData(VNode *node,int row,int& size,QStringList& data);
- int lineNum(const VNode* vnode,int row);
- QString toolTip(QStringList d) const;
- int indexOf(const VNode* vnode,QStringList) const;
- bool itemData(const VNode*,int index,QStringList&);
-
-private:
- enum DataIndex {TypeIndex=0,NameIndex=1,ValueIndex=2};
- void itemNames(const VNode* vnode,std::vector<std::string>& nameVec);
- void getData(const Label& label,QStringList& data);
-};
-
-
-VLabelAttribute::VLabelAttribute(const std::string& n) :
- VAttributeType(n)
-{
- dataCount_=3;
- searchKeyToData_["label_name"]=NameIndex;
- searchKeyToData_["label_value"]=ValueIndex;
- searchKeyToData_["name"]=NameIndex;
-}
-
-int VLabelAttribute::num(const VNode *vnode)
-{
- if(vnode->isServer())
- return 0;
-
- node_ptr node=vnode->node();
- return (node.get())?static_cast<int>(node->labels().size()):0;
-}
-
-bool VLabelAttribute::getData(VNode *vnode,int row,int& size,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node.get())
- return false;
-
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << "VLabelAttribute::getData -->";
-#endif
- const std::vector<Label>& v=node->labels();
- if(row >=0 && row < v.size())
- {
- getData(v[row],data);
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " data=" << data.join(",");
-#endif
- return true;
- }
- size=v.size();
-
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " size=" << size;
-#endif
-
- return false;
-}
-
-int VLabelAttribute::lineNum(const VNode* vnode,int row)
-{
- if(vnode->isServer())
- return 1;
-
- node_ptr node=vnode->node();
- if(!node.get())
- return 1;
-
- const std::vector<Label>& v=node->labels();
- if(row >=0 && row < v.size())
- {
- std::string val=v[row].new_value();
- if(val.empty() || val == " ")
- {
- val=v[row].value();
- }
- return std::count(val.begin(), val.end(), '\n')+1;
- }
-
- return 1;
-}
-
-QString VLabelAttribute::toolTip(QStringList d) const
-{
- QString t="<b>Type:</b> Label<br>";
- if(d.count() == dataCount_)
- {
- t+="<b>Name:</b> " + d[NameIndex] + "<br>";
- t+="<b>Value:</b> " + d[ValueIndex];
- }
- return t;
-}
-
-int VLabelAttribute::indexOf(const VNode* vnode,QStringList data) const
-{
- if(vnode->isServer())
- return -1;
-
- node_ptr node=vnode->node();
- if(!node)
- return -1;
-
- if(data.count() != dataCount_ && data[TypeIndex] != qName_)
- return -1;
-
- const std::vector<Label>& v=node->labels();
- for(size_t i=0; i < v.size(); i++)
- {
- if(v[i].name() == data[NameIndex].toStdString())
- return i;
- }
-
- return -1;
-}
-
-void VLabelAttribute::itemNames(const VNode* vnode,std::vector<std::string>& nameVec)
-{
- if(vnode->isServer())
- return;
-
- node_ptr node=vnode->node();
- if(!node)
- return;
-
- const std::vector<Label>& v=node->labels();
- for(size_t i=0; i < v.size(); i++)
- {
- nameVec.push_back(v[i].name());
- }
-}
-
-bool VLabelAttribute::itemData(const VNode* vnode,int index,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node)
- return false;
-
- const std::vector<Label>& v=node->labels();
- UI_ASSERT(index >=0 && index < v.size(), "Index: " << UIDebug::longToString(index) << " v.size: " << v.size());
- getData(v[index],data);
- return true;
-}
-
-void VLabelAttribute::getData(const Label& label,QStringList& data)
-{
- std::string val=label.new_value();
- if(val.empty() || val == " ")
- {
- val=label.value();
- }
-
- data << qName_ <<
- QString::fromStdString(label.name()) <<
- QString::fromStdString(val);
-}
-
-//================================
-// Events
-//================================
-
-
-class VEventAttribute : public VAttributeType
-{
-public:
- explicit VEventAttribute(const std::string& n);
- int num(const VNode *node);
- bool getData(VNode *node,int row,int& size,QStringList& data);
- QString toolTip(QStringList d) const;
- int indexOf(const VNode* vnode,QStringList) const;
- bool itemData(const VNode*,int index,QStringList&);
-
-private:
- enum DataIndex {TypeIndex=0,NameIndex=1,ValueIndex=2,MinIndex=3, MaxIndex=4,ThresholdIndex=5};
- void itemNames(const VNode* vnode,std::vector<std::string>& nameVec);
- void getData(const Event& m,QStringList& data);
-
-};
-
-VEventAttribute::VEventAttribute(const std::string& n) :
- VAttributeType(n)
-{
- dataCount_=3;
- searchKeyToData_["event_name"]=NameIndex;
- searchKeyToData_["event_value"]=ValueIndex;
- searchKeyToData_["name"]=NameIndex;
-}
-
-int VEventAttribute::num(const VNode *vnode)
-{
- if(vnode->isServer())
- return 0;
-
- node_ptr node=vnode->node();
- return (node.get())? static_cast<int>(node->events().size()):0;
-}
-
-bool VEventAttribute::getData(VNode *vnode,int row,int& size,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node.get())
- return false;
-
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << "VEventAttribute::getData -->";
-#endif
- const std::vector<Event>& v=node->events();
- if(row >=0 && row < v.size())
- {
- getData(v[row],data);
-
-#if 0
- data << qName_ <<
- QString::fromStdString(v.at(row).name_or_number()) <<
- QString::number((v.at(row).value()==true)?1:0);
-#endif
-
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " data=" << data.join(",");
-#endif
- return true;
- }
- size=v.size();
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " size=" << size;
-#endif
-
- return false;
-}
-
-QString VEventAttribute::toolTip(QStringList d) const
-{
- QString t="<b>Type:</b> Event<br>";
- if(d.count() == dataCount_)
- {
- t+="<b>Name:</b> " + d[NameIndex] + "<br>";
- t+="<b>Status:</b> ";
- t+=(d[ValueIndex] == "1")?"set (true)":"clear (false)";
-
- }
- return t;
-}
-
-int VEventAttribute::indexOf(const VNode* vnode,QStringList data) const
+//Load the attributes parameter file
+void VAttributeType::load(VProperty* group)
{
- if(vnode->isServer())
- return -1;
-
- node_ptr node=vnode->node();
- if(!node)
- return -1;
-
- if(data.count() != dataCount_ && data[TypeIndex] != qName_)
- return -1;
-
- const std::vector<Event>& v=node->events();
- for(size_t i=0; i < v.size(); i++)
+ //We set some extra information on each type and also
+ //try to reorder the types according to the order defined in the
+ //parameter file. This order is very important:
+ // -it defines the rendering order
+ // -defines the order of the attribute items in the attribute filter
+ std::vector<VAttributeType*> v;
+ Q_FOREACH(VProperty* p,group->children())
{
- if(v[i].name_or_number() == data[NameIndex].toStdString())
- return i;
+ if(VAttributeType* obj=VAttributeType::find(p->strName()))
+ {
+ obj->setProperty(p);
+ v.push_back(obj);
+ }
+ else
+ {
+ UserMessage::message(UserMessage::ERROR,true,
+ "Unknown attribute type=" + p->strName() + " is loaded from parameter file!");
+ exit(1);
+ //UI_ASSERT(0,"Unknown attribute type is read from parameter file: " << p->strName());
+ }
}
- return -1;
-}
-
-void VEventAttribute::itemNames(const VNode* vnode,std::vector<std::string>& nameVec)
-{
- if(vnode->isServer())
- return;
+ //UI_ASSERT(v.size() == types_.size(),"types size=" << types_.size() << "loaded size=" << v.size());
- node_ptr node=vnode->node();
- if(!node)
- return;
-
- const std::vector<Event>& v=node->events();
- for(size_t i=0; i < v.size(); i++)
+ if(v.size() == types_.size())
+ types_=v;
+ else
{
- nameVec.push_back(v[i].name_or_number());
+ UserMessage::message(UserMessage::ERROR,true,
+ "The number attributes loaded from parameter file do not match expected number! loaded=" +
+ UserMessage::toString(v.size()) + " expected=" + UserMessage::toString(types_.size()));
+ exit(1);
}
}
-bool VEventAttribute::itemData(const VNode* vnode,int index,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node)
- return false;
-
- const std::vector<Event>& v=node->events();
- UI_ASSERT(index >=0 && index < v.size(), "Index: " << UIDebug::longToString(index) << " v.size: " << v.size());
- getData(v[index],data);
- return true;
-}
-
-void VEventAttribute::getData(const Event& e,QStringList& data)
-{
- data << qName_ <<
- QString::fromStdString(e.name_or_number()) <<
- QString::number((e.value()==true)?1:0);
-}
-
-
-//================================
-//Generated Variables
-//================================
-
-class VGenvarAttribute : public VAttributeType
-{
-public:
- explicit VGenvarAttribute(const std::string& n);
- int num(const VNode *node);
- bool getData(VNode *node,int row,int& size,QStringList& data);
- int indexOf(const VNode* vnode,QStringList) const;
- bool itemData(const VNode*,int index,QStringList& data);
-
-private:
- enum DataIndex {TypeIndex=0,NameIndex=1,ValueIndex=2};
- void itemNames(const VNode* vnode,std::vector<std::string>& nameVec);
- void getData(const Variable&,QStringList& data);
-};
-
-VGenvarAttribute::VGenvarAttribute(const std::string& n) : VAttributeType(n)
-{
- dataCount_=3;
- searchKeyToData_["var_name"]=NameIndex;
- searchKeyToData_["var_value"]=ValueIndex;
- searchKeyToData_["var_type"]=TypeIndex;
- searchKeyToData_["name"]=NameIndex;
-}
-
-int VGenvarAttribute::num(const VNode *vnode)
-{
- return vnode->genVariablesNum();
-}
-
-bool VGenvarAttribute::getData(VNode *vnode,int row,int& size,QStringList& data)
-{
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << "VGenvarAttribute::getData -->";
-#endif
-
- std::vector<Variable> genV;
- vnode->genVariables(genV);
-
- if(row >=0 && row < genV.size())
- {
- getData(genV[row],data);
- //data << qName_ <<
- // QString::fromStdString(genV.at(row).name()) <<
- // QString::fromStdString(genV.at(row).theValue());
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " data=" << data.join(",");
-#endif
- return true;
- }
- size=genV.size();
-
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " size=" << size;
-#endif
- return false;
-}
-
-int VGenvarAttribute::indexOf(const VNode* vnode,QStringList data) const
-{
- if(data.count() != dataCount_ && data[TypeIndex] != qName_)
- return -1;
-
- std::vector<Variable> v;
- vnode->genVariables(v);
-
- for(size_t i=0; i < v.size(); i++)
- {
- if(v[i].name() == data[NameIndex].toStdString())
- return i;
- }
-
- return -1;
-}
-
-void VGenvarAttribute::itemNames(const VNode* vnode,std::vector<std::string>& nameVec)
-{
- std::vector<Variable> v;
- vnode->genVariables(v);
- for(size_t i=0; i < v.size(); i++)
- {
- nameVec.push_back(v[i].name());
- }
-}
-
-bool VGenvarAttribute::itemData(const VNode* vnode,int index,QStringList& data)
-{
- std::vector<Variable> v;
- vnode->genVariables(v);
- assert(index >=0 && index < v.size());
- getData(v[index],data);
- return true;
-}
-
-void VGenvarAttribute::getData(const Variable& v,QStringList& data)
-{
- data << qName_ <<
- QString::fromStdString(v.name()) <<
- QString::fromStdString(v.theValue());
-}
-
-//================================
-//Variables
-//================================
-
-class VVarAttribute : public VAttributeType
-{
-public:
- explicit VVarAttribute(const std::string& n);
- int num(const VNode *node);
- bool getData(VNode *node,int row,int& size,QStringList& data);
- int indexOf(const VNode* vnode,QStringList) const;
- bool itemData(const VNode*,int index,QStringList&);
-
-private:
- enum DataIndex {TypeIndex=0,NameIndex=1,ValueIndex=2};
- void itemNames(const VNode* vnode,std::vector<std::string>& nameVec);
- void getData(const Variable&,QStringList& data);
-};
-
-VVarAttribute::VVarAttribute(const std::string& n) : VAttributeType(n)
-{
- dataCount_=3;
- searchKeyToData_["var_name"]=NameIndex;
- searchKeyToData_["var_value"]=ValueIndex;
- searchKeyToData_["var_type"]=TypeIndex;
- searchKeyToData_["name"]=NameIndex;
-}
-
-int VVarAttribute::num(const VNode *vnode)
-{
- return vnode->variablesNum();
-}
-
-bool VVarAttribute::getData(VNode *vnode,int row,int& size,QStringList& data)
-{
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << "VVarAttribute::getData -->";
-#endif
-
- if(vnode->isServer())
- {
- std::vector<Variable> v;
- vnode->variables(v);
- if(row >=0 && row < v.size())
- {
- getData(v[row],data);
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " data=" << data.join(",");
-#endif
- return true;
- }
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " size=" << size;
-#endif
- size=v.size();
- }
- else
- {
- node_ptr node=vnode->node();
- if(!node)
- return false;
-
- const std::vector<Variable>& v=node->variables();
- if(row >=0 && row < v.size())
- {
- getData(v[row],data);
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " data=" << data.join(",");
-#endif
- return true;
- }
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " size=" << size;
-#endif
- size=v.size();
- }
-
- return false;
-}
-
-int VVarAttribute::indexOf(const VNode* vnode,QStringList data) const
-{
- if(data.count() != dataCount_ && data[TypeIndex] != qName_)
- return -1;
-
- if(vnode->isServer())
- {
- std::vector<Variable> v;
- vnode->variables(v);
- for(size_t i=0; i < v.size(); i++)
- {
- if(v[i].name() == data[NameIndex].toStdString())
- return i;
- }
- }
- else
- {
- node_ptr node=vnode->node();
- if(!node)
- return -1;
-
- const std::vector<Variable>& v=node->variables();
- for(size_t i=0; i < v.size(); i++)
- {
- if(v[i].name() == data[NameIndex].toStdString())
- return i;
- }
- }
-
- return -1;
-}
-
-void VVarAttribute::itemNames(const VNode* vnode,std::vector<std::string>& nameVec)
-{
- if(vnode->isServer())
- {
- std::vector<Variable> v;
- vnode->variables(v);
- for(size_t i=0; i < v.size(); i++)
- {
- nameVec.push_back(v[i].name());
- }
- }
- else
- {
- node_ptr node=vnode->node();
- if(!node)
- return;
-
- const std::vector<Variable>& v=node->variables();
- for(size_t i=0; i < v.size(); i++)
- {
- nameVec.push_back(v[i].name());
- }
- }
-}
-
-bool VVarAttribute::itemData(const VNode* vnode,int index,QStringList& data)
-{
- if(vnode->isServer())
- {
- std::vector<Variable> v;
- vnode->variables(v);
- getData(v[index],data);
-
- }
- else
- {
- node_ptr node=vnode->node();
- if(!node)
- return false;
-
- const std::vector<Variable>& v=node->variables();
- assert(index >=0 && index < v.size());
- getData(v[index],data);
- }
-
- return true;
-}
-
-void VVarAttribute::getData(const Variable& v,QStringList& data)
-{
- data << qName_ <<
- QString::fromStdString(v.name()) <<
- QString::fromStdString(v.theValue());
-}
-
-//================================
-// Limits
-//================================
-
-class VLimitAttribute : public VAttributeType
-{
-public:
- explicit VLimitAttribute(const std::string& n);
- int num(const VNode *node);
- bool getData(VNode *node,int row,int& size,QStringList& data);
- QString toolTip(QStringList d) const;
- int indexOf(const VNode* vnode,QStringList) const;
- bool itemData(const VNode*,int index,QStringList&);
-
-private:
- enum DataIndex {TypeIndex=0,NameIndex=1,ValueIndex=2,MaxIndex=3};
- void itemNames(const VNode* vnode,std::vector<std::string>& nameVec);
- void getData(limit_ptr lim,QStringList& data);
-};
-
-VLimitAttribute::VLimitAttribute(const std::string& n) : VAttributeType(n)
-{
- dataCount_=4;
- searchKeyToData_["limit_name"]=NameIndex;
- searchKeyToData_["limit_value"]=ValueIndex;
- searchKeyToData_["limit_max"]=MaxIndex;
- searchKeyToData_["name"]=NameIndex;
-}
-
-int VLimitAttribute::num(const VNode *vnode)
-{
- if(vnode->isServer())
- return 0;
-
- node_ptr node=vnode->node();
- return (node.get())?static_cast<int>(node->limits().size()):0;
-}
-
-bool VLimitAttribute::getData(VNode *vnode,int row,int& size,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node.get())
- return false;
-
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << "VLimitAttribute::getData -->";
-#endif
-
- const std::vector<limit_ptr>& v=node->limits();
- if(row >=0 && row < v.size())
- {
- getData(v[row],data);
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " data=" << data.join(",");
-#endif
-
- return true;
- }
- size=v.size();
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " size=" << size;
-#endif
-
- return false;
-}
-
-QString VLimitAttribute::toolTip(QStringList d) const
-{
- QString t="<b>Type:</b> Limit<br>";
- if(d.count() == dataCount_)
- {
- t+="<b>Name:</b> " + d[NameIndex] + "<br>";
- t+="<b>Value:</b> " + d[ValueIndex] + "<br>";
- t+="<b>Maximum:</b> " + d[MaxIndex];
- }
- return t;
-}
-
-int VLimitAttribute::indexOf(const VNode* vnode,QStringList data) const
-{
- if(vnode->isServer())
- return -1;
-
- node_ptr node=vnode->node();
- if(!node)
- return -1;
-
- if(data.count() != dataCount_ && data[TypeIndex] != qName_)
- return -1;
-
- const std::vector<limit_ptr>& v=node->limits();
- for(size_t i=0; i < v.size(); i++)
- {
- if(v[i]->name() == data[NameIndex].toStdString())
- return i;
- }
-
- return -1;
-}
-
-void VLimitAttribute::itemNames(const VNode* vnode,std::vector<std::string>& nameVec)
-{
- if(vnode->isServer())
- return;
-
- node_ptr node=vnode->node();
- if(!node)
- return;
-
- const std::vector<limit_ptr>& v=node->limits();
- for(size_t i=0; i < v.size(); i++)
- {
- nameVec.push_back(v[i]->name());
- }
-}
-
-bool VLimitAttribute::itemData(const VNode* vnode,int index,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node)
- return false;
-
- const std::vector<limit_ptr>& v=node->limits();
- UI_ASSERT(index >=0 && index < v.size(), "index = " << UIDebug::longToString(index) << " v.size: " << UIDebug::longToString(v.size()));
- getData(v[index],data);
- return true;
-}
-
-void VLimitAttribute::getData(limit_ptr lim,QStringList& data)
-{
- data << qName_ <<
- QString::fromStdString(lim->name()) <<
- QString::number(lim->value()) <<
- QString::number(lim->theLimit());
-}
-
-//================================
-//Limiters
-//================================
-
-class VLimiterAttribute : public VAttributeType
-{
-public:
- explicit VLimiterAttribute(const std::string& n);
- int num(const VNode *node);
- bool getData(VNode *node,int row,int& size,QStringList& data);
- QString toolTip(QStringList d) const;
- int indexOf(const VNode* vnode,QStringList) const;
- bool itemData(const VNode*,int index,QStringList&);
-
-private:
- enum DataIndex {TypeIndex=0,NameIndex=1,PathIndex=2};
- void itemNames(const VNode* vnode,std::vector<std::string>& nameVec);
- void getData(const InLimit& lim,QStringList& data);
-};
-
-VLimiterAttribute::VLimiterAttribute(const std::string& n) : VAttributeType(n)
-{
- dataCount_=3;
- searchKeyToData_["limiter_name"]=NameIndex;
- searchKeyToData_["limiter_path"]=PathIndex;
- searchKeyToData_["name"]=NameIndex;
-}
-
-int VLimiterAttribute::num(const VNode *vnode)
-{
- if(vnode->isServer())
- return 0;
-
- node_ptr node=vnode->node();
- return (node)?static_cast<int>(node->inlimits().size()):0;
-}
-
-bool VLimiterAttribute::getData(VNode *vnode,int row,int& size,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node.get())
- return false;
-
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << "VLimiterAttribute::getData -->";
-#endif
- const std::vector<InLimit>& v=node->inlimits();
- if(row >=0 && row < v.size())
- {
- getData(v[row],data);
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " data=" << data.join(",");
-#endif
- return true;
- }
- size=v.size();
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " size=" << size;
-#endif
- return false;
-}
-
-QString VLimiterAttribute::toolTip(QStringList d) const
-{
- QString t="<b>Type:</b> Limiter<br>";
- if(d.count() == dataCount_)
- {
- t+="<b>Limit:</b> " + d[NameIndex] + "<br>";
- t+="<b>Node:</b> " + d[PathIndex];
-
- }
- return t;
-}
-
-int VLimiterAttribute::indexOf(const VNode* vnode,QStringList data) const
-{
- if(vnode->isServer())
- return -1;
-
- node_ptr node=vnode->node();
- if(!node)
- return -1;
-
- if(data.count() != dataCount_ && data[TypeIndex] != qName_)
- return -1;
-
- const std::vector<InLimit>& v=node->inlimits();
- for(size_t i=0; i < v.size(); i++)
- {
- if(v[i].name() == data[NameIndex].toStdString() &&
- v[i].pathToNode() == data[PathIndex].toStdString())
- return i;
- }
-
- return -1;
-}
-
-void VLimiterAttribute::itemNames(const VNode* vnode,std::vector<std::string>& nameVec)
-{
- if(vnode->isServer())
- return;
-
- node_ptr node=vnode->node();
- if(!node)
- return;
-
- const std::vector<InLimit>& v=node->inlimits();
- for(size_t i=0; i < v.size(); i++)
- {
- nameVec.push_back(v[i].name());
- }
-}
-
-bool VLimiterAttribute::itemData(const VNode* vnode,int index,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node)
- return false;
-
- const std::vector<InLimit>& v=node->inlimits();
- assert(index >=0 && index < v.size());
- getData(v[index],data);
- return true;
-}
-
-void VLimiterAttribute::getData(const InLimit& lim,QStringList& data)
-{
- data << qName_ <<
- QString::fromStdString(lim.name()) <<
- QString::fromStdString(lim.pathToNode());
-}
-
-//================================
-//Triggers
-//================================
-
-class VTriggerAttribute : public VAttributeType
-{
-public:
- explicit VTriggerAttribute(const std::string& n);
- int num(const VNode *node);
- bool getData(VNode *node,int row,int& size,QStringList& data);
- QString toolTip(QStringList d) const;
- int indexOf(const VNode* vnode,QStringList data) const;
- bool itemData(const VNode*,int index,QStringList&);
-
-private:
- enum DataIndex {TypeIndex=0,CompleteIndex=1,ExprIndex=2};
- void itemNames(const VNode*,std::vector<std::string>&) {}
-};
-
-VTriggerAttribute::VTriggerAttribute(const std::string& n) : VAttributeType(n)
-{
- dataCount_=3;
- searchKeyToData_["trigger_type"]=CompleteIndex;
- searchKeyToData_["trigger_expression"]=ExprIndex;
- searchKeyToData_["name"]=CompleteIndex;
-}
-
-int VTriggerAttribute::num(const VNode *vnode)
-{
- if(vnode->isServer())
- return 0;
-
- node_ptr node=vnode->node();
- if(!node.get())
- return false;
- int num=(node->get_trigger())?1:0;
- num+=(node->get_complete())?1:0;
- return num;
-}
-
-bool VTriggerAttribute::getData(VNode *vnode,int row,int& size,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node.get())
- return false;
-
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << "VTriggerAttribute::getData -->";
-#endif
-
- Expression* eT=node->get_trigger();
- Expression* eC=node->get_complete();
-
- bool getTrigger=false;
- bool getComplete=false;
-
- if(row == 0)
- {
- if(eT)
- getTrigger=true;
- else if(eC)
- getComplete=true;
- }
- else if(row==1 && eC)
- getComplete=true;
-
- if(getTrigger)
- {
- data << qName_;
- data << "0" << QString::fromStdString(eT->expression());
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " data=" << data.join(",");
-#endif
- return true;
- }
- else if(getComplete)
- {
- data << qName_;
- data << "1" << QString::fromStdString(eC->expression());
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " data=" << data.join(",");
-#endif
- return true;
- }
-
- size=(eT)?1:0;
- size+=(eC)?1:0;
-
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " size=" << size;
-#endif
- return false;
-}
-
-int VTriggerAttribute::indexOf(const VNode* vnode,QStringList data) const
-{
- if(vnode->isServer())
- return -1;
-
- node_ptr node=vnode->node();
- if(!node)
- return -1;
-
- if(data.count() != dataCount_ && data[TypeIndex] != qName_)
- return -1;
-
- Expression* eT=node->get_trigger();
- Expression* eC=node->get_complete();
-
- int index=-1;
- if(eT)
- {
- index=0;
- if(data[CompleteIndex] == "0")
- return index;
- }
-
- if(eC)
- {
- if(index==0)
- index=1;
- else
- index=0;
-
- if(data[CompleteIndex] == "1")
- return index;
- }
-
- //TODO: we should check the expressions as well
-
- return -1;
-}
-
-bool VTriggerAttribute::itemData(const VNode* vnode,int index,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node)
- return false;
-
- Expression* eT=node->get_trigger();
- Expression* eC=node->get_complete();
-
- bool getTrigger=false;
- bool getComplete=false;
-
- if(index == 0)
- {
- if(eT)
- getTrigger=true;
- else if(eC)
- getComplete=true;
- }
- else if(index==1 && eC)
- getComplete=true;
-
- if(getTrigger)
- {
- data << qName_ << "0" << QString::fromStdString(eT->expression());
- return true;
- }
- else if(getComplete)
- {
- data << qName_ << "1" << QString::fromStdString(eC->expression());
- }
-
- return false;
-}
-
-QString VTriggerAttribute::toolTip(QStringList d) const
-{
- QString t;
- if(d.count() == dataCount_)
- {
- if(d[CompleteIndex] == "0")
- t+="<b>Type:</b> Trigger<br>";
- else if(d[CompleteIndex] == "1")
- t+="<b>Type:</b> Complete<br>";
- else
- return t;
-
- t+="<b>Expression:</b> " + d[ExprIndex];
- }
- return t;
-}
-
-//================================
-//Times
-//================================
-
-class VTimeAttribute : public VAttributeType
-{
-public:
- explicit VTimeAttribute(const std::string& n);
- int num(const VNode *node);
- bool getData(VNode *node,int row,int& size,QStringList& data);
- QString toolTip(QStringList d) const;
- int indexOf(const VNode* vnode,QStringList) const;
- bool itemData(const VNode*,int index,QStringList&);
-
-private:
- enum DataIndex {TypeIndex=0,NameIndex=1};
- void itemNames(const VNode* vnode,std::vector<std::string>& nameVec);
- void getData(const ecf::TimeAttr& lim,QStringList& data);
- void getData(const ecf::TodayAttr& lim,QStringList& data);
- void getData(const ecf::CronAttr& lim,QStringList& data);
-};
-
-VTimeAttribute::VTimeAttribute(const std::string& n) : VAttributeType(n)
-{
- dataCount_=2;
- searchKeyToData_["time_name"]=NameIndex;
- searchKeyToData_["name"]=NameIndex;
-}
-
-int VTimeAttribute::num(const VNode *vnode)
-{
- if(vnode->isServer())
- return 0;
-
- node_ptr node=vnode->node();
- return (node)?static_cast<int>(node->timeVec().size() + node->todayVec().size()+ node->crons().size()):0;
-}
-
-bool VTimeAttribute::getData(VNode *vnode,int row,int& size,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node)
- return false;
-
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << "VTimeAttribute::getData -->";
-#endif
-
- const std::vector<ecf::TimeAttr>& tV=node->timeVec();
- const std::vector<ecf::TodayAttr>& tdV=node->todayVec();
- const std::vector<ecf::CronAttr>& cV=node->crons();
-
- if(row >=0 && row < tV.size()+tdV.size()+ cV.size())
- {
- if(row < tV.size())
- getData(tV[row],data);
- else if(row < tV.size() + tdV.size())
- getData(tdV[row-tV.size()],data);
- else
- getData(cV[row-tV.size()-tdV.size()],data);
-
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " data=" << data.join(",");
-#endif
- return true;
- }
-
- size=tV.size()+tdV.size()+ cV.size();
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " size=" << size;
-#endif
- return false;
-}
-
-QString VTimeAttribute::toolTip(QStringList d) const
-{
- QString t="<b>Type:</b> Time<br>";
- if(d.count() == dataCount_)
- {
- t+="<b>Name:</b> " + d[NameIndex];
- }
- return t;
-}
-
-int VTimeAttribute::indexOf(const VNode* vnode,QStringList data) const
-{
- if(vnode->isServer())
- return -1;
-
- node_ptr node=vnode->node();
- if(!node)
- return -1;
-
- if(data.count() != dataCount_ && data[TypeIndex] != qName_)
- return -1;
-
- const std::vector<ecf::TimeAttr>& tV=node->timeVec();
- const std::vector<ecf::TodayAttr>& tdV=node->todayVec();
- const std::vector<ecf::CronAttr>& cV=node->crons();
-
- int cnt=0;
- for(size_t i=0; i < tV.size(); i++)
- {
- if(tV[i].name() == data[NameIndex].toStdString())
- return i;
- }
-
- cnt+=tV.size();
- for(size_t i=0; i < tdV.size(); i++)
- {
- if(tdV[i].name() == data[NameIndex].toStdString())
- return cnt+i;
- }
-
- cnt+=tdV.size();
- for(size_t i=0; i < cV.size(); i++)
- {
- if(cV[i].name() == data[NameIndex].toStdString())
- return cnt+i;
- }
-
- return -1;
-}
-
-void VTimeAttribute::itemNames(const VNode* vnode,std::vector<std::string>& nameVec)
-{
- if(vnode->isServer())
- return;
-
- node_ptr node=vnode->node();
- if(!node)
- return;
-
- const std::vector<ecf::TimeAttr>& tV=node->timeVec();
- const std::vector<ecf::TodayAttr>& tdV=node->todayVec();
- const std::vector<ecf::CronAttr>& cV=node->crons();
-
- for(size_t i=0; i < tV.size(); i++)
- {
- nameVec.push_back(tV[i].name());
- }
- for(size_t i=0; i < tdV.size(); i++)
- {
- nameVec.push_back(tdV[i].name());
- }
- for(size_t i=0; i < cV.size(); i++)
- {
- nameVec.push_back(cV[i].name());
- }
-}
-
-bool VTimeAttribute::itemData(const VNode* vnode,int index,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node)
- return false;
-
- const std::vector<ecf::TimeAttr>& tV=node->timeVec();
- const std::vector<ecf::TodayAttr>& tdV=node->todayVec();
- const std::vector<ecf::CronAttr>& cV=node->crons();
-
- if(index >=0 && index < tV.size()+tdV.size()+ cV.size())
- {
- if(index < tV.size())
- getData(tV[index],data);
- else if(index < tV.size() + tdV.size())
- getData(tdV[index-tV.size()],data);
- else
- getData(cV[index-tV.size()-tdV.size()],data);
-
- assert(!data.isEmpty());
- }
-
- return false;
-}
-
-void VTimeAttribute::getData(const ecf::TimeAttr& d,QStringList& data)
-{
- data << qName_ << QString::fromStdString(d.name());
-}
-
-void VTimeAttribute::getData(const ecf::TodayAttr& d,QStringList& data)
-{
- data << qName_ << QString::fromStdString(d.name());
-}
-
-void VTimeAttribute::getData(const ecf::CronAttr& d,QStringList& data)
-{
- data << qName_ << QString::fromStdString(d.name());
-}
-
-//================================
-//Date
-//================================
-
-class VDateAttribute : public VAttributeType
-{
-public:
- explicit VDateAttribute(const std::string& n);
- int num(const VNode *node);
- bool getData(VNode *node,int row,int& size,QStringList& data);
- QString toolTip(QStringList d) const;
- int indexOf(const VNode* vnode,QStringList) const;
- bool itemData(const VNode*,int index,QStringList&);
-
-private:
- enum DataIndex {TypeIndex=0,NameIndex=1};
- void itemNames(const VNode* vnode,std::vector<std::string>& nameVec);
- void getData(const DateAttr& lim,QStringList& data);
- void getData(const DayAttr& lim,QStringList& data);
-};
-
-VDateAttribute::VDateAttribute(const std::string& n) : VAttributeType(n)
-{
- dataCount_=2;
- searchKeyToData_["date_name"]=NameIndex;
- searchKeyToData_["name"]=NameIndex;
-}
-
-int VDateAttribute::num(const VNode *vnode)
-{
- if(vnode->isServer())
- return 0;
-
- node_ptr node=vnode->node();
- return (node.get())?static_cast<int>(node->dates().size() + node->days().size()):0;
-}
-
-bool VDateAttribute::getData(VNode *vnode,int row,int& size,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node.get())
- return false;
-
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << "VDateAttribute::getData -->";
-#endif
-
- const std::vector<DateAttr>& dV=node->dates();
- const std::vector<DayAttr>& dayV=node->days();
-
- if(row >=0 && row < dV.size()+dayV.size())
- {
- if(row < dV.size())
- getData(dV[row],data);
- else
- getData(dayV[row-dV.size()],data);
-
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " data=" << data.join(",");
-#endif
-
- return true;
- }
- size=dV.size()+dayV.size();
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " size=" << size;
-#endif
- return false;
-}
-
-QString VDateAttribute::toolTip(QStringList d) const
-{
- QString t="<b>Type:</b> Date<br>";
- if(d.count() == dataCount_)
- {
- t+="<b>Name:</b> " + d[NameIndex];
- }
- return t;
-}
-
-int VDateAttribute::indexOf(const VNode* vnode,QStringList data) const
-{
- if(vnode->isServer())
- return -1;
-
- node_ptr node=vnode->node();
- if(!node)
- return -1;
-
- if(data.count() != dataCount_ && data[TypeIndex] != qName_)
- return -1;
-
- const std::vector<DateAttr>& dV=node->dates();
- const std::vector<DayAttr>& dayV=node->days();
-
- int cnt=0;
- for(size_t i=0; i < dV.size(); i++)
- {
- if(dV[i].name() == data[NameIndex].toStdString())
- return i;
- }
-
- cnt+=dV.size();
- for(size_t i=0; i < dayV.size(); i++)
- {
- if(dayV[i].name() == data[NameIndex].toStdString())
- return cnt+i;
- }
-
- return -1;
-}
-
-void VDateAttribute::itemNames(const VNode* vnode,std::vector<std::string>& nameVec)
-{
- if(vnode->isServer())
- return;
-
- node_ptr node=vnode->node();
- if(!node)
- return;
-
- const std::vector<DateAttr>& dV=node->dates();
- const std::vector<DayAttr>& dayV=node->days();
-
- for(size_t i=0; i < dV.size(); i++)
- {
- nameVec.push_back(dV[i].name());
- }
- for(size_t i=0; i < dayV.size(); i++)
- {
- nameVec.push_back(dayV[i].name());
- }
-}
-
-bool VDateAttribute::itemData(const VNode* vnode,int index,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node)
- return false;
-
- const std::vector<DateAttr>& dV=node->dates();
- const std::vector<DayAttr>& dayV=node->days();
-
- if(index >=0 && index < dV.size()+dayV.size())
- {
- QStringList data;
- if(index < dV.size())
- getData(dV[index],data);
- else
- getData(dayV[index-dV.size()],data);
-
- assert(!data.isEmpty());
- }
-
- return false;
-}
-
-void VDateAttribute::getData(const DateAttr& d,QStringList& data)
-{
- data << qName_ << QString::fromStdString(d.name());
-}
-
-void VDateAttribute::getData(const DayAttr& d,QStringList& data)
-{
- data << qName_ << QString::fromStdString(d.name());
-}
-
-//================================
-//Repeat
-//================================
-
-class VRepeatAttribute : public VAttributeType
-{
-public:
- explicit VRepeatAttribute(const std::string& n);
- int num(const VNode *node);
- bool getData(VNode *node,int row,int& size,QStringList& data);
- QString toolTip(QStringList d) const;
- int indexOf(const VNode* vnode,QStringList) const;
- bool itemData(const VNode*,int index,QStringList&);
-
-private:
- enum DataIndex {TypeIndex=0,SubtypeIndex=1,NameIndex=2,ValueIndex=3,StartIndex=4,EndIndex=5,StepIndex=6};
- void itemNames(const VNode* vnode,std::vector<std::string>& nameVec);
- void getData(const Repeat& r,QStringList& data);
-};
-
-
-VRepeatAttribute::VRepeatAttribute(const std::string& n) : VAttributeType(n)
-{
- dataCount_=7;
- searchKeyToData_["repeat_name"]=NameIndex;
- searchKeyToData_["repeat_value"]=ValueIndex;
- searchKeyToData_["name"]=NameIndex;
-}
-
-int VRepeatAttribute::num(const VNode *vnode)
-{
- if(vnode->isServer())
- return 0;
-
- node_ptr node=vnode->node();
- return (node.get())?((node->repeat().empty())?0:1):0;
-}
-
-bool VRepeatAttribute::getData(VNode *vnode,int row,int& size,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node.get())
- return false;
-
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << "VRepeatAttribute::getData -->";
-#endif
-
- const Repeat& r=node->repeat();
- if(row ==0 && !r.empty())
- {
- getData(r,data);
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " data=" << data.join(",");
-#endif
- return true;
- }
- size=(r.empty())?0:1;
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " size=" << size;
-#endif
- return false;
-}
-
-QString VRepeatAttribute::toolTip(QStringList d) const
-{
- QString t="<b>Type:</b> Repeat";
- if(d.count() == dataCount_)
- {
- t+=" " + d[SubtypeIndex] + "<br>";
-
- if(d[SubtypeIndex] != "day")
- {
- t+="<b>Name:</b> " + d[NameIndex] + "<br>";
- t+="<b>Value:</b> " + d[ValueIndex] + "<br>";
- t+="<b>Start:</b> " + d[StartIndex] + "<br>";
- t+="<b>End:</b> " + d[EndIndex] + "<br>";
- t+="<b>Step:</b> " + d[StepIndex];
- }
- else
- {
- t+="<b>Step:</b> " + d[StepIndex];
- }
- }
-
- return t;
-}
-
-int VRepeatAttribute::indexOf(const VNode* vnode,QStringList data) const
-{
- if(vnode->isServer())
- return -1;
-
- node_ptr node=vnode->node();
- if(!node)
- return -1;
-
- if(data.count() != dataCount_ && data[TypeIndex] != qName_)
- return -1;
-
- const Repeat& r=node->repeat();
- if(r.name() == data[NameIndex].toStdString())
- {
- if(VRepeat::type(r) == data[SubtypeIndex].toStdString())
- return 0;
- }
-
- return -1;
-}
-
-void VRepeatAttribute::itemNames(const VNode* vnode,std::vector<std::string>& nameVec)
-{
- if(vnode->isServer())
- return;
-
- node_ptr node=vnode->node();
- if(!node)
- return;
-
- const Repeat& r=node->repeat();
- if(!r.empty())
- nameVec.push_back(r.name());
-}
-
-bool VRepeatAttribute::itemData(const VNode* vnode,int index,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node)
- return false;
-
- const Repeat& r=node->repeat();
- if(index == 0 && !r.empty())
- {
- getData(r,data);
- return true;
- }
-
- return false;
-}
-
-void VRepeatAttribute::getData(const Repeat& r,QStringList& data)
-{
- //We try to avoid creating a VRepeat object everytime we are here
- std::string type=VRepeat::type(r);
-
- data << qName_ << QString::fromStdString(type) <<
- QString::fromStdString(r.name()) <<
- QString::fromStdString(r.valueAsString()) <<
- QString::fromStdString(r.value_as_string(r.start())) <<
- QString::fromStdString(r.value_as_string(r.end())) <<
- QString::number(r.step());
-}
-
-
-//================================
-//Late
-//================================
-
-class VLateAttribute : public VAttributeType
-{
-public:
- explicit VLateAttribute(const std::string& n);
- int num(const VNode *node);
- bool getData(VNode *node,int row,int& size,QStringList& data);
- QString toolTip(QStringList d) const;
- int indexOf(const VNode* vnode,QStringList) const;
- bool itemData(const VNode*,int index,QStringList& data);
-
-private:
- enum DataIndex {TypeIndex=0,NameIndex=1};
- void itemNames(const VNode* vnode,std::vector<std::string>& nameVec);
- void getData(ecf::LateAttr *late,QStringList& data);
-};
-
-
-VLateAttribute::VLateAttribute(const std::string& n) : VAttributeType(n)
-{
- dataCount_=2;
- searchKeyToData_["late_name"]=NameIndex;
- searchKeyToData_["late_type"]=TypeIndex;
- searchKeyToData_["name"]=NameIndex;
-}
-
-int VLateAttribute::num(const VNode *vnode)
-{
- if(vnode->isServer())
- return 0;
-
- node_ptr node=vnode->node();
- return (node.get())?((node->get_late())?1:0):0;
-}
-
-bool VLateAttribute::getData(VNode *vnode,int row,int& size,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node.get())
- return false;
-
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << "VLateAttribute::getData -->";
-#endif
-
- ecf::LateAttr *late=node->get_late();
- if(row ==0 && late)
- {
- getData(late,data);
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " data=" << data.join(",");
-#endif
- return true;
- }
- size=(late)?1:0;
-#ifdef _UI_ATTR_DEBUG
- UiLog().dbg() << " size=" << size;
-#endif
- return false;
-}
-
-QString VLateAttribute::toolTip(QStringList d) const
-{
- QString t="<b>Type:</b> Late<br>";
- if(d.count() == dataCount_)
- {
- t+="<b>Name:</b> " + d[NameIndex];
- }
- return t;
-}
-
-int VLateAttribute::indexOf(const VNode* vnode,QStringList data) const
-{
- if(vnode->isServer())
- return -1;
-
- node_ptr node=vnode->node();
- if(!node)
- return -1;
-
- if(data.count() != dataCount_ && data[TypeIndex] != qName_)
- return -1;
-
- ecf::LateAttr *late=node->get_late();
- if(late && late->name() == data[NameIndex].toStdString())
- {
- return 0;
- }
-
- return -1;
-}
-
-void VLateAttribute::itemNames(const VNode* vnode,std::vector<std::string>& nameVec)
-{
- if(vnode->isServer())
- return;
-
- node_ptr node=vnode->node();
- if(!node)
- return;
-
- ecf::LateAttr *late=node->get_late();
- if(late)
- nameVec.push_back(late->name());
-}
-
-bool VLateAttribute::itemData(const VNode* vnode,int /*index*/,QStringList& data)
-{
- if(vnode->isServer())
- return false;
-
- node_ptr node=vnode->node();
- if(!node)
- return false;
-
- ecf::LateAttr *late=node->get_late();
- if(late)
- {
- getData(late,data);
- return true;
- }
-
- return false;
-}
-
-void VLateAttribute::getData(ecf::LateAttr *late,QStringList& data)
-{
- if(late)
- data << qName_ << QString::fromStdString(late->name());
-}
-
-static VMeterAttribute meterAttr("meter");
-static VEventAttribute eventAttr("event");
-static VRepeatAttribute repeatAttr("repeat");
-static VTriggerAttribute triggerAttr("trigger");
-static VLabelAttribute labelAttr("label");
-static VTimeAttribute timeAttr("time");
-static VDateAttribute dateAttr("date");
-static VLimitAttribute limitAttr("limit");
-static VLimiterAttribute limiterAttr("limiter");
-static VLateAttribute lateAttr("late");
-static VVarAttribute varAttr("var");
-static VGenvarAttribute genvarAttr("genvar");
-
static SimpleLoader<VAttributeType> loader("attribute");
diff --git a/Viewer/src/VAttributeType.hpp b/Viewer/src/VAttributeType.hpp
index 73732b9..3e941f5 100644
--- a/Viewer/src/VAttributeType.hpp
+++ b/Viewer/src/VAttributeType.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -15,7 +15,6 @@
#include <vector>
#include <string>
-#include "VItemTmp.hpp"
#include "VParam.hpp"
class AttributeFilter;
@@ -25,56 +24,34 @@ class VAttribute;
class VAttributeType : public VParam
{
public:
- explicit VAttributeType(const std::string& name);
virtual ~VAttributeType() {}
static std::vector<VParam*> filterItems();
-
- static VAttributeType* getType(const VNode *vnode,int row,AttributeFilter *filter=0);
- static bool getData(VNode* vnode,int row,VAttributeType* &type,QStringList& data,AttributeFilter *filter=0);
- static bool getData(const std::string& type,VNode* vnode,int row,QStringList& data);
- static int totalNum(const VNode *vnode,AttributeFilter *filter=0);
- static void init(const std::string& parFile);
- static int getLineNum(const VNode *vnode,int row,AttributeFilter *filter=0);
-#if 0
- static int getRow(const VNode *vnode,int row,AttributeFilter *filter=0);
-#endif
- static VItemTmp_ptr itemForAbsIndex(const VNode *vnode,int absIndex,AttributeFilter *filter);
-
static VAttributeType* find(const std::string& name);
static VAttributeType* find(int id);
- static const std::vector<VAttributeType*>& types() {return types_;}
-
- //Called from VConfigLoader
- static void load(VProperty*);
-
- virtual QString toolTip(QStringList d) const {return QString();}
-
- static int absIndexOf(const VAttribute*,AttributeFilter *filter=0);
- int indexOf(const VAttribute*);
- virtual int indexOf(const VNode* vnode,QStringList data) const=0;
- bool exists(const VNode* vnode,QStringList data) { return (indexOf(vnode,data) != -1); }
-
- void items(const VNode* vnode,QList<VItemTmp_ptr>& lst);
- static void items(const std::string& type,const VNode* vnode,QList<VItemTmp_ptr>& lst);
- VItemTmp_ptr item(const VNode*,const std::string&);
- virtual bool itemData(const VNode*,int index,QStringList&)=0;
-
- int id() const {return id_;}
+ static const std::vector<VAttributeType*>& types() {return types_;}
+ int typeId() const {return typeId_;}
int keyToDataIndex(const std::string& key) const;
int searchKeyToDataIndex(const std::string& key) const;
QStringList searchKeys() const;
+ virtual QString toolTip(QStringList d) const {return QString();}
+
+ static void scan(VNode* vnode,std::vector<VAttribute*>& v);
+ typedef void (*ScanProc) (VNode* vnode,std::vector<VAttribute*>& vec);
+ ScanProc scanProc() {return scanProc_;}
+
+ //Called from VConfigLoader
+ static void load(VProperty*);
protected:
- virtual void itemNames(const VNode* node,std::vector<std::string>&)=0;
- virtual bool getData(VNode *vnode,int row,int& totalRow,QStringList& data)=0;
- virtual int num(const VNode* vnode)=0;
- virtual int lineNum(const VNode* vnode,int row) {return 1;}
+ explicit VAttributeType(const std::string& name);
+ typedef std::vector<VAttributeType*>::const_iterator TypeIterator;
std::map<std::string,int> keyToData_;
std::map<std::string,int> searchKeyToData_;
int dataCount_;
- int id_;
+ int typeId_;
+ ScanProc scanProc_;
private:
static std::map<std::string,VAttributeType*> typesMap_;
diff --git a/Viewer/src/VConfig.cpp b/Viewer/src/VConfig.cpp
index 0371ac1..a2c11f7 100644
--- a/Viewer/src/VConfig.cpp
+++ b/Viewer/src/VConfig.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -521,11 +521,11 @@ bool VConfig::readRcFile(const std::string& rcFile,boost::property_tree::ptree&
else if(par[0] == "suites")
{
boost::property_tree::ptree suites;
- suites.push_back(std::make_pair("",par[1]));
+ suites.push_back(std::make_pair(std::string(""),boost::property_tree::ptree(par[1])));
for(unsigned int j=1; j < vec.size(); j++)
{
- suites.push_back(std::make_pair("",vec.at(j)));
+ suites.push_back(std::make_pair(std::string(""),boost::property_tree::ptree(vec.at(j))));
}
pt.put_child("suite_filter.suites",suites);
diff --git a/Viewer/src/VConfig.hpp b/Viewer/src/VConfig.hpp
index 9bbee0c..d8343ee 100644
--- a/Viewer/src/VConfig.hpp
+++ b/Viewer/src/VConfig.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -30,10 +30,10 @@ public:
static VConfig* instance();
- const std::string& appName() {return appName_;}
- const std::string& appLongName() {return appLongName_;}
+ const std::string& appName() const {return appName_;}
+ const std::string& appLongName() const {return appLongName_;}
void init(const std::string& parDir);
- const std::vector<VProperty*>& groups() {return groups_;}
+ const std::vector<VProperty*>& groups() const {return groups_;}
VProperty* find(const std::string& path);
VProperty* cloneServerGui(VProperty *linkTarget);
diff --git a/Viewer/src/VConfigLoader.cpp b/Viewer/src/VConfigLoader.cpp
index 87ecb70..7bece06 100644
--- a/Viewer/src/VConfigLoader.cpp
+++ b/Viewer/src/VConfigLoader.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VConfigLoader.hpp b/Viewer/src/VConfigLoader.hpp
index 688687f..6f52206 100644
--- a/Viewer/src/VConfigLoader.hpp
+++ b/Viewer/src/VConfigLoader.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VDateAttr.cpp b/Viewer/src/VDateAttr.cpp
new file mode 100644
index 0000000..2246da4
--- /dev/null
+++ b/Viewer/src/VDateAttr.cpp
@@ -0,0 +1,151 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "VDateAttr.hpp"
+#include "VAttributeType.hpp"
+#include "VNode.hpp"
+
+#include "DateAttr.hpp"
+#include "DayAttr.hpp"
+
+//================================
+// VDateAttrType
+//================================
+
+class VDateAttrType : public VAttributeType
+{
+public:
+ explicit VDateAttrType();
+ QString toolTip(QStringList d) const;
+ void encode(const DateAttr& d,QStringList& data);
+ void encode(const DayAttr& d,QStringList& data);
+
+private:
+ enum DataIndex {TypeIndex=0,NameIndex=1};
+};
+
+
+VDateAttrType::VDateAttrType() : VAttributeType("date")
+{
+ dataCount_=2;
+ searchKeyToData_["date_name"]=NameIndex;
+ searchKeyToData_["name"]=NameIndex;
+ scanProc_=VDateAttr::scan;
+}
+
+QString VDateAttrType::toolTip(QStringList d) const
+{
+ QString t="<b>Type:</b> Date<br>";
+ if(d.count() == dataCount_)
+ {
+ t+="<b>Name:</b> " + d[NameIndex];
+ }
+ return t;
+}
+
+void VDateAttrType::encode(const DateAttr& d,QStringList& data)
+{
+ data << qName_ << QString::fromStdString(d.name());
+}
+
+void VDateAttrType::encode(const DayAttr& d,QStringList& data)
+{
+ data << qName_ << QString::fromStdString(d.name());
+}
+
+static VDateAttrType atype;
+
+//=====================================================
+//
+// VDateAttr
+//
+//=====================================================
+
+VDateAttr::VDateAttr(VNode *parent,const DateAttr& t, int index) :
+ VAttribute(parent,index),
+ dataType_(DateData)
+{
+ //name_=t.name();
+}
+
+VDateAttr::VDateAttr(VNode *parent,const DayAttr& t, int index) :
+ VAttribute(parent,index),
+ dataType_(DayData)
+{
+ //name_=t.name();
+}
+
+VAttributeType* VDateAttr::type() const
+{
+ return &atype;
+}
+
+QStringList VDateAttr::data() const
+{
+ QStringList s;
+ if(parent_->node_)
+ {
+ if(dataType_ == DateData)
+ {
+ const std::vector<DateAttr>& v=parent_->node_->dates();
+ if(index_ < v.size())
+ atype.encode(v[index_],s);
+ }
+ else if(dataType_ == DayData)
+ {
+ const std::vector<DayAttr>& v=parent_->node_->days();
+ if(index_ < v.size())
+ atype.encode(v[index_],s);
+ }
+ }
+ return s;
+}
+
+std::string VDateAttr::strName() const
+{
+ if(parent_->node_)
+ {
+ if(dataType_ == DateData)
+ {
+ const std::vector<DateAttr>& v=parent_->node_->dates();
+ if(index_ < v.size())
+ return v[index_].name();
+ }
+ else if(dataType_ == DayData)
+ {
+ const std::vector<DayAttr>& v=parent_->node_->days();
+ if(index_ < v.size())
+ return v[index_].name();
+ }
+ }
+ return std::string();
+}
+
+void VDateAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
+{
+ if(vnode->node_)
+ {
+ const std::vector<DateAttr>& dateV=vnode->node_->dates();
+ const std::vector<DayAttr>& dayV=vnode->node_->days();
+
+ int n=dateV.size();
+ for(size_t i=0; i < n; i++)
+ {
+ vec.push_back(new VDateAttr(vnode,dateV[i],i));
+ }
+
+ n=dayV.size();
+ for(size_t i=0; i < n; i++)
+ {
+ vec.push_back(new VDateAttr(vnode,dayV[i],i));
+ }
+ }
+}
+
diff --git a/Viewer/src/VDateAttr.hpp b/Viewer/src/VDateAttr.hpp
new file mode 100644
index 0000000..d72143f
--- /dev/null
+++ b/Viewer/src/VDateAttr.hpp
@@ -0,0 +1,45 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#ifndef VDATE_HPP
+#define VDATE_HPP
+
+#include "VAttribute.hpp"
+
+#include <QStringList>
+#include <vector>
+
+class AttributeFilter;
+class VAttributeType;
+class VNode;
+
+class DateAttr;
+class DayAttr;
+
+class VDateAttr : public VAttribute
+{
+
+public:
+ enum DataType {DateData,DayData};
+
+ VDateAttr(VNode *parent,const DateAttr&,int index);
+ VDateAttr(VNode *parent,const DayAttr&,int index);
+
+ VAttributeType* type() const;
+ QStringList data() const;
+ std::string strName() const;
+
+ static void scan(VNode* vnode,std::vector<VAttribute*>& vec);
+
+protected:
+ DataType dataType_;
+};
+
+#endif // VDATE_HPP
diff --git a/Viewer/src/VDir.cpp b/Viewer/src/VDir.cpp
index aafd761..7c49a3b 100644
--- a/Viewer/src/VDir.cpp
+++ b/Viewer/src/VDir.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VDir.hpp b/Viewer/src/VDir.hpp
index 5fa6081..3c98069 100644
--- a/Viewer/src/VDir.hpp
+++ b/Viewer/src/VDir.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VEventAttr.cpp b/Viewer/src/VEventAttr.cpp
new file mode 100644
index 0000000..2cf4c1f
--- /dev/null
+++ b/Viewer/src/VEventAttr.cpp
@@ -0,0 +1,112 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "VEventAttr.hpp"
+#include "VAttributeType.hpp"
+#include "VNode.hpp"
+
+#include "NodeAttr.hpp"
+
+//================================
+// VEventAttrType
+//================================
+
+class VEventAttrType : public VAttributeType
+{
+public:
+ explicit VEventAttrType();
+ QString toolTip(QStringList d) const;
+ void encode(const Event&,QStringList&) const;
+
+private:
+ enum DataIndex {TypeIndex=0,NameIndex=1,ValueIndex=2};
+};
+
+
+VEventAttrType::VEventAttrType() : VAttributeType("event")
+{
+ dataCount_=3;
+ searchKeyToData_["event_name"]=NameIndex;
+ searchKeyToData_["event_value"]=ValueIndex;
+ searchKeyToData_["name"]=NameIndex;
+ scanProc_=VEventAttr::scan;
+}
+
+QString VEventAttrType::toolTip(QStringList d) const
+{
+ QString t="<b>Type:</b> Event<br>";
+ if(d.count() == dataCount_)
+ {
+ t+="<b>Name:</b> " + d[NameIndex] + "<br>";
+ t+="<b>Status:</b> ";
+ t+=(d[ValueIndex] == "1")?"set (true)":"clear (false)";
+
+ }
+ return t;
+}
+
+void VEventAttrType::encode(const Event& e,QStringList& data) const
+{
+ data << qName_ <<
+ QString::fromStdString(e.name_or_number()) <<
+ QString::number((e.value()==true)?1:0);
+}
+
+static VEventAttrType atype;
+
+//=====================================================
+//
+// VEventAttr
+//
+//=====================================================
+
+VEventAttr::VEventAttr(VNode *parent,const Event& e, int index) : VAttribute(parent,index)
+{
+ //name_=e.name_or_number();
+}
+
+VAttributeType* VEventAttr::type() const
+{
+ return &atype;
+}
+
+QStringList VEventAttr::data() const
+{
+ QStringList s;
+ if(node_ptr node=parent_->node_)
+ {
+ const std::vector<Event>& v=parent_->node_->events();
+ atype.encode(v[index_],s);
+ }
+ return s;
+}
+
+std::string VEventAttr::strName() const
+{
+ if(parent_->node_)
+ {
+ const std::vector<Event>& v=parent_->node_->events();
+ return v[index_].name_or_number();
+ }
+ return std::string();
+}
+
+void VEventAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
+{
+ if(vnode->node_)
+ {
+ const std::vector<Event>& v=vnode->node_->events();
+ int n=v.size();
+ for(size_t i=0; i < n; i++)
+ {
+ vec.push_back(new VEventAttr(vnode,v[i],i));
+ }
+ }
+}
diff --git a/Viewer/src/FileWatcher.hpp b/Viewer/src/VEventAttr.hpp
similarity index 53%
copy from Viewer/src/FileWatcher.hpp
copy to Viewer/src/VEventAttr.hpp
index 2e33bf6..459b343 100644
--- a/Viewer/src/FileWatcher.hpp
+++ b/Viewer/src/VEventAttr.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -8,30 +8,31 @@
//
//============================================================================
-#ifndef VIEWER_SRC_FILEWATCHER_HPP_
-#define VIEWER_SRC_FILEWATCHER_HPP_
+#ifndef VEVENT_HPP
+#define VEVENT_HPP
+
+#include "VAttribute.hpp"
-#include <QFileSystemWatcher>
-#include <QFile>
#include <QStringList>
+#include <string>
+#include <vector>
-class FileWatcher : public QFileSystemWatcher
-{
-Q_OBJECT
+class AttributeFilter;
+class VAttributeType;
+class VNode;
-public:
- FileWatcher(const std::string& filePath,qint64 offset,QObject* parent);
+class Event;
-protected Q_SLOTS:
- void slotChanged(const QString& path);
+class VEventAttr : public VAttribute
+{
+public:
+ VEventAttr(VNode *parent,const Event&,int index);
-Q_SIGNALS:
- void linesAppended(QStringList);
+ VAttributeType* type() const;
+ QStringList data() const;
+ std::string strName() const;
-protected:
- QFile file_;
- qint64 offset_;
+ static void scan(VNode* vnode,std::vector<VAttribute*>& vec);
};
-
-#endif /* VIEWER_SRC_FILEWATCHER_HPP_ */
+#endif // VEVENT_HPP
diff --git a/Viewer/src/VFile.cpp b/Viewer/src/VFile.cpp
index a92a8bb..0963865 100644
--- a/Viewer/src/VFile.cpp
+++ b/Viewer/src/VFile.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -31,6 +31,7 @@ VFile::VFile(const std::string& name,const std::string& str,bool deleteFile) :
fp_(0),
fetchMode_(NoFetchMode),
transferDuration_(0),
+ truncatedTo_(0),
cached_(false)
{
std::ofstream f(path_.c_str());
@@ -50,6 +51,7 @@ VFile::VFile(const std::string& name,bool deleteFile) :
fp_(0),
fetchMode_(NoFetchMode),
transferDuration_(0),
+ truncatedTo_(0),
cached_(false)
{
}
@@ -63,6 +65,7 @@ VFile::VFile(bool deleteFile) :
fp_(0),
fetchMode_(NoFetchMode),
transferDuration_(0),
+ truncatedTo_(0),
cached_(false)
{
}
diff --git a/Viewer/src/VFile.hpp b/Viewer/src/VFile.hpp
index 9fcd497..da54165 100644
--- a/Viewer/src/VFile.hpp
+++ b/Viewer/src/VFile.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VFileInfo.cpp b/Viewer/src/VFileInfo.cpp
index d96a647..5020991 100644
--- a/Viewer/src/VFileInfo.cpp
+++ b/Viewer/src/VFileInfo.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VFileInfo.hpp b/Viewer/src/VFileInfo.hpp
index 2df8590..edc9b87 100644
--- a/Viewer/src/VFileInfo.hpp
+++ b/Viewer/src/VFileInfo.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VFilter.cpp b/Viewer/src/VFilter.cpp
index 228d3ad..893ef50 100644
--- a/Viewer/src/VFilter.cpp
+++ b/Viewer/src/VFilter.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -11,6 +11,7 @@
#include "NodeQuery.hpp"
#include "NodeQueryEngine.hpp"
+#include "UIDebug.hpp"
#include "UiLog.hpp"
#include "VNState.hpp"
#include "VAttribute.hpp"
@@ -37,31 +38,53 @@
//
//==============================================
-VParamSet::VParamSet()
+VParamSet::VParamSet() : empty_(true), complete_(false)
{
}
void VParamSet::init(const std::vector<VParam*>& items)
{
- for(std::vector<VParam*>::const_iterator it=items.begin(); it != items.end(); ++it)
- {
- all_.insert((*it));
- }
+ all_=items;
+
+ int maxId=0;
+ for(std::vector<VParam*>::const_iterator it=all_.begin(); it != all_.end(); ++it)
+ {
+ if(static_cast<int>((*it)->id()) > maxId)
+ maxId=(*it)->id();
+ }
+
+ if(maxId > 0)
+ {
+ currentCache_.resize(maxId+1,0);
+ for(std::vector<VParam*>::const_iterator it=all_.begin(); it != all_.end(); ++it)
+ {
+ currentCache_[(*it)->id()]=1;
+ }
+ }
- current_=all_;
+ setCurrent(all_,false);
}
+//This has to be very fast. Called a millions of times!
bool VParamSet::isSet(VParam* p) const
{
- if(!p)
- return false;
+ //assert(p);
+ //return (current_.find(p) != current_.end());
+ //return std::find(current_.begin(),current_.end(),p) != current_.end();
+
+ //for(size_t i=0; i < current_.size(); i++)
+ // if(current_[i] == p)
+ // return true;
+
+ //return true;
+ return (currentCache_[p->id()]==0)?false:true;
- return (current_.find(p) != current_.end());
+ //return false;
}
bool VParamSet::isSet(const std::string &name) const
{
- for(std::set<VParam*>::const_iterator it=current_.begin(); it != current_.end(); ++it)
+ for(std::vector<VParam*>::const_iterator it=current_.begin(); it != current_.end(); ++it)
{
if((*it)->strName() == name)
return true;
@@ -72,47 +95,78 @@ bool VParamSet::isSet(const std::string &name) const
QStringList VParamSet::currentAsList() const
{
QStringList lst;
- for(std::set<VParam*>::const_iterator it=current_.begin(); it != current_.end(); ++it)
+ for(std::vector<VParam*>::const_iterator it=current_.begin(); it != current_.end(); ++it)
{
lst << QString::fromStdString((*it)->strName());
}
return lst;
}
-void VParamSet::setCurrent(const std::set<VParam*>& items)
+void VParamSet::clearCurrent()
{
- current_.clear();
- for(std::set<VParam*>::const_iterator it=all_.begin(); it != all_.end(); ++it)
+ current_.clear();
+ std::fill(currentCache_.begin(), currentCache_.end(), 0);
+ empty_=true;
+ complete_=false;
+}
+
+void VParamSet::addToCurrent(VParam* p)
+{
+ current_.push_back(p);
+ uint id=p->id();
+ UI_ASSERT(id >=0 && id < currentCache_.size(),"id=" << id
+ << " currentCache_.size()=" << currentCache_.size());
+ currentCache_[id]=1;
+ empty_=false;
+ complete_=(current_.size() == all_.size());
+}
+
+void VParamSet::setCurrent(const std::vector<VParam*>& items,bool broadcast)
+{
+ clearCurrent();
+
+ for(std::vector<VParam*>::const_iterator it=all_.begin(); it != all_.end(); ++it)
{
- if(items.find(*it) != items.end())
- current_.insert(*it);
- }
+ if(std::find(all_.begin(),all_.end(),*it) != all_.end())
+ {
+ addToCurrent(*it);
+ }
+ }
- Q_EMIT changed();
+ if(broadcast)
+ Q_EMIT changed();
}
-void VParamSet::current(const std::set<std::string>& names)
+void VParamSet::setCurrent(const std::vector<std::string>& names,bool broadcast)
{
- current_.clear();
- for(std::set<VParam*>::const_iterator it=all_.begin(); it != all_.end(); ++it)
+ clearCurrent();
+
+ for(std::vector<VParam*>::const_iterator it=all_.begin(); it != all_.end(); ++it)
{
- if(names.find((*it)->strName()) != names.end())
- current_.insert(*it);
+ if(std::find(names.begin(),names.end(),(*it)->strName()) != names.end())
+ {
+ addToCurrent(*it);
+ }
}
- Q_EMIT changed();
+ if(broadcast)
+ Q_EMIT changed();
}
-void VParamSet::setCurrent(QStringList names)
+void VParamSet::setCurrent(QStringList names,bool broadcast)
{
- current_.clear();
- for(std::set<VParam*>::const_iterator it=all_.begin(); it != all_.end(); ++it)
+ clearCurrent();
+
+ for(std::vector<VParam*>::const_iterator it=all_.begin(); it != all_.end(); ++it)
{
- if(names.contains(QString::fromStdString((*it)->strName())))
- current_.insert(*it);
+ if(names.contains(QString::fromStdString((*it)->strName())))
+ {
+ addToCurrent(*it);
+ }
}
- Q_EMIT changed();
+ if(broadcast)
+ Q_EMIT changed();
}
@@ -126,7 +180,7 @@ void VParamSet::writeSettings(VSettings *vs)
}
else
{
- for(std::set<VParam*>::const_iterator it=current_.begin(); it != current_.end(); ++it)
+ for(std::vector<VParam*>::const_iterator it=current_.begin(); it != current_.end(); ++it)
{
array.push_back((*it)->strName());
}
@@ -137,7 +191,7 @@ void VParamSet::writeSettings(VSettings *vs)
void VParamSet::readSettings(VSettings* vs)
{
- current_.clear();
+ clearCurrent();
std::vector<std::string> array;
@@ -148,7 +202,7 @@ void VParamSet::readSettings(VSettings* vs)
vs->get(settingsIdV0_,array);
if(array.empty())
{
- current_=all_;
+ setCurrent(all_,false);
return;
}
}
@@ -163,14 +217,14 @@ void VParamSet::readSettings(VSettings* vs)
std::string name=*it;
if(name == "_ALL_")
{
- current_=all_;
+ setCurrent(all_,false);
return;
}
- for(std::set<VParam*>::const_iterator itA=all_.begin(); itA != all_.end(); ++itA)
+ for(std::vector<VParam*>::const_iterator itA=all_.begin(); itA != all_.end(); ++itA)
{
if((*itA)->strName() == name)
- current_.insert(*itA);
+ addToCurrent(*itA);
}
}
}
@@ -220,9 +274,9 @@ bool AttributeFilter::matchForceShowAttr(const VNode *n,VAttributeType* t) const
return false;
}
-void AttributeFilter::setForceShowAttr(const VAttribute* a)
+void AttributeFilter::setForceShowAttr(VAttribute* a)
{
- forceShowAttr_=VInfoAttribute::create(a->clone());
+ forceShowAttr_=VInfoAttribute::create(a);
}
VAttribute* AttributeFilter::forceShowAttr() const
@@ -235,6 +289,18 @@ void AttributeFilter::clearForceShowAttr()
forceShowAttr_.reset();
}
+void AttributeFilter::updateForceShowAttr()
+{
+ if(forceShowAttr_)
+ {
+ forceShowAttr_->regainData();
+ if(forceShowAttr_->hasData())
+ {
+ forceShowAttr_.reset();
+ }
+ }
+}
+
//==============================================
//
// IconFilter
@@ -247,7 +313,6 @@ IconFilter::IconFilter() : VParamSet()
settingsIdV0_="icon";
std::vector<VParam*> v=VIcon::filterItems();
init(v);
- current_=all_;
}
void IconFilter::readSettings(VSettings* vs)
@@ -268,17 +333,17 @@ void IconFilter::readSettings(VSettings* vs)
//It could be only a one-time problem for users who already set theit icon filter.
if(lastNames.empty())
{
- current_=all_;
+ setCurrent(all_,false);
}
else
{
//Check which icons are not in lastNames
- for(std::set<VParam*>::const_iterator itA=all_.begin(); itA != all_.end(); ++itA)
+ for(std::vector<VParam*>::const_iterator itA=all_.begin(); itA != all_.end(); ++itA)
{
//The item is not in lastNames so it must be a newly added icon type. We add it to the filter list
if(std::find(lastNames.begin(),lastNames.end(),(*itA)->strName()) == lastNames.end())
{
- current_.insert(*itA);
+ addToCurrent(*itA);
}
}
}
@@ -372,6 +437,10 @@ void NodeFilter::clear()
void NodeFilter::setForceShowNode(VNode* n)
{
forceShowNode_=n;
+#ifdef _UI_VFILTER_DEBUG
+ if(forceShowNode_)
+ UiLog(server_).dbg() << "NodeFilter::setForceShowNode --> " << forceShowNode_->absNodePath();
+#endif
}
void NodeFilter::clearForceShowNode()
@@ -723,9 +792,9 @@ bool TableNodeFilter::update()
}
#ifdef _UI_VFILTER_DEBUG
- UiLog(server_).dbg() << " elapsed time: " + timer.elapsed() << " ms";
- UiLog(server_).dbg() << " filter size: " + match_.size();
- UiLog(server_).dbg() << " capacity: " + match_.capacity();
+ UiLog(server_).dbg() << " elapsed time: " << timer.elapsed() << " ms";
+ UiLog(server_).dbg() << " filter size: " << match_.size();
+ UiLog(server_).dbg() << " capacity: " << match_.capacity();
#endif
return true;
diff --git a/Viewer/src/VFilter.hpp b/Viewer/src/VFilter.hpp
index 49625c9..45d9c81 100644
--- a/Viewer/src/VFilter.hpp
+++ b/Viewer/src/VFilter.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -42,15 +42,15 @@ public:
VParamSet();
virtual ~VParamSet() {}
- const std::set<VParam*>& current() const {return current_;}
- void setCurrent(const std::set<VParam*>&);
- QStringList currentAsList() const;
- void current(const std::set<std::string>&);
- void setCurrent(QStringList);
- const std::set<VParam*>& all() const {return all_;}
+ const std::vector<VParam*>& all() const {return all_;}
+ const std::vector<VParam*>& current() const {return current_;}
+ QStringList currentAsList() const;
+ void setCurrent(const std::vector<VParam*>&,bool broadcast=true);
+ void setCurrent(const std::vector<std::string>&,bool broadcast=true);
+ void setCurrent(QStringList,bool broadcast=true);
- bool isEmpty() const {return current_.empty();}
- bool isComplete() const { return all_.size() == current_.size();}
+ bool isEmpty() const {return empty_;}
+ bool isComplete() const { return complete_;}
bool isSet(const std::string&) const;
bool isSet(VParam*) const;
@@ -62,11 +62,19 @@ Q_SIGNALS:
protected:
void init(const std::vector<VParam*>& items);
+ void addToCurrent(VParam*);
- std::set<VParam*> all_;
- std::set<VParam*> current_;
+ std::vector<VParam*> all_;
+ std::vector<VParam*> current_;
std::string settingsId_;
std::string settingsIdV0_;
+
+private:
+ void clearCurrent();
+
+ std::vector<int> currentCache_; //we use to speed up the check in isSet()
+ bool empty_;
+ bool complete_;
};
class NodeStateFilter : public VParamSet
@@ -80,8 +88,9 @@ class AttributeFilter : public VParamSet
public:
AttributeFilter();
bool matchForceShowAttr(const VNode*,VAttributeType*) const;
- void setForceShowAttr(const VAttribute* a);
+ void setForceShowAttr(VAttribute* a);
void clearForceShowAttr();
+ void updateForceShowAttr();
VAttribute* forceShowAttr() const;
private:
diff --git a/Viewer/src/VGenVarAttr.cpp b/Viewer/src/VGenVarAttr.cpp
new file mode 100644
index 0000000..3ab9d81
--- /dev/null
+++ b/Viewer/src/VGenVarAttr.cpp
@@ -0,0 +1,109 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "VGenVarAttr.hpp"
+#include "VAttributeType.hpp"
+#include "VNode.hpp"
+
+#include "NodeAttr.hpp"
+
+//================================
+// VGenVarAttrType
+//================================
+
+class VGenVarAttrType : public VAttributeType
+{
+public:
+ explicit VGenVarAttrType();
+ QString toolTip(QStringList d) const;
+ void encode(const Variable&,QStringList&) const;
+
+private:
+ enum DataIndex {TypeIndex=0,NameIndex=1,ValueIndex=2};
+};
+
+
+VGenVarAttrType::VGenVarAttrType() : VAttributeType("genvar")
+{
+ dataCount_=3;
+ searchKeyToData_["var_name"]=NameIndex;
+ searchKeyToData_["var_value"]=ValueIndex;
+ searchKeyToData_["var_type"]=TypeIndex;
+ searchKeyToData_["name"]=NameIndex;
+ scanProc_=VGenVarAttr::scan;
+}
+
+QString VGenVarAttrType::toolTip(QStringList d) const
+{
+ return QString();
+}
+
+void VGenVarAttrType::encode(const Variable& v,QStringList& data) const
+{
+ data << qName_ <<
+ QString::fromStdString(v.name()) <<
+ QString::fromStdString(v.theValue());
+}
+
+static VGenVarAttrType atype;
+
+//=====================================================
+//
+// VGenVarAttr
+//
+//=====================================================
+
+VGenVarAttr::VGenVarAttr(VNode *parent,const Variable& v, int index) : VAttribute(parent,index)
+{
+ //name_=v.name();
+}
+
+VAttributeType* VGenVarAttr::type() const
+{
+ return &atype;
+}
+
+QStringList VGenVarAttr::data() const
+{
+ QStringList s;
+ if(parent_->isServer() == 0)
+ {
+ std::vector<Variable> v;
+ parent_->genVariables(v);
+ atype.encode(v[index_],s);
+ }
+ return s;
+}
+
+std::string VGenVarAttr::strName() const
+{
+ if(parent_->isServer() == 0)
+ {
+ std::vector<Variable> v;
+ parent_->genVariables(v);
+ return v[index_].name();
+ }
+ return std::string();
+}
+
+void VGenVarAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
+{
+ if(vnode->isServer() == 0)
+ {
+ std::vector<Variable> v;
+ vnode->genVariables(v);
+ int n=v.size();
+ for(size_t i=0; i < n; i++)
+ {
+ vec.push_back(new VGenVarAttr(vnode,v[i],i));
+ }
+ }
+}
+
diff --git a/Viewer/src/FileWatcher.hpp b/Viewer/src/VGenVarAttr.hpp
similarity index 53%
copy from Viewer/src/FileWatcher.hpp
copy to Viewer/src/VGenVarAttr.hpp
index 2e33bf6..6606a13 100644
--- a/Viewer/src/FileWatcher.hpp
+++ b/Viewer/src/VGenVarAttr.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -8,30 +8,31 @@
//
//============================================================================
-#ifndef VIEWER_SRC_FILEWATCHER_HPP_
-#define VIEWER_SRC_FILEWATCHER_HPP_
+#ifndef VGENVARATTR_HPP
+#define VGENVARATTR_HPP
+
+#include "VAttribute.hpp"
-#include <QFileSystemWatcher>
-#include <QFile>
#include <QStringList>
+#include <string>
+#include <vector>
-class FileWatcher : public QFileSystemWatcher
-{
-Q_OBJECT
+class AttributeFilter;
+class VAttributeType;
+class VNode;
+class Variable;
+class VGenVarAttr : public VAttribute
+{
public:
- FileWatcher(const std::string& filePath,qint64 offset,QObject* parent);
-
-protected Q_SLOTS:
- void slotChanged(const QString& path);
+ VGenVarAttr(VNode *parent,const Variable&,int index);
-Q_SIGNALS:
- void linesAppended(QStringList);
+ VAttributeType* type() const;
+ QStringList data() const;
+ std::string strName() const;
-protected:
- QFile file_;
- qint64 offset_;
+ static void scan(VNode* vnode,std::vector<VAttribute*>& vec);
};
+#endif // VGENVARATTR_HPP
-#endif /* VIEWER_SRC_FILEWATCHER_HPP_ */
diff --git a/Viewer/src/VIcon.cpp b/Viewer/src/VIcon.cpp
index e7bc6f5..22779e9 100644
--- a/Viewer/src/VIcon.cpp
+++ b/Viewer/src/VIcon.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -216,7 +216,7 @@ QVariantList VIcon::pixmapList(VNode *vnode,VParamSet *filter)
{
VIcon *v=*it;
- if(!filter || filter->current().find(v) != filter->current().end())
+ if(!filter || filter->isSet(v))
{
if(v->show(vnode))
{
@@ -228,9 +228,32 @@ QVariantList VIcon::pixmapList(VNode *vnode,VParamSet *filter)
return lst;
}
+//Create the pixmap containing all the relevant icons for the given node according to the filter.
+int VIcon::pixmapNum(VNode *vnode,VParamSet *filter)
+{
+ if(!vnode)
+ return 0;
+
+ int ret=0;
+
+ for(std::vector<VIcon*>::const_iterator it=itemsVec_.begin(); it != itemsVec_.end(); ++it)
+ {
+ VIcon *v=*it;
+ if(!filter || filter->isSet(v))
+ {
+ if(v->show(vnode))
+ {
+ ret++;
+ }
+ }
+ }
+ return ret;
+}
+
+
QString VIcon::toolTip(VNode *vnode,VParamSet *filter)
{
- if(filter->isEmpty())
+ if(!filter || filter->isEmpty())
return QString();
int iconSize=16;
@@ -240,7 +263,7 @@ QString VIcon::toolTip(VNode *vnode,VParamSet *filter)
{
VIcon *v=*it;
- if(!filter || filter->current().find(v) != filter->current().end())
+ if(!filter || filter->isSet(v))
{
if(v->show(vnode))
{
diff --git a/Viewer/src/VIcon.hpp b/Viewer/src/VIcon.hpp
index d1f31ca..7194a3f 100644
--- a/Viewer/src/VIcon.hpp
+++ b/Viewer/src/VIcon.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -33,6 +33,7 @@ public:
static std::vector<VParam*> filterItems();
static QVariantList pixmapList(VNode *vnode,VParamSet *filter);
+ static int pixmapNum(VNode *vnode,VParamSet *filter);
static QString toolTip(VNode *vnode,VParamSet *filter);
static VIcon* find(const std::string& name);
static void names(std::vector<std::string>&);
diff --git a/Viewer/src/VInfo.cpp b/Viewer/src/VInfo.cpp
index b8036be..4dd8674 100644
--- a/Viewer/src/VInfo.cpp
+++ b/Viewer/src/VInfo.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -58,7 +58,6 @@ void VInfo::notifyServerDelete(ServerHandler* /*server*/)
server_=0;
node_=0;
- if(attr_) delete attr_;
attr_=0;
dataLost();
@@ -80,15 +79,13 @@ void VInfo::notifyBeginServerClear(ServerHandler* server)
{
assert(server_==server);
node_=0;
- if(attr_) delete attr_;
attr_=0;
}
void VInfo::notifyEndServerClear(ServerHandler* server)
{
assert(server_==server);
- node_=0;
- if(attr_) delete attr_;
+ node_=0;
attr_=0;
}
@@ -106,38 +103,42 @@ void VInfo::regainData()
return;
}
- if(node_)
- return;
-
- if(isServer())
+ if(!node_)
{
- node_=server_->vRoot();
- return;
- }
- else if(isNode())
- {
- VItemPathParser p(storedPath_);
- if(p.itemType() == VItemPathParser::NodeType)
+ if(isServer())
{
- node_=server_->vRoot()->find(p.node());
- if(node_)
- return;
+ node_=server_->vRoot();
+ return;
}
- if(!node_)
+ else if(isNode())
{
- dataLost();
- return;
+ VItemPathParser p(storedPath_);
+ if(p.itemType() == VItemPathParser::NodeType)
+ {
+ node_=server_->vRoot()->find(p.node());
+ if(node_)
+ return;
+ }
+ if(!node_)
+ {
+ dataLost();
+ return;
+ }
}
- }
- else if(isAttribute())
- {
- VItemPathParser p(storedPath_);
- if(p.itemType() == VItemPathParser::AttributeType)
- {
- node_=server_->vRoot()->find(p.node());
+ }
+
+ if(isAttribute())
+ {
+ VItemPathParser p(storedPath_);
+ if(p.itemType() == VItemPathParser::AttributeType)
+ {
+ if(!node_)
+ {
+ node_=server_->vRoot()->find(p.node());
+ }
if(node_)
{
- attr_=VAttribute::make(node_,p.type(),p.attribute());
+ attr_=node_->findAttribute(p.type(),p.attribute());
}
if(!node_ || !attr_)
{
@@ -173,7 +174,7 @@ bool VInfo::operator ==(const VInfo& other)
storedPath_ == other.storedPath_)
{
if((!attr_ && other.attr_) ||
- (attr_ && !attr_))
+ (attr_ && !other.attr_))
return false;
else if(attr_ && other.attr_)
@@ -219,25 +220,40 @@ VInfo_ptr VInfo::createFromPath(ServerHandler* s,const std::string& path)
}
else if(p.itemType() == VItemPathParser::NodeType)
{
- VNode* n=s->vRoot()->find(p.node());
- return VInfoNode::create(n);
+ if(VNode* n=s->vRoot()->find(p.node()))
+ return VInfoNode::create(n);
}
else if(p.itemType() == VItemPathParser::AttributeType)
{
if(VNode* n=s->vRoot()->find(p.node()))
{
- if(VAttribute* a=VAttribute::make(n,p.type(),p.attribute()))
+ if(VAttribute* a=n->findAttribute(p.type(),p.attribute()))
{
return VInfoAttribute::create(a);
}
}
-
}
return VInfo_ptr();
}
+VInfo_ptr VInfo::createFromPath(const std::string& path)
+{
+ if(path.empty())
+ return VInfo_ptr();
+
+ VItemPathParser p(path);
+ if(!p.server().empty())
+ {
+ if(ServerHandler* s=ServerHandler::find(p.server()))
+ {
+ return createFromPath(s,path);
+ }
+ }
+ return VInfo_ptr();
+}
+
//=========================================
//
// VInfoServer
@@ -249,7 +265,7 @@ VInfoServer::VInfoServer(ServerHandler *server) : VInfo(server,NULL)
if(server_)
{
node_=server_->vRoot();
- storedPath_="";
+ storedPath_=VItemPathParser::encodeWithServer(server_->name(),"/","server");
}
}
@@ -293,7 +309,10 @@ VItem* VInfoServer::item() const
VInfoNode::VInfoNode(ServerHandler* server,VNode* node) : VInfo(server,node)
{
if(node_)
- storedPath_=VItemPathParser::encode(node_->absNodePath(),"node");
+ {
+ assert(server_);
+ storedPath_=VItemPathParser::encodeWithServer(server_->name(),node_->absNodePath(),"node");
+ }
}
VInfo_ptr VInfoNode::create(VNode *node)
@@ -368,13 +387,15 @@ VInfoAttribute::VInfoAttribute(ServerHandler* server,VNode* node,VAttribute* att
VInfo(server,node,attr)
{
if(attr_)
- storedPath_=VItemPathParser::encode(attr_->fullPath(),attr_->typeName());
+ {
+ assert(server_);
+ storedPath_=VItemPathParser::encodeWithServer(server_->name(),
+ attr_->fullPath(),attr_->typeName());
+ }
}
VInfoAttribute::~VInfoAttribute()
{
- if(attr_)
- delete attr_;
}
bool VInfoAttribute::hasData() const
diff --git a/Viewer/src/VInfo.hpp b/Viewer/src/VInfo.hpp
index f8cc705..9eb0f47 100644
--- a/Viewer/src/VInfo.hpp
+++ b/Viewer/src/VInfo.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -63,8 +63,9 @@ public:
virtual std::string serverAlias() {return "";}
virtual std::string relativePath() {return "";}
std::string storedNodePath() const;
+ const std::string& storedPath() const {return storedPath_;}
- virtual void accept(VInfoVisitor*)=0;
+ virtual void accept(VInfoVisitor*)=0;
void regainData();
void addObserver(VInfoObserver*);
@@ -85,6 +86,7 @@ public:
static VInfo_ptr createParent(VInfo_ptr);
static VInfo_ptr createFromPath(ServerHandler*,const std::string&);
+ static VInfo_ptr createFromPath(const std::string& path);
protected:
VInfo(ServerHandler* server,VNode* node,VAttribute* attr=0);
diff --git a/Viewer/src/VItem.cpp b/Viewer/src/VItem.cpp
index 7619dda..a495861 100644
--- a/Viewer/src/VItem.cpp
+++ b/Viewer/src/VItem.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VItem.hpp b/Viewer/src/VItem.hpp
index eb30dd5..0fd74b1 100644
--- a/Viewer/src/VItem.hpp
+++ b/Viewer/src/VItem.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -14,7 +14,6 @@
#include <cstdlib>
#include <QString>
-
class ServerHandler;
class VNode;
class VServer;
@@ -32,8 +31,6 @@ public:
virtual ~VItem() {}
VNode* parent() const {return parent_;}
- //virtual ServerHandler* server() const;
- //node_ptr node() const {return node_;}
virtual VServer* isServer() const {return NULL;}
virtual VNode* isNode() const {return NULL;}
virtual VSuiteNode* isSuite() const {return NULL;}
diff --git a/Viewer/src/VItemPathParser.cpp b/Viewer/src/VItemPathParser.cpp
index 80fbed1..ff7351a 100644
--- a/Viewer/src/VItemPathParser.cpp
+++ b/Viewer/src/VItemPathParser.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -66,3 +66,10 @@ std::string VItemPathParser::encode(const std::string& path,const std::string& t
return "[" + type + "]" + path;
}
+std::string VItemPathParser::encodeWithServer(const std::string& server,const std::string& path,const std::string& type)
+{
+ if(type.empty())
+ return path;
+
+ return "[" + type + "]" + server + ":/" + path;
+}
diff --git a/Viewer/src/VItemPathParser.hpp b/Viewer/src/VItemPathParser.hpp
index 7cf6be3..17dc253 100644
--- a/Viewer/src/VItemPathParser.hpp
+++ b/Viewer/src/VItemPathParser.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -22,11 +22,13 @@ public:
ItemType itemType() const {return itemType_;}
const std::string type() const {return type_;}
- const std::string server() const {return type_;}
+ const std::string server() const {return server_;}
const std::string node() const {return node_;}
const std::string attribute() const {return attribute_;}
static std::string encode(const std::string& path,const std::string& type);
+ static std::string encodeWithServer(const std::string& server,const std::string& path,
+ const std::string& type);
protected:
ItemType itemType_;
diff --git a/Viewer/src/VItemTmp.hpp b/Viewer/src/VItemTmp.hpp
deleted file mode 100644
index c6503b7..0000000
--- a/Viewer/src/VItemTmp.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-//============================================================================
-// Copyright 2016 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not waive the privileges and immunities
-// granted to it by virtue of its status as an intergovernmental organisation
-// nor does it submit to any jurisdiction.
-//
-//============================================================================
-
-#ifndef VITEMTMP_HPP
-#define VITEMTMP_HPP
-
-#include <boost/shared_ptr.hpp>
-
-class VAttribute;
-class VItem;
-
-class VItemTmp;
-typedef boost::shared_ptr<VItemTmp> VItemTmp_ptr;
-
-class VItemTmp
-{
-public:
- ~VItemTmp();
-
- VItem* item() const {return item_;}
- VAttribute* attribute() const;
- static VItemTmp_ptr create(VItem* item) {return VItemTmp_ptr(new VItemTmp(item));}
-
-private:
- VItemTmp(VItem* item) : item_(item) {}
- VItem* item_;
-
-};
-
-#endif // VITEMTMP_HPP
-
diff --git a/Viewer/src/VLabelAttr.cpp b/Viewer/src/VLabelAttr.cpp
new file mode 100644
index 0000000..0bfc2ca
--- /dev/null
+++ b/Viewer/src/VLabelAttr.cpp
@@ -0,0 +1,131 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "VLabelAttr.hpp"
+#include "VAttributeType.hpp"
+#include "VNode.hpp"
+
+#include "NodeAttr.hpp"
+
+//================================
+// VLabelAttrType
+//================================
+
+class VLabelAttrType : public VAttributeType
+{
+public:
+ explicit VLabelAttrType();
+ QString toolTip(QStringList d) const;
+ void encode(const Label& label,QStringList& data) const;
+
+private:
+ enum DataIndex {TypeIndex=0,NameIndex=1,ValueIndex=2};
+};
+
+VLabelAttrType::VLabelAttrType() : VAttributeType("label")
+{
+ dataCount_=3;
+ searchKeyToData_["label_name"]=NameIndex;
+ searchKeyToData_["label_value"]=ValueIndex;
+ searchKeyToData_["name"]=NameIndex;
+ scanProc_=VLabelAttr::scan;
+}
+
+QString VLabelAttrType::toolTip(QStringList d) const
+{
+ QString t="<b>Type:</b> Label<br>";
+ if(d.count() == dataCount_)
+ {
+ t+="<b>Name:</b> " + d[NameIndex] + "<br>";
+ t+="<b>Value:</b> " + d[ValueIndex];
+ }
+ return t;
+}
+
+void VLabelAttrType::encode(const Label& label,QStringList& data) const
+{
+ std::string val=label.new_value();
+ if(val.empty() || val == " ")
+ {
+ val=label.value();
+ }
+
+ data << qName_ <<
+ QString::fromStdString(label.name()) <<
+ QString::fromStdString(val);
+}
+
+static VLabelAttrType atype;
+
+//=====================================================
+//
+// VLabelAttr
+//
+//=====================================================
+
+VLabelAttr::VLabelAttr(VNode *parent,const Label& label, int index) : VAttribute(parent,index)
+{
+ //name_=label.name();
+}
+
+int VLabelAttr::lineNum() const
+{
+ if(parent_->node_)
+ {
+ const std::vector<Label>& v=parent_->node_->labels();
+ std::string val=v[index_].new_value();
+ if(val.empty() || val == " ")
+ {
+ val=v[index_].value();
+ }
+ return std::count(val.begin(), val.end(), '\n')+1;
+ }
+
+ return 1;
+}
+
+VAttributeType* VLabelAttr::type() const
+{
+ return &atype;
+}
+
+QStringList VLabelAttr::data() const
+{
+ QStringList s;
+ if(parent_->node_)
+ {
+ const std::vector<Label>& v=parent_->node_->labels();
+ atype.encode(v[index_],s);
+ }
+ return s;
+}
+
+std::string VLabelAttr::strName() const
+{
+ if(parent_->node_)
+ {
+ const std::vector<Label>& v=parent_->node_->labels();
+ return v[index_].name();
+ }
+ return std::string();
+}
+
+void VLabelAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
+{
+ if(vnode->node_)
+ {
+ const std::vector<Label>& v=vnode->node_->labels();
+ int n=v.size();
+ for(size_t i=0; i < n; i++)
+ {
+ vec.push_back(new VLabelAttr(vnode,v[i],i));
+ }
+ }
+}
diff --git a/Viewer/src/FileWatcher.hpp b/Viewer/src/VLabelAttr.hpp
similarity index 52%
copy from Viewer/src/FileWatcher.hpp
copy to Viewer/src/VLabelAttr.hpp
index 2e33bf6..57b324f 100644
--- a/Viewer/src/FileWatcher.hpp
+++ b/Viewer/src/VLabelAttr.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -8,30 +8,32 @@
//
//============================================================================
-#ifndef VIEWER_SRC_FILEWATCHER_HPP_
-#define VIEWER_SRC_FILEWATCHER_HPP_
+#ifndef VLABEL_HPP
+#define VLABEL_HPP
+
+#include "VAttribute.hpp"
-#include <QFileSystemWatcher>
-#include <QFile>
#include <QStringList>
+#include <string>
+#include <vector>
-class FileWatcher : public QFileSystemWatcher
-{
-Q_OBJECT
+class AttributeFilter;
+class VAttributeType;
+class VNode;
-public:
- FileWatcher(const std::string& filePath,qint64 offset,QObject* parent);
+class Label;
-protected Q_SLOTS:
- void slotChanged(const QString& path);
+class VLabelAttr : public VAttribute
+{
+public:
+ VLabelAttr(VNode *parent,const Label&,int index);
-Q_SIGNALS:
- void linesAppended(QStringList);
+ int lineNum() const;
+ VAttributeType* type() const;
+ QStringList data() const;
+ std::string strName() const;
-protected:
- QFile file_;
- qint64 offset_;
+ static void scan(VNode* vnode,std::vector<VAttribute*>& vec);
};
-
-#endif /* VIEWER_SRC_FILEWATCHER_HPP_ */
+#endif // VLABEL_HPP
diff --git a/Viewer/src/VLateAttr.cpp b/Viewer/src/VLateAttr.cpp
new file mode 100644
index 0000000..a715990
--- /dev/null
+++ b/Viewer/src/VLateAttr.cpp
@@ -0,0 +1,98 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "VLateAttr.hpp"
+#include "VAttributeType.hpp"
+#include "VNode.hpp"
+
+#include "NodeAttr.hpp"
+
+//================================
+// VLateAttrType
+//================================
+
+class VLateAttrType : public VAttributeType
+{
+public:
+ explicit VLateAttrType();
+ QString toolTip(QStringList d) const;
+ void encode(ecf::LateAttr* late,QStringList& data) const;
+
+private:
+ enum DataIndex {TypeIndex=0,NameIndex=1};
+};
+
+
+VLateAttrType::VLateAttrType() : VAttributeType("late")
+{
+ dataCount_=2;
+ searchKeyToData_["late_name"]=NameIndex;
+ searchKeyToData_["late_type"]=TypeIndex;
+ searchKeyToData_["name"]=NameIndex;
+ scanProc_=VLateAttr::scan;
+}
+
+QString VLateAttrType::toolTip(QStringList d) const
+{
+ QString t="<b>Type:</b> Late<br>";
+ if(d.count() == dataCount_)
+ {
+ t+="<b>Name:</b> " + d[NameIndex];
+ }
+ return t;
+}
+
+void VLateAttrType::encode(ecf::LateAttr* late,QStringList& data) const
+{
+ if(late)
+ data << qName_ << QString::fromStdString(late->name());
+}
+
+static VLateAttrType atype;
+
+//=====================================================
+//
+// VLateAttr
+//
+//=====================================================
+
+VLateAttr::VLateAttr(VNode *parent,const std::string& name) :
+ VAttribute(parent,0)
+{
+ //name_=name;
+}
+
+VAttributeType* VLateAttr::type() const
+{
+ return &atype;
+}
+
+QStringList VLateAttr::data() const
+{
+ QStringList s;
+ if(node_ptr node=parent_->node())
+ {
+ ecf::LateAttr *late=node->get_late();
+ atype.encode(late,s);
+ }
+ return s;
+}
+
+void VLateAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
+{
+ if(node_ptr node=vnode->node())
+ {
+ ecf::LateAttr *late=node->get_late();
+ if(late)
+ {
+ vec.push_back(new VLateAttr(vnode,late->name()));
+ }
+ }
+}
diff --git a/Viewer/src/VLateAttr.hpp b/Viewer/src/VLateAttr.hpp
new file mode 100644
index 0000000..6f68b5f
--- /dev/null
+++ b/Viewer/src/VLateAttr.hpp
@@ -0,0 +1,27 @@
+#ifndef VLATE_HPP
+#define VLATE_HPP
+
+#include "VAttribute.hpp"
+
+#include <QStringList>
+#include <string>
+#include <vector>
+
+class AttributeFilter;
+class VAttributeType;
+class VNode;
+
+class Label;
+
+class VLateAttr : public VAttribute
+{
+public:
+ VLateAttr(VNode *parent,const std::string&);
+
+ VAttributeType* type() const;
+ QStringList data() const;
+
+ static void scan(VNode* vnode,std::vector<VAttribute*>& vec);
+};
+
+#endif // VLATE_HPP
diff --git a/Viewer/src/VLimitAttr.cpp b/Viewer/src/VLimitAttr.cpp
new file mode 100644
index 0000000..8ca0c80
--- /dev/null
+++ b/Viewer/src/VLimitAttr.cpp
@@ -0,0 +1,159 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "VLimitAttr.hpp"
+#include "VAttributeType.hpp"
+#include "VNode.hpp"
+
+#include "NodeAttr.hpp"
+
+//================================
+// VLimitAttrType
+//================================
+
+class VLimitAttrType : public VAttributeType
+{
+public:
+ explicit VLimitAttrType();
+ QString toolTip(QStringList d) const;
+ void encode(limit_ptr,QStringList&) const;
+
+private:
+ enum DataIndex {TypeIndex=0,NameIndex=1,ValueIndex=2,MaxIndex=3};
+};
+
+
+VLimitAttrType::VLimitAttrType() : VAttributeType("limit")
+{
+ dataCount_=4;
+ searchKeyToData_["limit_name"]=NameIndex;
+ searchKeyToData_["limit_value"]=ValueIndex;
+ searchKeyToData_["limit_max"]=MaxIndex;
+ searchKeyToData_["name"]=NameIndex;
+ scanProc_=VLimitAttr::scan;
+}
+
+QString VLimitAttrType::toolTip(QStringList d) const
+{
+ QString t="<b>Type:</b> Limit<br>";
+ if(d.count() == dataCount_)
+ {
+ t+="<b>Name:</b> " + d[NameIndex] + "<br>";
+ t+="<b>Value:</b> " + d[ValueIndex] + "<br>";
+ t+="<b>Maximum:</b> " + d[MaxIndex];
+ }
+ return t;
+}
+
+void VLimitAttrType::encode(limit_ptr lim,QStringList& data) const
+{
+ data << qName_ <<
+ QString::fromStdString(lim->name()) <<
+ QString::number(lim->value()) <<
+ QString::number(lim->theLimit());
+}
+
+static VLimitAttrType atype;
+
+//=====================================================
+//
+// VLimitAttr
+//
+//=====================================================
+
+VLimitAttr::VLimitAttr(VNode *parent,limit_ptr lim, int index) : VAttribute(parent,index)
+{
+ //name_=lim->name();
+}
+
+VAttributeType* VLimitAttr::type() const
+{
+ return &atype;
+}
+
+QStringList VLimitAttr::data() const
+{
+ QStringList s;
+ if(parent_->node_)
+ {
+ const std::vector<limit_ptr>& v=parent_->node_->limits();
+ atype.encode(v[index_],s);
+ }
+ return s;
+}
+
+std::string VLimitAttr::strName() const
+{
+ if(parent_->node_)
+ {
+ const std::vector<limit_ptr>& v=parent_->node_->limits();
+ return v[index_]->name();
+ }
+ return std::string();
+}
+
+QStringList VLimitAttr::paths() const
+{
+ QStringList lst;
+ if(parent_->node_)
+ {
+ if(index_ >=0 && index_ < static_cast<int>(parent_->node_->limits().size()))
+ {
+ const std::set<std::string>& s=parent_->node_->limits()[index_]->paths();
+ for(std::set<std::string>::const_iterator it=s.begin(); it != s.end(); ++it)
+ {
+ lst << QString::fromStdString(*it);
+ }
+ }
+ }
+ return lst;
+}
+
+void VLimitAttr::removePaths(const std::vector<std::string>& paths)
+{
+ if(parent_->node_)
+ {
+ if(index_ >=0 && index_ < static_cast<int>(parent_->node_->limits().size()))
+ {
+ limit_ptr lim=parent_->node_->limits()[index_];
+ for(std::vector<std::string>::const_iterator it=paths.begin(); it != paths.end(); ++it)
+ {
+ lim->delete_path(*it);
+ }
+ return;
+ }
+ }
+}
+
+void VLimitAttr::resetPaths()
+{
+ if(parent_->node_)
+ {
+ if(index_ >=0 && index_ < static_cast<int>(parent_->node_->limits().size()))
+ {
+ parent_->node_->limits()[index_]->reset();
+ return;
+ }
+ }
+}
+
+void VLimitAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
+{
+ if(vnode->node_)
+ {
+ const std::vector<limit_ptr>& v=vnode->node_->limits();
+ int n=v.size();
+ for(size_t i=0; i < n; i++)
+ {
+ vec.push_back(new VLimitAttr(vnode,v[i],i));
+ }
+ }
+}
+
diff --git a/Viewer/src/VLimitAttr.hpp b/Viewer/src/VLimitAttr.hpp
new file mode 100644
index 0000000..992f65f
--- /dev/null
+++ b/Viewer/src/VLimitAttr.hpp
@@ -0,0 +1,42 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#ifndef VLIMITATTR_HPP
+#define VLIMITATTR_HPP
+
+#include <QStringList>
+#include <string>
+#include <vector>
+
+#include "LimitFwd.hpp"
+#include "VAttribute.hpp"
+
+class AttributeFilter;
+class VAttributeType;
+class VNode;
+
+class VLimitAttr : public VAttribute
+{
+
+public:
+ VLimitAttr(VNode *parent,limit_ptr,int index);
+
+ VAttributeType* type() const;
+ QStringList data() const;
+ std::string strName() const;
+ QStringList paths() const;
+ void removePaths(const std::vector<std::string>& paths);
+ void resetPaths();
+
+ static void scan(VNode* vnode,std::vector<VAttribute*>& vec);
+};
+
+#endif // VLIMITATTR_HPP
+
diff --git a/Viewer/src/VLimiterAttr.cpp b/Viewer/src/VLimiterAttr.cpp
new file mode 100644
index 0000000..5f27a05
--- /dev/null
+++ b/Viewer/src/VLimiterAttr.cpp
@@ -0,0 +1,117 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "VLimiterAttr.hpp"
+#include "VAttributeType.hpp"
+#include "VNode.hpp"
+
+#include "InLimit.hpp"
+
+//================================
+// VLimiterAttrType
+//================================
+
+class VLimiterAttrType : public VAttributeType
+{
+public:
+ explicit VLimiterAttrType();
+ QString toolTip(QStringList d) const;
+ void encode(const InLimit&,QStringList&) const;
+ void scan(VNode* vnode,std::vector<VAttribute*>& vec);
+ int totalNum(VNode* vnode);
+
+private:
+ enum DataIndex {TypeIndex=0,NameIndex=1,PathIndex=2};
+};
+
+
+VLimiterAttrType::VLimiterAttrType() : VAttributeType("limiter")
+{
+ dataCount_=3;
+ searchKeyToData_["limiter_name"]=NameIndex;
+ searchKeyToData_["limiter_path"]=PathIndex;
+ searchKeyToData_["name"]=NameIndex;
+ scanProc_=VLimiterAttr::scan;
+}
+
+QString VLimiterAttrType::toolTip(QStringList d) const
+{
+ QString t="<b>Type:</b> Limiter<br>";
+ if(d.count() == dataCount_)
+ {
+ t+="<b>Limit:</b> " + d[NameIndex] + "<br>";
+ t+="<b>Node:</b> " + d[PathIndex];
+
+ }
+ return t;
+}
+
+void VLimiterAttrType::encode(const InLimit& lim,QStringList& data) const
+{
+ data << qName_ <<
+ QString::fromStdString(lim.name()) <<
+ QString::fromStdString(lim.pathToNode());
+}
+
+static void scan(VNode* vnode,std::vector<VAttribute*>& vec);
+static int totalNum(VNode* vnode);
+
+
+static VLimiterAttrType atype;
+
+//=====================================================
+//
+// VLimiterAttr
+//
+//=====================================================
+
+VLimiterAttr::VLimiterAttr(VNode *parent,const InLimit& lim, int index) : VAttribute(parent,index)
+{
+ //name_=lim.name();
+}
+
+VAttributeType* VLimiterAttr::type() const
+{
+ return &atype;
+}
+
+QStringList VLimiterAttr::data() const
+{
+ QStringList s;
+ if(parent_->node_)
+ {
+ const std::vector<InLimit>& v=parent_->node_->inlimits();
+ atype.encode(v[index_],s);
+ }
+ return s;
+}
+
+std::string VLimiterAttr::strName() const
+{
+ if(parent_->node_)
+ {
+ const std::vector<InLimit>& v=parent_->node_->inlimits();
+ return v[index_].name();
+ }
+ return std::string();
+}
+
+void VLimiterAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
+{
+ if(vnode->node_)
+ {
+ const std::vector<InLimit>& v=vnode->node_->inlimits();
+ int n=v.size();
+ for(size_t i=0; i < n; i++)
+ {
+ vec.push_back(new VLimiterAttr(vnode,v[i],i));
+ }
+ }
+}
diff --git a/Viewer/src/FileWatcher.hpp b/Viewer/src/VLimiterAttr.hpp
similarity index 52%
copy from Viewer/src/FileWatcher.hpp
copy to Viewer/src/VLimiterAttr.hpp
index 2e33bf6..70dc469 100644
--- a/Viewer/src/FileWatcher.hpp
+++ b/Viewer/src/VLimiterAttr.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -8,30 +8,33 @@
//
//============================================================================
-#ifndef VIEWER_SRC_FILEWATCHER_HPP_
-#define VIEWER_SRC_FILEWATCHER_HPP_
+#ifndef VLIMITERATTR_HPP
+#define VLIMITERATTR_HPP
+
+#include "VAttribute.hpp"
-#include <QFileSystemWatcher>
-#include <QFile>
#include <QStringList>
+#include <string>
+#include <vector>
+
+class AttributeFilter;
+class VAttributeType;
+class VNode;
-class FileWatcher : public QFileSystemWatcher
+class InLimit;
+
+class VLimiterAttr : public VAttribute
{
-Q_OBJECT
public:
- FileWatcher(const std::string& filePath,qint64 offset,QObject* parent);
-
-protected Q_SLOTS:
- void slotChanged(const QString& path);
+ VLimiterAttr(VNode *parent,const InLimit&,int index);
-Q_SIGNALS:
- void linesAppended(QStringList);
+ VAttributeType* type() const;
+ QStringList data() const;
+ std::string strName() const;
-protected:
- QFile file_;
- qint64 offset_;
+ static void scan(VNode* vnode,std::vector<VAttribute*>& vec);
};
+#endif // VLIMITERATTR_HPP
-#endif /* VIEWER_SRC_FILEWATCHER_HPP_ */
diff --git a/Viewer/src/VMeterAttr.cpp b/Viewer/src/VMeterAttr.cpp
new file mode 100644
index 0000000..a64785b
--- /dev/null
+++ b/Viewer/src/VMeterAttr.cpp
@@ -0,0 +1,114 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "VMeterAttr.hpp"
+#include "VAttributeType.hpp"
+#include "VNode.hpp"
+
+#include "NodeAttr.hpp"
+
+//================================
+// VMeterAttrType
+//================================
+
+class VMeterAttrType : public VAttributeType
+{
+public:
+ explicit VMeterAttrType();
+ QString toolTip(QStringList d) const;
+ void encode(const Meter&,QStringList&) const;
+
+private:
+ enum DataIndex {TypeIndex=0,NameIndex=1,ValueIndex=2,MinIndex=3, MaxIndex=4,ThresholdIndex=5};
+};
+
+
+VMeterAttrType::VMeterAttrType() : VAttributeType("meter")
+{
+ dataCount_=6;
+ searchKeyToData_["meter_name"]=NameIndex;
+ searchKeyToData_["meter_value"]=ValueIndex;
+ searchKeyToData_["name"]=NameIndex;
+ scanProc_=VMeterAttr::scan;
+}
+
+QString VMeterAttrType::toolTip(QStringList d) const
+{
+ QString t="<b>Type:</b> Meter<br>";
+ if(d.count() == dataCount_)
+ {
+ t+="<b>Name:</b> " + d[NameIndex] + "<br>";
+ t+="<b>Value:</b> " + d[ValueIndex]+ "<br>";
+ t+="<b>Minimum:</b> " + d[MinIndex] + "<br>";
+ t+="<b>Maximum:</b> " + d[MaxIndex];
+ }
+ return t;
+}
+
+void VMeterAttrType::encode(const Meter& m,QStringList& data) const
+{
+ data << qName_ <<
+ QString::fromStdString(m.name()) <<
+ QString::number(m.value()) << QString::number(m.min()) << QString::number(m.max()) <<
+ QString::number(m.colorChange());
+}
+
+static VMeterAttrType atype;
+
+//=====================================================
+//
+// VMeterAttr
+//
+//=====================================================
+
+VMeterAttr::VMeterAttr(VNode *parent,const Meter& m, int index) : VAttribute(parent,index)
+{
+ //name_=m.name();
+}
+
+VAttributeType* VMeterAttr::type() const
+{
+ return &atype;
+}
+
+QStringList VMeterAttr::data() const
+{
+ QStringList s;
+ if(parent_->node_)
+ {
+ const std::vector<Meter>& v=parent_->node_->meters();
+ atype.encode(v[index_],s);
+ }
+ return s;
+}
+
+std::string VMeterAttr::strName() const
+{
+ if(parent_->node_)
+ {
+ const std::vector<Meter>& v=parent_->node_->meters();
+ return v[index_].name();
+ }
+ return std::string();
+}
+
+void VMeterAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
+{
+ if(vnode->node_)
+ {
+ const std::vector<Meter>& v=vnode->node_->meters();
+ int n=v.size();
+ for(size_t i=0; i < n; i++)
+ {
+ vec.push_back(new VMeterAttr(vnode,v[i],i));
+ }
+ }
+}
+
diff --git a/Viewer/src/FileWatcher.hpp b/Viewer/src/VMeterAttr.hpp
similarity index 53%
copy from Viewer/src/FileWatcher.hpp
copy to Viewer/src/VMeterAttr.hpp
index 2e33bf6..0f729f0 100644
--- a/Viewer/src/FileWatcher.hpp
+++ b/Viewer/src/VMeterAttr.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -8,30 +8,32 @@
//
//============================================================================
-#ifndef VIEWER_SRC_FILEWATCHER_HPP_
-#define VIEWER_SRC_FILEWATCHER_HPP_
+#ifndef VMETERATTR_HPP
+#define VMETERATTR_HPP
+
+#include "VAttribute.hpp"
-#include <QFileSystemWatcher>
-#include <QFile>
#include <QStringList>
+#include <string>
+#include <vector>
+
+class AttributeFilter;
+class VAttributeType;
+class VNode;
+
+class Meter;
-class FileWatcher : public QFileSystemWatcher
+class VMeterAttr : public VAttribute
{
-Q_OBJECT
public:
- FileWatcher(const std::string& filePath,qint64 offset,QObject* parent);
+ VMeterAttr(VNode *parent,const Meter&,int index);
-protected Q_SLOTS:
- void slotChanged(const QString& path);
+ VAttributeType* type() const;
+ QStringList data() const;
+ std::string strName() const;
-Q_SIGNALS:
- void linesAppended(QStringList);
-
-protected:
- QFile file_;
- qint64 offset_;
+ static void scan(VNode* vnode,std::vector<VAttribute*>& vec);
};
-
-#endif /* VIEWER_SRC_FILEWATCHER_HPP_ */
+#endif // VMETER_HPP
diff --git a/Viewer/src/VModelData.cpp b/Viewer/src/VModelData.cpp
index 2d14b81..9f6a779 100644
--- a/Viewer/src/VModelData.cpp
+++ b/Viewer/src/VModelData.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -76,7 +76,10 @@ int VModelServer::totalNodeNum() const
VTreeServer::VTreeServer(ServerHandler *server,NodeFilterDef* filterDef,AttributeFilter* attrFilter) :
VModelServer(server),
changeInfo_(new VTreeChangeInfo()),
- attrFilter_(attrFilter)
+ attrFilter_(attrFilter),
+ firstScan_(true),
+ firstScanTryNo_(0),
+ maxFirstScanTry_(10)
{
tree_=new VTree(this);
filter_=new TreeNodeFilter(filterDef,server_,tree_);
@@ -101,6 +104,25 @@ int VTreeServer::nodeNum() const
return tree_->totalNum();
}
+void VTreeServer::adjustFirstScan()
+{
+ if(firstScan_)
+ {
+ if(nodeNum() > 0)
+ {
+ firstScan_=false;
+ }
+ else
+ {
+ firstScanTryNo_++;
+ if(firstScanTryNo_ == maxFirstScanTry_)
+ {
+ firstScan_=false;
+ }
+ }
+ }
+}
+
//--------------------------------------------------
// ServerObserver methods
//--------------------------------------------------
@@ -156,6 +178,8 @@ void VTreeServer::notifyEndServerScan(ServerHandler* /*server*/)
inScan_=false;
//Notifies the model that the scan finished. The model can now relayout its new contents.
Q_EMIT endServerScan(this, num);
+
+ adjustFirstScan();
}
void VTreeServer::notifyBeginServerClear(ServerHandler* server)
@@ -227,6 +251,10 @@ void VTreeServer::notifyBeginNodeChange(const VNode* vnode, const std::vector<ec
//The first access to the attributes makes them initialised in the tree node.
if(node->isAttrInitialised())
{
+ //Update the forceshow attribute in the filter because
+ //it might have been deleted/reallocated
+ attrFilter_->updateForceShowAttr();
+
//This is the already updated attribute num
int currentNum=vnode->attrNum(attrFilter_);
@@ -357,6 +385,8 @@ void VTreeServer::reload()
Q_EMIT beginServerScan(this, tree_->attrNum(attrFilter_)+tree_->numOfChildren());
inScan_=false;
Q_EMIT endServerScan(this, tree_->attrNum(attrFilter_)+tree_->numOfChildren());
+
+ adjustFirstScan();
}
@@ -474,7 +504,7 @@ void VTreeServer::updateFilter(const std::vector<VNode*>& suitesChanged)
UiLog(server_).dbg() << " tree node to update: " << tn->vnode()->absNodePath();
#endif
//First, we remove the branch contents
- if(tn->numOfChildren())
+ if(tn->numOfChildren() >0)
{
int totalRows=tn->attrNum(attrFilter_) + tn->numOfChildren();
Q_EMIT beginFilterUpdateRemove(this,tn,totalRows);
@@ -502,10 +532,15 @@ void VTreeServer::updateFilter(const std::vector<VNode*>& suitesChanged)
}
}
+
//Set the forceShowNode and rerun the filter. The forceShowNode is a node that
//has to be visible even if it does not match the status filter.
void VTreeServer::setForceShowNode(const VNode* node)
{
+#ifdef _UI_VMODELDATA_DEBUG
+ UiLog(server_).dbg() << "setForceShowNode -->";
+#endif
+
if(filter_->isNull() || tree_->find(node))
{
clearForceShow(node);
@@ -528,20 +563,34 @@ void VTreeServer::setForceShowNode(const VNode* node)
void VTreeServer::setForceShowAttribute(const VAttribute* a)
{
+#ifdef _UI_VMODELDATA_DEBUG
+ UiLog(server_).dbg() << "setForceShowAttribute";
+#endif
+
Q_ASSERT(a);
VNode* vnode=a->parent();
Q_ASSERT(vnode);
VTreeNode* node=tree_->find(vnode);
- UI_ASSERT(!node || !attrFilter_->isSet(a->type()),
- "Attr=" << a->name().toStdString() << " type=" << a->typeName());
+#ifdef _UI_VMODELDATA_DEBUG
+ UiLog(server_).dbg() << " node=" << node << " Attr=" << a->name() << " type=" << a->typeName();
+#endif
+ UI_ASSERT(!node || !attrFilter_->isSet(a->type()),
+ "node=" << node << " Attr=" << a->name().toStdString() << " type=" << a->typeName());
//Clear
clearForceShow(a);
+#ifdef _UI_VMODELDATA_DEBUG
+ UiLog(server_).dbg() << " node after clear=" << node;
+#endif
+
+ //clearForce might remove node, so we need to find it again!
+ node=tree_->find(vnode);
+
//Tell the attribute filter that this attribute must always be visible
- attrFilter_->setForceShowAttr(a);
+ //attrFilter_->setForceShowAttr(const_cast<VAttribute*>(a));
//Tell the tree that this node must always be visible
filter_->setForceShowNode(const_cast<VNode*>(vnode));
@@ -551,6 +600,10 @@ void VTreeServer::setForceShowAttribute(const VAttribute* a)
//and will result in displaying the right attributes as well.
if(!node)
{
+#ifdef _UI_VMODELDATA_DEBUG
+ UiLog(server_).dbg() << " node does not exist -->" << node;
+#endif
+
//find the suite
VNode* s=vnode->suite();
Q_ASSERT(s->isTopLevel());
@@ -559,40 +612,69 @@ void VTreeServer::setForceShowAttribute(const VAttribute* a)
std::vector<VNode*> sv;
sv.push_back(s);
+ //Tell the attribute filter that this attribute must always be visible
+ attrFilter_->setForceShowAttr(const_cast<VAttribute*>(a));
+
updateFilter(sv);
}
//The attribute is not visible (its type is not filtered)
else if(!attrFilter_->isSet(a->type()))
{
+#ifdef _UI_VMODELDATA_DEBUG
+ UiLog(server_).dbg() << " attribute type is not filtered -->";
+#endif
+
//We only need to handle this case. When the attributes are not yet initialised
//the selection in the view will trigger the attribute initialisation. This
//will use the filter that we already set to use the attribute (as forceShowAttr).
if(node->isAttrInitialised())
{
+ //This is the attribute num we store in the tree node
+ //(and display in the tree).
+ int cachedNum=node->attrNum(attrFilter_);
+
+ //Tell the attribute filter that this attribute must always be visible
+ attrFilter_->setForceShowAttr(const_cast<VAttribute*>(a));
+
//This is the current attribute num using the modified attribute filter
int currentNum=vnode->attrNum(attrFilter_);
//This is the attribute num we store in the tree node
//(and display in the tree).
- int cachedNum=node->attrNum(attrFilter_);
+ //int cachedNum=node->attrNum(attrFilter_);
Q_ASSERT(cachedNum >= 0);
Q_ASSERT(currentNum >= cachedNum);
- Q_EMIT beginAddRemoveAttributes(this,node,currentNum,cachedNum);
+#ifdef _UI_VMODELDATA_DEBUG
+ UiLog(server_).dbg() << " currentNum=" << currentNum << " cachedNum=" << cachedNum;
+#endif
+ if(currentNum != cachedNum)
+ {
+ Q_EMIT beginAddRemoveAttributes(this,node,currentNum,cachedNum);
- //We update the attribute num in the tree node
- node->updateAttrNum(attrFilter_);
+ //We update the attribute num in the tree node
+ node->updateAttrNum(attrFilter_);
- //This will trigger rerendering the attributes of the given node
- //even if currentNum and cachedNum are the same.
- Q_EMIT endAddRemoveAttributes(this,node,currentNum,cachedNum);
+ //This will trigger rerendering the attributes
+ Q_EMIT endAddRemoveAttributes(this,node,currentNum,cachedNum);
+ }
+ //This will trigger rerendering the attributes of the given node when
+ //currentNum and cachedNum are the same.
+ else
+ {
+ Q_EMIT attributesChanged(this,node);
+ }
}
}
}
-void VTreeServer::clearForceShow(const VItem* item)
+void VTreeServer::clearForceShow(const VItem* itemCurrent)
{
- if(!item)
+#ifdef _UI_VMODELDATA_DEBUG
+ UiLog().dbg() << "clearForceShow -->";
+#endif
+
+ if(!itemCurrent)
return;
//filter_ is unique for each VTreeServer while attrFilter_ is
@@ -621,37 +703,36 @@ void VTreeServer::clearForceShow(const VItem* item)
//currently store because in this case there is nothing to do.
//The server matches
- if(item->parent()->server() == server_)
+ //TODO: what if it is the ROOT?
+ if(itemCurrent->parent()->server() == server_)
{
//Item is a node and it is the same as we store
- if(VNode *itn=item->isNode())
+ if(VNode *itn=itemCurrent->isNode())
{
if(itn == vnPrev && !aPrev)
return;
}
- //Item is an attribute and it is the same as we store
- if(VAttribute *ita=item->isAttribute())
+ //Item is an attribute
+ if(VAttribute *ita=itemCurrent->isAttribute())
{
- if(aPrev && aPrev->sameContents(ita))
+ if(aPrev)
{
- return;
+ //The attribute is in the current branch or
+ if(ita->parent() == aPrev->parent() &&
+ attrFilter_->isSet(aPrev->type()) && attrFilter_->isSet(ita->type()))
+ {
+ return;
+ }
+ //the attribute is the same as before
+ if(aPrev->sameContents(ita))
+ {
+ return;
+ }
}
}
}
- //Reload the node status filter
- filter_->clearForceShowNode();
-
- VNode* s=vnPrev->suite();
- Q_ASSERT(s->isTopLevel());
- Q_ASSERT(s);
-
- std::vector<VNode*> sv;
- sv.push_back(s);
-
- updateFilter(sv);
-
- //Need to handle the attribute if the tree node is still visible
+ //Need to handle the attribute if the tree node is visible
if(aPrev)
{
attrFilter_->clearForceShowAttr();
@@ -661,13 +742,13 @@ void VTreeServer::clearForceShow(const VItem* item)
{
Q_ASSERT(node->isAttrInitialised());
+ //This is the actual num with the current filter
int currentNum=vnPrev->attrNum(attrFilter_);
//This is the attribute num we store in the tree node
//(and display in the tree).
int cachedNum=node->attrNum(attrFilter_);
Q_ASSERT(cachedNum >= 0);
-
Q_ASSERT(currentNum <= cachedNum);
Q_EMIT beginAddRemoveAttributes(this,node,currentNum,cachedNum);
@@ -681,6 +762,19 @@ void VTreeServer::clearForceShow(const VItem* item)
}
}
+
+ //Reload the node status filter
+ filter_->clearForceShowNode();
+
+ VNode* s=vnPrev->suite();
+ Q_ASSERT(s->isTopLevel());
+ Q_ASSERT(s);
+
+ std::vector<VNode*> sv;
+ sv.push_back(s);
+
+ //!!!!This can call clearForceShow again!!!
+ updateFilter(sv);
}
//==========================================
@@ -825,6 +919,9 @@ void VTableServer::reload()
//has to be visible even if it does not match the filter.
void VTableServer::setForceShowNode(const VNode* node)
{
+ if(inScan_)
+ return;
+
if(filter_->indexOf(node) != -1)
{
clearForceShow(node);
@@ -879,7 +976,8 @@ void VTableServer::clearForceShow(const VItem* item)
VModelData::VModelData(NodeFilterDef *filterDef,AbstractNodeModel* model) :
QObject(model),
- serverFilter_(0),
+ serverNum_(0),
+ serverFilter_(0),
filterDef_(filterDef),
model_(model),
active_(false)
@@ -946,7 +1044,6 @@ void VModelData::reset(ServerFilter* serverFilter)
{
clear();
serverFilter_=serverFilter;
-
init();
}
@@ -956,13 +1053,19 @@ void VModelData::init()
for(unsigned int i=0; i < serverFilter_->items().size(); i++)
{
- if(ServerHandler *server=serverFilter_->items().at(i)->serverHandler())
+ if(ServerHandler *server=serverFilter_->items().at(i)->serverHandler())
{
add(server);
}
}
}
+void VModelData::addToServers(VModelServer* s)
+{
+ servers_.push_back(s);
+ serverNum_=servers_.size();
+}
+
void VModelData::clear()
{
#ifdef _UI_VMODELDATA_DEBUG
@@ -976,10 +1079,11 @@ void VModelData::clear()
for(int i=0; i < servers_.size(); i++)
{
- delete servers_.at(i);
+ delete servers_[i];
}
servers_.clear();
+ serverNum_=0;
#ifdef _UI_VMODELDATA_DEBUG
UiLog().dbg() << "<-- clear";
@@ -988,18 +1092,18 @@ void VModelData::clear()
VModelServer* VModelData::server(int n) const
{
- return (n >=0 && n < servers_.size())?servers_.at(n):0;
+ return (n >=0 && n < servers_.size())?servers_[n]:0;
}
ServerHandler* VModelData::serverHandler(int n) const
{
- return (n >=0 && n < servers_.size())?servers_.at(n)->server_:0;
+ return (n >=0 && n < servers_.size())?servers_[n]->server_:0;
}
int VModelData::indexOfServer(void* idPointer) const
{
for(unsigned int i=0; i < servers_.size(); i++)
- if(servers_.at(i) == idPointer)
+ if(servers_[i] == idPointer)
return i;
return -1;
@@ -1007,36 +1111,36 @@ int VModelData::indexOfServer(void* idPointer) const
ServerHandler* VModelData::serverHandler(void* idPointer) const
{
- for(unsigned int i=0; i < servers_.size(); i++)
- if(servers_.at(i) == idPointer)
- return servers_.at(i)->server_;
+ for(unsigned int i=0; i < serverNum_; i++)
+ if(servers_[i] == idPointer)
+ return servers_[i]->server_;
return NULL;
}
VModelServer* VModelData::server(const void* idPointer) const
{
- for(unsigned int i=0; i < servers_.size(); i++)
- if(servers_.at(i) == idPointer)
- return servers_.at(i);
+ for(unsigned int i=0; i < serverNum_; i++)
+ if(servers_[i] == idPointer)
+ return servers_[i];
return NULL;
}
VModelServer* VModelData::server(const std::string& name) const
{
- for(unsigned int i=0; i < servers_.size(); i++)
- if(servers_.at(i)->server_->name() == name)
- return servers_.at(i);
+ for(unsigned int i=0; i < serverNum_; i++)
+ if(servers_[i]->server_->name() == name)
+ return servers_[i];
return NULL;
}
VModelServer* VModelData::server(ServerHandler* s) const
{
- for(unsigned int i=0; i < servers_.size(); i++)
- if(servers_.at(i)->server_ == s)
- return servers_.at(i);
+ for(unsigned int i=0; i < serverNum_; i++)
+ if(servers_[i]->server_ == s)
+ return servers_[i];
return NULL;
}
@@ -1044,8 +1148,8 @@ VModelServer* VModelData::server(ServerHandler* s) const
int VModelData::indexOfServer(ServerHandler* s) const
{
- for(unsigned int i=0; i < servers_.size(); i++)
- if(servers_.at(i)->server_ == s)
+ for(unsigned int i=0; i < serverNum_; i++)
+ if(servers_[i]->server_ == s)
return i;
return -1;
}
@@ -1107,6 +1211,7 @@ void VModelData::notifyServerFilterRemoved(ServerItem* item)
delete *it;
servers_.erase(it);
+ serverNum_=servers_.size();
#ifdef _UI_VMODELDATA_DEBUG
UiLog().dbg() << " emit serverRemoveEnd()";
@@ -1177,9 +1282,9 @@ void VModelData::reload(bool broadcast)
if(broadcast)
Q_EMIT filterChangeBegun();
- for(unsigned int i=0; i < servers_.size(); i++)
+ for(unsigned int i=0; i < serverNum_; i++)
{
- servers_.at(i)->reload();
+ servers_[i]->reload();
}
if(broadcast)
@@ -1202,9 +1307,9 @@ void VModelData::slotFilterDefChanged()
bool VModelData::isFilterComplete() const
{
- for(unsigned int i=0; i < servers_.size(); i++)
+ for(unsigned int i=0; i < serverNum_; i++)
{
- return servers_.at(i)->filter()->isComplete();
+ return servers_[i]->filter()->isComplete();
}
return true;
@@ -1212,9 +1317,9 @@ bool VModelData::isFilterComplete() const
bool VModelData::isFilterNull() const
{
- for(unsigned int i=0; i < servers_.size(); i++)
+ for(unsigned int i=0; i < serverNum_; i++)
{
- return servers_.at(i)->filter()->isNull();
+ return servers_[i]->filter()->isNull();
}
return true;
@@ -1287,7 +1392,7 @@ void VTreeModelData::add(ServerHandler *server)
connectToModel(d);
- servers_.push_back(d);
+ VModelData::addToServers(d);
if(active_)
reload(true);
@@ -1297,9 +1402,9 @@ void VTreeModelData::slotAttrFilterChanged()
{
Q_EMIT filterChangeBegun();
- for(unsigned int i=0; i < servers_.size(); i++)
+ for(unsigned int i=0; i < serverNum_; i++)
{
- servers_.at(i)->treeServer()->attrFilterChanged();
+ servers_[i]->treeServer()->attrFilterChanged();
}
Q_EMIT filterChangeEnded();
@@ -1335,7 +1440,7 @@ void VTableModelData::add(ServerHandler *server)
connectToModel(d);
- servers_.push_back(d);
+ VModelData::addToServers(d);
if(active_)
reload(false);
@@ -1349,9 +1454,9 @@ int VTableModelData::position(VTableServer* server)
if(server)
{
start=0;
- for(unsigned int i=0; i < servers_.size(); i++)
+ for(unsigned int i=0; i < serverNum_; i++)
{
- if(servers_.at(i) == server)
+ if(servers_[i] == server)
{
return start;
}
@@ -1374,13 +1479,13 @@ bool VTableModelData::position(VTableServer* server,int& start,int& count)
{
count=server->nodeNum();
start=0;
- for(unsigned int i=0; i < servers_.size(); i++)
+ for(unsigned int i=0; i < serverNum_; i++)
{
- if(servers_.at(i) == server)
+ if(servers_[i] == server)
{
return true;
}
- start+=servers_.at(i)->nodeNum();
+ start+=servers_[i]->nodeNum();
}
}
}
@@ -1395,7 +1500,7 @@ int VTableModelData::position(VTableServer* server,const VNode *node) const
if(server)
{
int totalRow=0;
- for(unsigned int i=0; i < servers_.size(); i++)
+ for(unsigned int i=0; i < serverNum_; i++)
{
if(servers_[i] == server)
{
@@ -1437,7 +1542,7 @@ VNode* VTableModelData::nodeAt(int totalRow)
if(totalRow < 0)
return NULL;
- for(unsigned int i=0; i < servers_.size(); i++)
+ for(unsigned int i=0; i < serverNum_; i++)
{
int pos=totalRow-cnt;
if(pos < servers_[i]->nodeNum())
diff --git a/Viewer/src/VModelData.hpp b/Viewer/src/VModelData.hpp
index 3b24457..c91ed00 100644
--- a/Viewer/src/VModelData.hpp
+++ b/Viewer/src/VModelData.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -110,6 +110,7 @@ public:
void setForceShowNode(const VNode* node);
void setForceShowAttribute(const VAttribute* node);
void clearForceShow(const VItem*);
+ bool isFirstScan() const {return firstScan_;}
//From ServerObserver
void notifyDefsChanged(ServerHandler* server, const std::vector<ecf::Aspect::Type>& a);
@@ -142,11 +143,15 @@ Q_SIGNALS:
private:
void updateFilter(const std::vector<VNode*>& suitesChanged);
+ void adjustFirstScan();
VTree* tree_;
VTreeChangeInfo* changeInfo_;
AttributeFilter *attrFilter_;
TreeNodeFilter* filter_;
+ bool firstScan_;
+ int firstScanTryNo_;
+ int maxFirstScanTry_;
};
class VTableServer : public VModelServer
@@ -244,10 +249,12 @@ Q_SIGNALS:
protected:
void init();
- virtual void add(ServerHandler*)=0;
+ void addToServers(VModelServer* s);
+ virtual void add(ServerHandler*)=0;
virtual void connectToModel(VModelServer* d);
std::vector<VModelServer*> servers_;
+ int serverNum_; //we cachec servers_.size() for performance reasons
ServerFilter *serverFilter_;
NodeFilterDef* filterDef_;
AbstractNodeModel* model_;
diff --git a/Viewer/src/VNState.cpp b/Viewer/src/VNState.cpp
index ff85da3..08ee12e 100644
--- a/Viewer/src/VNState.cpp
+++ b/Viewer/src/VNState.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VNState.hpp b/Viewer/src/VNState.hpp
index 5ceb641..b215572 100644
--- a/Viewer/src/VNState.hpp
+++ b/Viewer/src/VNState.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VNode.cpp b/Viewer/src/VNode.cpp
index 3230159..6388f48 100644
--- a/Viewer/src/VNode.cpp
+++ b/Viewer/src/VNode.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -10,8 +10,6 @@
#include "VNode.hpp"
-#include <QDebug>
-
#include "Node.hpp"
#include "Variable.hpp"
@@ -23,23 +21,35 @@
#include "TriggeredScanner.hpp"
#include "VAttribute.hpp"
#include "VAttributeType.hpp"
+#include "VDateAttr.hpp"
+#include "VEventAttr.hpp"
#include "VFileInfo.hpp"
+#include "VFilter.hpp"
+#include "VLabelAttr.hpp"
+#include "VLateAttr.hpp"
+#include "VLimitAttr.hpp"
+#include "VLimiterAttr.hpp"
+#include "VMeterAttr.hpp"
+#include "VRepeatAttr.hpp"
#include "VNState.hpp"
#include "VSState.hpp"
#include "VTaskNode.hpp"
+#include "VTimeAttr.hpp"
+#include "VTriggerAttr.hpp"
+#include "VGenVarAttr.hpp"
+#include "VUserVarAttr.hpp"
+#include "UiLog.hpp"
#include <boost/algorithm/string.hpp>
#define _UI_VNODE_DEBUG
-
// static member of VNode
std::string VNode::nodeMarkedForMoveRelPath_;
std::string VNode::nodeMarkedForMoveServerAlias_;
-
//For a given node this class stores all the nodes that this node itself triggers.
-//For memory efficiency we only store the index of the nodes not the pointers themselves.
+//For memory efficiency we only store the AttributeFilterindex of the nodes not the pointers themselves.
class VNodeTriggerData
{
public:
@@ -48,11 +58,11 @@ public:
void get(VNode* node ,TriggerCollector* tc)
{
VServer* s=node->root();
- for(size_t i=0; i < data_.size(); i++)
+ int num=data_.size();
+ for(size_t i=0; i < num; i++)
{
- VItemTmp_ptr triggered(VItemTmp::create(s->nodeAt(data_[i])));
- VItemTmp_ptr nullItem;
- tc->add(triggered,nullItem,TriggerCollector::Normal);
+ VItem* triggered=s->nodeAt(data_[i]);
+ tc->add(triggered,0,TriggerCollector::Normal);
}
}
void add(VItem* n)
@@ -95,7 +105,7 @@ public:
tc->add(triggered,nullItem,TriggerCollector::Normal);
}
}
-
+AttributeFilter
void add(VItem* n)
{
assert(n);
@@ -138,12 +148,17 @@ VNode::VNode(VNode* parent,node_ptr node) :
if(node_)
node_->set_graphic_ptr(this);
+
+ scanAttr();
}
VNode::~VNode()
{
if(data_)
delete data_;
+
+ for(size_t i=0; i < attr_.size(); i++)
+ delete attr_[i];
}
VServer* VNode::root() const
@@ -195,95 +210,191 @@ bool VNode::hasAccessed() const
return true; //!name_.empty();
}
-#if 0
-//At the beginning of the update we get the current number of attributes
-void VNode::beginUpdateAttrNum()
-{
- //if(attrNum_ != -1)
- //{
- // attrNum_=cachedAttrNum_;
- //}
+//------------------------
+// Attributes
+//------------------------
- //attrNum_=VAttribute::totalNum(node_);
+void VNode::scanAttr()
+{
+ std::vector<VAttribute*> v;
+ VAttributeType::scan(this,v);
+ int n=v.size();
+ attr_.reserve(n);
+ for(size_t i=0; i < n; i++)
+ attr_.push_back(v[i]);
}
-//At the end of the update we set the cached value to the current number of attributes
-void VNode::endUpdateAttrNum()
+void VNode::rescanAttr()
{
- cachedAttrNum_=attrNum_;
- attrNum_=VAttributeType::totalNum(this);
-}
+ for(size_t i=0; i < attr_.size(); i++)
+ delete attr_[i];
-short VNode::cachedAttrNum() const
-{
- return cachedAttrNum_;
+ attr_=std::vector<VAttribute*>();
+ scanAttr();
}
-#endif
int VNode::attrNum(AttributeFilter *filter) const
{
- return VAttributeType::totalNum(this,filter);
+ if(filter)
+ {
+ int n=0;
+ for(size_t i=0; i < attr_.size(); i++)
+ {
+ if(filter->isSet(attr_[i]->type()) || filter->forceShowAttr() == attr_[i])
+ n++;
+ }
+ return n;
+ }
-#if 0
- //If if was not initialised we get its value
- if(attrNum_==-1)
- {
- attrNum_=VAttributeType::totalNum(this);
+ return attr_.size();
+}
- if(cachedAttrNum_ == -1)
- cachedAttrNum_=attrNum_;
- }
+VAttribute* VNode::attribute(int row,AttributeFilter *filter) const
+{
+ assert(row>=0);
- return attrNum_;
-#endif
+ if(filter)
+ {
+ int n=0;
+ int cnt=attr_.size();
+ if(row >= cnt)
+ return 0;
-}
+ for(size_t i=0; i < cnt; i++)
+ {
+ if(filter->isSet(attr_[i]->type()) || filter->forceShowAttr() == attr_[i] )
+ {
+ if(n == row)
+ {
+ return attr_[i];
+ }
+ n++;
+ }
+ }
+ }
+ else if(row < attr_.size())
+ {
+ return attr_[row];
+ }
-#if 0
-short VNode::currentAttrNum() const
-{
- return VAttributeType::totalNum(this);
+ return 0;
}
-#endif
-QStringList VNode::getAttributeData(int row,VAttributeType*& type)
+VAttribute* VNode::attributeForType(int row,VAttributeType *t) const
{
- QStringList lst;
- VAttributeType::getData(this,row,type,lst);
- return lst;
+ assert(row>=0);
+
+ int n=0;
+ int cnt=attr_.size();
+ if(row >= cnt)
+ return 0;
+
+ bool hasIt=false;
+ int rowCnt=0;
+ for(size_t i=0; i < cnt; i++)
+ {
+ if(attr_[i]->type() == t)
+ {
+ if(rowCnt == row)
+ {
+ return attr_[i];
+ }
+ rowCnt++;
+ hasIt=true;
+ }
+ else if(hasIt)
+ {
+ return 0;
+ }
+ }
+
+ return 0;
}
-QStringList VNode::getAttributeData(int row,AttributeFilter *filter)
+int VNode::indexOfAttribute(const VAttribute* a, AttributeFilter *filter) const
{
- VAttributeType* type;
- QStringList lst;
- VAttributeType::getData(this,row,type,lst,filter);
- return lst;
+ if(filter)
+ {
+ int n=0;
+ int cnt=attr_.size();
+ for(size_t i=0; i < cnt; i++)
+ {
+ if(filter->isSet(attr_[i]->type()) || filter->forceShowAttr() == attr_[i] )
+ {
+ if(a==attr_[i])
+ return n;
+
+ n++;
+ }
+ }
+ }
+ else
+ {
+ int n=0;
+ int cnt=attr_.size();
+ for(size_t i=0; i < cnt; i++)
+ {
+ if(a == attr_[i])
+ return i;
+ }
+ }
+
+ return -1;
}
-#if 0
-VAttributeType* VNode::getAttributeType(int row)
+VAttribute* VNode::findAttribute(const std::string& typeName,const std::string& name)
{
- return VAttributeType::getType(this,row);
+ VAttributeType *t=VAttributeType::find(typeName);
+ Q_ASSERT(t);
+ return (t)?findAttribute(t,name):0;
}
-#endif
-bool VNode::getAttributeData(const std::string& type,int row,QStringList& data)
+VAttribute* VNode::findAttribute(VAttributeType *t,const std::string& name)
{
- return VAttributeType::getData(type,this,row,data);
+ Q_ASSERT(t);
+
+ int cnt=attr_.size();
+ bool hasType=false;
+ for(size_t i=0; i < cnt; i++)
+ {
+ if(attr_[i]->type() == t)
+ {
+ if(attr_[i]->strName() == name)
+ return attr_[i];
+ hasType=true;
+ }
+ else if(hasType)
+ return 0;
+ }
+ return 0;
}
-int VNode::getAttributeLineNum(int row,AttributeFilter *filter)
+
+VAttribute* VNode::findAttribute(QStringList aData)
{
- return VAttributeType::getLineNum(this,row,filter);
+ int cnt=attr_.size();
+ for(size_t i=0; i < cnt; i++)
+ {
+ if(attr_[i]->sameAs(aData))
+ return attr_[i];
+ }
+ return 0;
}
-QString VNode::attributeToolTip(int row,AttributeFilter *filter)
+void VNode::findAttributes(VAttributeType *t,std::vector<VAttribute*>& v)
{
- VAttributeType* type;
- QStringList lst;
- VAttributeType::getData(this,row,type,lst,filter);
- return (type)?(type->toolTip(lst)):QString();
+ int cnt=attr_.size();
+ bool hasType=false;
+ for(size_t i=0; i < cnt; i++)
+ {
+ if(attr_[i]->type() == t)
+ {
+ v.push_back(attr_[i]);
+ hasType=true;
+ }
+ else if(hasType)
+ return;
+ }
}
void VNode::addChild(VNode* vn)
@@ -457,7 +568,7 @@ int VNode::variablesNum() const
int VNode::genVariablesNum() const
{
- std::vector<Variable> gv;
+ std::vector<Variable> gv;
if(node_)
{
@@ -605,32 +716,6 @@ QColor VNode::typeFontColour() const
return VNState::toTypeColour(this);
}
-LogServer_ptr VNode::logServer()
-{
- LogServer_ptr lsv;
-
- if(!node_)
- return lsv;
-
- std::string logHost=findInheritedVariable("ECF_LOGHOST",true);
- std::string logPort=findInheritedVariable("ECF_LOGPORT");
- //if(logHost.empty())
- //{
- // logHost=findInheritedVariable("LOGHOST",true);
- // logPort=findInheritedVariable("LOGPORT");
- //}
-
- std::string micro=findInheritedVariable("ECF_MICRO");
- if(!logHost.empty() && !logPort.empty() &&
- (micro.empty() || logHost.find(micro) == std::string::npos))
- {
- lsv=LogServer_ptr(new LogServer(logHost,logPort));
- return lsv;
- }
-
- return lsv;
-}
-
bool VNode::logServer(std::string& host,std::string& port)
{
if(!node_)
@@ -654,24 +739,6 @@ bool VNode::logServer(std::string& host,std::string& port)
return false;
}
-#if 0
-bool VNode::isAncestor(const VNode* n)
-{
- if(n == this)
- return true;
-
- VNode* nd=parent();
- while(nd)
- {
- if(n == nd)
- return true;
-
- nd=nd->parent();
- }
- return false;
-}
-#endif
-
std::vector<VNode*> VNode::ancestors(SortMode sortMode)
{
std::vector<VNode*> nodes;
@@ -765,21 +832,31 @@ bool VNode::isAlias() const
}
#endif
+std::string VNode::flagsAsStr() const
+{
+ return (node_)?node_->flag().to_string():std::string();
+}
+
bool VNode::isFlagSet(ecf::Flag::Type f) const
{
- if(node_ && node_.get())
+ if(node_)
{
return node_->flag().is_set(f);
}
return false;
}
-void VNode::why(std::vector<std::string>& theReasonWhy) const
+void VNode::why(std::vector<std::string>& bottomUp,
+ std::vector<std::string>& topDown) const
{
if(node_)
{
- node_->bottom_up_why(theReasonWhy);
- }
+ node_->bottom_up_why(bottomUp,1);
+ if(isFamily() || isSuite())
+ {
+ node_->top_down_why(topDown,1);
+ }
+ }
}
const std::string& VNode::abortedReason() const
@@ -846,35 +923,20 @@ QString VNode::toolTip()
void VNode::triggerExpr(std::string& trigger, std::string& complete) const
{
- if(node_)
- {
- QList<VItemTmp_ptr> v;
- VAttributeType::items("trigger",this,v);
- Q_FOREACH(VItemTmp_ptr aItem,v)
- {
- VAttribute* a=aItem->attribute();
- assert(a);
- std::string t;
- a->value("trigger_type",t);
- if(t=="0")
- a->value("trigger_expression",trigger);
- else if(t=="1")
- a->value("trigger_expression",complete);
- }
- }
+ VTriggerAttr::expressions(this,trigger,complete);
}
//Collect the information about all the triggers triggering this node
void VNode::triggers(TriggerCollector* tlc)
{
- VItemTmp_ptr nullItem;
+ VItem* nullItem=0;
//Check the node itself
//if(tlr.self())
{
//find nodes, event, meters and variables triggering this node
if(node_ && !node_->isSuite())
{
- std::vector<VItemTmp_ptr> theVec;
+ std::vector<VItem*> theVec;
AstCollateVNodesVisitor astVisitor(theVec);
//Collect the nodes from ast
@@ -885,12 +947,8 @@ void VNode::triggers(TriggerCollector* tlc)
node_->triggerAst()->accept(astVisitor);
//Add the found items to the collector
- for(std::vector<VItemTmp_ptr>::iterator it = theVec.begin(); it != theVec.end(); ++it)
+ for(std::vector<VItem*>::iterator it = theVec.begin(); it != theVec.end(); ++it)
{
-#ifdef _UI_VNODE_DEBUG
- //if((*it)->parent() && (*it)->parent()->absNodePath() == "/e_41r2_peter/main")
- // qDebug() << "trigger ast:" << (*it)->name() << *it;
-#endif
tlc->add(*it,nullItem, TriggerCollector::Normal);
}
}
@@ -898,19 +956,20 @@ void VNode::triggers(TriggerCollector* tlc)
//Check other attributes
//Limiters
- QList<VItemTmp_ptr> limiterLst;
- VAttributeType::items("limiter",this,limiterLst);
- Q_FOREACH(VItemTmp_ptr aItem, limiterLst)
+ std::vector<VAttribute*> limiterVec;
+ findAttributes(VAttributeType::find("limiter"),limiterVec);
+ int n=limiterVec.size();
+ for(size_t i=0; i < n; i++)
{
- VAttribute* a=aItem->attribute();
+ VAttribute *a=limiterVec[i];
assert(a);
- std::string v;
- if(a->value("limiter_path",v))
+ std::string val;
+ if(a->value("limiter_path",val))
{
- if(VItemTmp_ptr n = findLimit(v, a->strName()))
+ if(VAttribute* n = findLimit(val, a->strName()))
{
#ifdef _UI_VNODE_DEBUG
- //qDebug() << "trigger limit:" << n->name();
+ UiLog().dbg() << "trigger limit: " << n->name();
#endif
tlc->add(n,nullItem, TriggerCollector::Normal);
}
@@ -918,19 +977,21 @@ void VNode::triggers(TriggerCollector* tlc)
}
//Date
- QList<VItemTmp_ptr> dateLst;
- VAttributeType::items("date",this,dateLst);
- Q_FOREACH(VItemTmp_ptr a, dateLst)
- {
- tlc->add(a,nullItem,TriggerCollector::Normal);
+ std::vector<VAttribute*> dateVec;
+ findAttributes(VAttributeType::find("date"),dateVec);
+ n=dateVec.size();
+ for(size_t i=0; i < n; i++)
+ {
+ tlc->add(dateVec[i],nullItem,TriggerCollector::Normal);
}
//Time
- QList<VItemTmp_ptr> timeLst;
- VAttributeType::items("time",this,timeLst);
- Q_FOREACH(VItemTmp_ptr a, timeLst)
+ std::vector<VAttribute*> timeVec;
+ findAttributes(VAttributeType::find("time"),timeVec);
+ n=timeVec.size();
+ for(size_t i=0; i < n; i++)
{
- tlc->add(a,nullItem,TriggerCollector::Normal);
+ tlc->add(timeVec[i],nullItem,TriggerCollector::Normal);
}
}
@@ -986,10 +1047,10 @@ void VNode::triggered(TriggerCollector* tlc,TriggeredScanner* scanner)
{
if(scanner && !root()->triggeredScanned())
{
- unsigned int aNum=VAttribute::totalNum();
+ //unsigned int aNum=VAttribute::totalNum();
scanner->start(root());
root()->setTriggeredScanned(true);
- assert(aNum == VAttribute::totalNum());
+ //assert(aNum == VAttribute::totalNum());
}
//Get the nodes directly triggered by this node
@@ -1023,10 +1084,10 @@ void VNode::triggeredByChildren(VNode *n,VNode* p,TriggerCollector* tlc)
}
}
-VItemTmp_ptr VNode::findLimit(const std::string& path, const std::string& name)
+VAttribute* VNode::findLimit(const std::string& path, const std::string& name)
{
// if (!strncmp("/", path.c_str(), 1))
- VItemTmp_ptr nullItem;
+ VAttribute* nullItem=0;
#if 0
if(!path.empty() && path[0] == '/')
@@ -1047,23 +1108,22 @@ VItemTmp_ptr VNode::findLimit(const std::string& path, const std::string& name)
}
//Find the matching limit in the node
- QList<VItemTmp_ptr> limit;
- VAttributeType::items("limit",n,limit);
- Q_FOREACH(VItemTmp_ptr aItem, limit)
- {
- assert(aItem);
- assert(aItem->item());
- assert(aItem->item()->isAttribute());
- if(aItem->item()->strName() == name)
+ std::vector<VAttribute*> limit;
+ n->findAttributes(VAttributeType::find("limit"),limit);
+ int limitNum=limit.size();
+ for(size_t i=0; i < limitNum; i++)
+ {
+ if(limit[i]->strName() == name)
{
- return aItem;
+ return limit[i];
}
}
//Find the matching limit in the ancestors
VNode* p=n->parent();
Q_ASSERT(p);
- for(int i=0; i < p->numOfChildren(); i++)
+ int chNum= p->numOfChildren();
+ for(int i=0; i < chNum; i++)
{
VNode* ch=p->childAt(i);
if (ch->strName() == path.substr(0, ch->name().size()))
@@ -1499,7 +1559,7 @@ void VServer::beginUpdate(VNode* node,const std::vector<ecf::Aspect::Type>& aspe
//all VNode functions have to return the values valid before the update happened!!!!!!!
//The main goal of this function is to cleverly provide the views with some information about the nature of the update.
- //Update the generated variables. There is no notification about their change so we have to to do it!!!
+ //Update the generated variables. There is no notification about their change so we have to do it!!!
if(node->node())
{
Suite *s=NULL;
@@ -1525,6 +1585,12 @@ void VServer::beginUpdate(VNode* node,const std::vector<ecf::Aspect::Type>& aspe
#endif
bool nodeNumCh=(std::find(aspect.begin(),aspect.end(),ecf::Aspect::ADD_REMOVE_NODE) != aspect.end());
+ bool attrNumCh=(std::find(aspect.begin(),aspect.end(),ecf::Aspect::ADD_REMOVE_ATTR) != aspect.end());
+ if(attrNumCh)
+ {
+ node->rescanAttr();
+ }
+
//----------------------------------------------------------------------
// The number of attributes changed but the number of nodes did not
//----------------------------------------------------------------------
@@ -1676,10 +1742,14 @@ void VServer::why(std::vector<std::string>& theReasonWhy) const
if (!defs)
return;
- defs->why(theReasonWhy);
+ defs->why(theReasonWhy,1);
}
+std::string VServer::flagsAsStr() const
+{
+ return cache_.flag_.to_string();
+}
bool VServer::isFlagSet(ecf::Flag::Type f) const
{
diff --git a/Viewer/src/VNode.hpp b/Viewer/src/VNode.hpp
index 3a88d07..2bbc0d0 100644
--- a/Viewer/src/VNode.hpp
+++ b/Viewer/src/VNode.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -17,11 +17,9 @@
#include <QStringList>
#include "Aspect.hpp"
-#include "LogServer.hpp"
#include "Node.hpp"
#include "VItem.hpp"
-#include "VItemTmp.hpp"
class AttributeFilter;
class IconFilter;
@@ -87,6 +85,18 @@ public:
class VNode : public VItem
{
friend class VServer;
+friend class VLabelAttr;
+friend class VMeterAttr;
+friend class VEventAttr;
+friend class VRepeatAttr;
+friend class VTriggerAttr;
+friend class VLimitAttr;
+friend class VLimiterAttr;
+friend class VLateAttr;
+friend class VTimeAttr;
+friend class VDateAttr;
+friend class VGenVarAttr;
+friend class VUserVarAttr;
public:
VNode(VNode* parent,node_ptr);
@@ -97,42 +107,20 @@ public:
VServer *root() const;
virtual ServerHandler* server() const;
virtual VNode* suite() const;
- node_ptr node() const {return node_;}
-
- //VServer* isServer() const {return NULL;}
+ node_ptr node() const {return node_;}
VNode* isNode() const {return const_cast<VNode*>(this);}
- //VSuiteNode* isSuite() const {return NULL;}
- //VFamilyNode* isFamily() const {return NULL;}
- //VTaskNode* isTask() const {return NULL;}
- //VAliasNode* isAlias() const {return NULL;}
- //virtual VAttribute* isAttribute() const {return NULL;}
-
bool isTopLevel() const;
- //bool isServer() const {return false;}
-
- /*bool isSuite() const {return isTopLevel();}
- bool isFamily() const;
- bool isTask() const {return false;}
- bool isAlias() const;*/
-
-#if 0
- void beginUpdateAttrNum();
- void endUpdateAttrNum();
- short cachedAttrNum() const;
-#endif
+ //Attributes
+ const std::vector<VAttribute*> attr() const {return attr_;}
int attrNum(AttributeFilter* filter=0) const;
+ VAttribute* attribute(int,AttributeFilter *filter=0) const;
+ VAttribute* attributeForType(int,VAttributeType*) const;
+ int indexOfAttribute(const VAttribute* a, AttributeFilter *filter) const;
+ VAttribute* findAttribute(QStringList aData);
+ VAttribute* findAttribute(const std::string& typeName,const std::string& name);
+ VAttribute* findAttribute(VAttributeType* type,const std::string& name);
- QStringList getAttributeData(int,VAttributeType*&);
- QStringList getAttributeData(int,AttributeFilter *filter=0);
- bool getAttributeData(const std::string& type,int row, QStringList&);
-#if 0
- VAttributeType* getAttributeType(int);
-#endif
- int getAttributeLineNum(int row,AttributeFilter *filter=0);
- QString attributeToolTip(int row,AttributeFilter *filter=0);
-
- //VNode* parent() const {return parent_;}
int numOfChildren() const { return static_cast<int>(children_.size());}
VNode* childAt(int index) const;
int indexOfChild(const VNode* vn) const;
@@ -176,24 +164,26 @@ public:
virtual void internalState(VNodeInternalState&) {}
bool hasAccessed() const;
- //bool isAncestor(const VNode* n) const;
std::vector<VNode*> ancestors(SortMode sortMode);
VNode* ancestorAt(int idx,SortMode sortMode);
+ virtual std::string flagsAsStr() const;
virtual bool isFlagSet(ecf::Flag::Type f) const;
int index() const {return index_;}
const std::string& nodeType();
- //const std::string& typeStr() const;
virtual QString toolTip();
- virtual void why(std::vector<std::string>& theReasonWhy) const;
- const std::string& abortedReason() const;
+ virtual void why(std::vector<std::string>& bottomUp,
+ std::vector<std::string>& topDown) const;
+
+ virtual void why(std::vector<std::string>& theReasonWhy) const {}
+
+ const std::string& abortedReason() const;
void statusChangeTime(QString&) const;
uint statusChangeTime() const;
- LogServer_ptr logServer();
bool logServer(std::string& host,std::string& port);
void triggerExpr(std::string&,std::string&) const;
@@ -212,27 +202,22 @@ protected:
void clear();
void addChild(VNode*);
void removeChild(VNode*);
-#if 0
- short currentAttrNum() const;
- bool isAttrNumInitialised() const {return attrNum_!=-1;}
-#endif
+ void scanAttr();
+ void rescanAttr();
+ void findAttributes(VAttributeType*,std::vector<VAttribute*>& v);
+
VNode* find(const std::vector<std::string>& pathVec);
virtual void check(VServerSettings* conf,bool) {}
virtual void check(VServerSettings* conf,const VNodeInternalState&) {}
void setIndex(int i) {index_=i;}
- VItemTmp_ptr findLimit(const std::string& path, const std::string& name);
+ VAttribute* findLimit(const std::string& path, const std::string& name);
static void triggersInChildren(VNode *n,VNode* nn,TriggerCollector* tlc);
- //static void scanForTriggered(VNode *n);
static void triggeredByChildren(VNode *n,VNode* parent,TriggerCollector* tlc);
node_ptr node_;
- //VNode* parent_;
std::vector<VNode*> children_;
-#if 0
- mutable short attrNum_;
- mutable short cachedAttrNum_;
-#endif
+ std::vector<VAttribute*> attr_;
int index_;
VNodeTriggerData* data_;
static std::string nodeMarkedForMoveRelPath_;
@@ -323,6 +308,7 @@ public:
std::string findVariable(const std::string& key,bool substitute=false) const;
std::string findInheritedVariable(const std::string& key,bool substitute=false) const;
+ std::string flagsAsStr() const;
bool isFlagSet(ecf::Flag::Type f) const;
void why(std::vector<std::string>& theReasonWhy) const;
@@ -344,7 +330,7 @@ private:
void updateCache(defs_ptr defs);
ServerHandler* server_;
- int totalNum_;
+ int totalNum_;
std::vector<int> totalNumInChild_;
std::vector<VNode*> nodes_;
bool triggeredScanned_;
diff --git a/Viewer/src/VNodeList.cpp b/Viewer/src/VNodeList.cpp
index fea80d0..80aac19 100644
--- a/Viewer/src/VNodeList.cpp
+++ b/Viewer/src/VNodeList.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VNodeList.hpp b/Viewer/src/VNodeList.hpp
index cb96667..886853b 100644
--- a/Viewer/src/VNodeList.hpp
+++ b/Viewer/src/VNodeList.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VParam.cpp b/Viewer/src/VParam.cpp
index 1e8247c..b1b6b94 100644
--- a/Viewer/src/VParam.cpp
+++ b/Viewer/src/VParam.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -10,17 +10,18 @@
#include "VParam.hpp"
-#include <QDebug>
-
#include "VProperty.hpp"
+static uint idCounter=0;
+
VParam::VParam(const std::string& name) :
name_(name),
qName_(QString::fromStdString(name)),
prop_(0),
colourPropName_("fill_colour"),
fontColourPropName_("font_colour"),
- typeColourPropName_("type_colour")
+ typeColourPropName_("type_colour"),
+ id_(idCounter++)
{
}
@@ -74,162 +75,3 @@ void VParam::notifyChange(VProperty* prop)
else if(prop->name() == typeColourPropName_)
typeColour_=prop->value().value<QColor>();
}
-
-/*
-void VParam::addAttributes(const std::map<std::string,std::string>& attr)
-{
- for(std::map<std::string,std::string>::const_iterator it=attr.begin(); it != attr.end(); it++)
- {
- std::string key=it->first;
- std::string val=it->second;
- if(isColour(val))
- {
- colourMap_[key]=toColour(val);
- }
- else if(isFont(val))
- {
- fontMap_[key]=toFont(val);
- }
- else if(isNumber(val))
- {
- numberMap_[key]=1;
- }
-
- textMap_[key]=val;
- }
-}
-
-std::string VParam::text(const std::string& key) const
-{
- std::map<std::string,std::string>::const_iterator it=textMap_.find(key);
- if(it != textMap_.end())
- return it->second;
-
- return std::string();
-}
-
-QColor VParam::colour(const std::string& key) const
-{
- std::map<std::string,QColor>::const_iterator it=colourMap_.find(key);
- if(it != colourMap_.end())
- return it->second;
-
- return QColor();
-}
-
-int VParam::number(const std::string& key) const
-{
- std::map<std::string,int>::const_iterator it=numberMap_.find(key);
- if(it != numberMap_.end())
- return it->second;
-
- return -1;
-}
-
-QFont VParam::font(const std::string& key) const
-{
- std::map<std::string,QFont>::const_iterator it=fontMap_.find(key);
- if(it != fontMap_.end())
- return it->second;
-
- return QFont();
-}
-
-bool VParam::isColour(const std::string& val)
-{
- return QString::fromStdString(val).simplified().startsWith("rgb");
-}
-
-bool VParam::isFont(const std::string& val)
-{
- return QString::fromStdString(val).simplified().startsWith("font");
-}
-
-bool VParam::isNumber(const std::string& val)
-{
- return false;
-}
-
-QColor VParam::toColour(const std::string& name)
-{
- QString qn=QString::fromStdString(name);
- qDebug() << qn;
- QColor col;
- QRegExp rx("rgb\\((\\d+),(\\d+),(\\d+)");
-
- if(rx.indexIn(qn) > -1 && rx.captureCount() == 3)
- {
- col=QColor(rx.cap(1).toInt(),
- rx.cap(2).toInt(),
- rx.cap(3).toInt());
-
- }
-
- qDebug() << col;
-
- return col;
-}
-
-QFont VParam::toFont(const std::string& name)
-{
- return QFont();
-}
-
-int VParam::toNumber(const std::string& name)
-{
- return 0;
-}
-
-
-void VParam::init(const std::string& parFile,const std::string id,std::map<std::string,std::map<std::string,std::string> >& vals)
-{
- //Parse param file using the boost JSON property tree parser
- using boost::property_tree::ptree;
- ptree pt;
-
- try
- {
- read_json(parFile,pt);
- }
- catch (const boost::property_tree::json_parser::json_parser_error& e)
- {
- std::string errorMessage = e.what();
- UserMessage::message(UserMessage::ERROR, true, std::string("Error, unable to parse JSON attributes file : " + errorMessage));
- return;
- }
-
- ptree::const_iterator itTop = pt.begin();
- if(itTop == pt.end() || itTop->first != id)
- {
- return;
- }
-
- //For each parameter
- for(ptree::const_iterator itPar = itTop->second.begin(); itPar != itTop->second.end(); ++itPar)
- {
- std::string name=itPar->first;
- ptree const &parPt = itPar->second;
-
- //std::map<QString,QString> vals;
- for(ptree::const_iterator itV = parPt.begin(); itV != parPt.end(); ++itV)
- {
- vals[name].insert(make_pair(itV->first,itV->second.get_value<std::string>()));
- }
- }
-}
-*/
-
-/*QStringList VParam::toList(const boost::property_tree::ptree& array)
-{
- QStringList lst;
- for(boost::property_tree::ptree::const_iterator it = array.begin(); it != array.end(); ++it)
- {
- std::string name=it->second.get_value<std::string>();
- lst << QString::fromStdString(name);
- }
-
- return lst;
-}
-*/
-
-
diff --git a/Viewer/src/VParam.hpp b/Viewer/src/VParam.hpp
index f5eb3b7..4ed7116 100644
--- a/Viewer/src/VParam.hpp
+++ b/Viewer/src/VParam.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -21,6 +21,7 @@ public:
explicit VParam(const std::string& name);
~VParam();
+ uint id() const {return id_;}
QString name() const {return qName_;}
const std::string& strName() const {return name_;}
@@ -30,7 +31,6 @@ public:
QColor typeColour() const {return typeColour_;}
void setProperty(VProperty*);
-
void notifyChange(VProperty*);
/*
@@ -68,6 +68,7 @@ protected:
QString colourPropName_;
QString fontColourPropName_;
QString typeColourPropName_;
+ int id_;
};
#endif
diff --git a/Viewer/src/VProperty.cpp b/Viewer/src/VProperty.cpp
index 482781f..4cf1c5d 100644
--- a/Viewer/src/VProperty.cpp
+++ b/Viewer/src/VProperty.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -10,7 +10,6 @@
#include "VProperty.hpp"
-#include <QDebug>
#include <QRegExp>
#include "Sound.hpp"
@@ -100,8 +99,6 @@ void VProperty::setDefaultValue(const std::string& val)
if(value_.isNull())
value_=defaultValue_;
-
- //qDebug() << "Prop:" << name_ << defaultValue_ << value_.value<QColor>();
}
void VProperty::setValue(const std::string& val)
@@ -496,9 +493,6 @@ QFont VProperty::toFont(const std::string& name)
if(size >=1 && size < 200)
f.setPointSize(size);
-
- //qDebug() << family << size
- //f.fromString(rx.cap(1));
}
return f;
diff --git a/Viewer/src/VProperty.hpp b/Viewer/src/VProperty.hpp
index ff53972..0bc7656 100644
--- a/Viewer/src/VProperty.hpp
+++ b/Viewer/src/VProperty.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -32,8 +32,8 @@ public:
class VPropertyVisitor
{
public:
- VPropertyVisitor() {};
- virtual ~VPropertyVisitor() {};
+ VPropertyVisitor() {}
+ virtual ~VPropertyVisitor() {}
virtual void visit(VProperty*)=0;
};
diff --git a/Viewer/src/VRepeat.cpp b/Viewer/src/VRepeat.cpp
deleted file mode 100644
index c863837..0000000
--- a/Viewer/src/VRepeat.cpp
+++ /dev/null
@@ -1,215 +0,0 @@
-//============================================================================
-// Copyright 2016 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not waive the privileges and immunities
-// granted to it by virtue of its status as an intergovernmental organisation
-// nor does it submit to any jurisdiction.
-//
-//============================================================================
-
-#include "VRepeat.hpp"
-
-#include <sstream>
-#include "RepeatAttr.hpp"
-#include "VNode.hpp"
-
-std::map<std::string,std::string> VRepeat::typeNames_;
-
-static long ecf_repeat_date_to_julian(long ddate);
-static long ecf_repeat_julian_to_date(long jdate);
-
-long ecf_repeat_julian_to_date(long jdate)
-{
- long x,y,d,m,e;
- long day,month,year;
-
- x = 4 * jdate - 6884477;
- y = (x / 146097) * 100;
- e = x % 146097;
- d = e / 4;
-
- x = 4 * d + 3;
- y = (x / 1461) + y;
- e = x % 1461;
- d = e / 4 + 1;
-
- x = 5 * d - 3;
- m = x / 153 + 1;
- e = x % 153;
- d = e / 5 + 1;
-
- if( m < 11 )
- month = m + 2;
- else
- month = m - 10;
-
-
- day = d;
- year = y + m / 11;
-
- return year * 10000 + month * 100 + day;
-}
-
-long ecf_repeat_date_to_julian(long ddate)
-{
- long m1,y1,a,b,c,d,j1;
-
- long month,day,year;
-
- year = ddate / 10000;
- ddate %= 10000;
- month = ddate / 100;
- ddate %= 100;
- day = ddate;
-
- if (0) {
- a = (14 - month) / 12;
- y1 = year + 4800 - a;
- m1 = month + 12*a - 3;
- j1 = day + (153*m1 + 2)/5 + 365*y1 + y1/4 - y1/100 + y1/400 - 32045;
- return j1 - 0.5;
- }
-
- if (month > 2)
- {
- m1 = month - 3;
- y1 = year;
- }
- else
- {
- m1 = month + 9;
- y1 = year - 1;
- }
- a = 146097*(y1/100)/4;
- d = y1 % 100;
- b = 1461*d/4;
- c = (153*m1+2)/5+day+1721119;
- j1 = a+b+c;
-
- return j1;
-}
-
-const std::string& VRepeat::type(const Repeat& r)
-{
- if(typeNames_.empty())
- {
- typeNames_["repeat date"]="date";
- typeNames_["repeat integer"]="integer";
- typeNames_["repeat string"]="string";
- typeNames_["repeat enumerated"]="enumerated";
- typeNames_["repeat day"]="day";
- }
-
- static std::string noTypeName="";
-
- std::string t=r.toString();
- for(std::map<std::string,std::string>::const_iterator it=typeNames_.begin(); it != typeNames_.end(); ++it)
- {
- if(t.find(it->first) == 0)
- return it->second;
- }
-
- return noTypeName;
-}
-
-const std::string& VRepeat::type(VNode* n)
-{
- if(n && n->node())
- {
- return VRepeat::type(n->node()->repeat());
- }
- static std::string noTypeName="";
- return noTypeName;
-}
-
-VRepeat* VRepeat::make(const Repeat& r)
-{
- const std::string t=VRepeat::type(r);
- if(t == "date")
- return new VRepeatDate(r);
- else if(t == "integer")
- return new VRepeatInt(r);
- else if(t == "string")
- return new VRepeatString(r);
- else if(t == "enumerated")
- return new VRepeatEnum(r);
- else if(t == "day")
- return new VRepeatDay(r);
-
- return NULL;
-}
-
-int VRepeatDate::endIndex() const
-{
- return (ecf_repeat_date_to_julian(repeat_.end()) -
- ecf_repeat_date_to_julian(repeat_.start())) / repeat_.step() + 1;
-}
-
-int VRepeatDate::currentIndex() const
-{
- int cur=(ecf_repeat_date_to_julian(repeat_.index_or_value()) -
- ecf_repeat_date_to_julian(repeat_.start())) / repeat_.step();
-
- //int gui = ecf_repeat_julian_to_date(ecf_repeat_date_to_julian(repeat_.start()) + cur * step());
- return cur;
-}
-
-std::string VRepeatDate::value(int index) const
-{
- std::stringstream ss;
- ss << (ecf_repeat_julian_to_date
- (ecf_repeat_date_to_julian(repeat_.start()) + index * repeat_.step()));
-
- return ss.str();
-}
-
-
-int VRepeatInt::endIndex() const
-{
- if(repeat_.step() >0)
- {
- int index=(repeat_.end() - repeat_.start()) / repeat_.step() + 1;
- int val=repeat_.start() + index*repeat_.step();
- while(val > repeat_.end() && index >=1)
- {
- index--;
- val=repeat_.start() + index*repeat_.step();
- }
- return index;
- }
- return 0;
-}
-
-int VRepeatInt::currentIndex() const
-{
- if(repeat_.step() >0)
- {
- return (repeat_.index_or_value() - repeat_.start())/repeat_.step();
- }
- return 0;
-}
-
-std::string VRepeatInt::value(int index) const
-{
- std::stringstream ss;
- ss << repeat_.start() + index*repeat_.step();
- return ss.str();
-}
-
-std::string VRepeatDay::value(int /*index*/) const
-{
- std::stringstream ss;
- ss << repeat_.step();
- return ss.str();
-}
-
-std::string VRepeatEnum::value(int index) const
-{
- return repeat_.value_as_string(index);
-}
-
-std::string VRepeatString::value(int index) const
-{
- return repeat_.value_as_string(index);
-}
diff --git a/Viewer/src/VRepeat.hpp b/Viewer/src/VRepeat.hpp
deleted file mode 100644
index a0c335b..0000000
--- a/Viewer/src/VRepeat.hpp
+++ /dev/null
@@ -1,94 +0,0 @@
-//============================================================================
-// Copyright 2016 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not waive the privileges and immunities
-// granted to it by virtue of its status as an intergovernmental organisation
-// nor does it submit to any jurisdiction.
-//
-//============================================================================
-
-#ifndef VREPEAT_HPP
-#define VREPEAT_HPP
-
-#include <string>
-#include <map>
-#include "RepeatAttr.hpp"
-
-class VNode;
-
-class VRepeat
-{
-public:
- enum ValyeType {StringType,IntType,NoType};
-
- virtual ~VRepeat() {}
- int startIndex() const {return 0;}
- virtual int endIndex() const=0;
- virtual int currentIndex() const=0;
- virtual int step() const {return repeat_.step();}
- virtual std::string value(int index) const=0;
- const std::string& type() const {return type_;}
- ValyeType valueType() const {return valueType_;}
-
- static VRepeat* make(const Repeat& r);
- static const std::string& type(const Repeat& r);
- static const std::string& type(VNode*);
-
-protected:
- VRepeat(const Repeat& r,const std::string& type,ValyeType t) : repeat_(r), type_(type), valueType_(t) {}
-
- const Repeat& repeat_;
- std::string type_;
- ValyeType valueType_;
- static std::map<std::string,std::string> typeNames_;
-};
-
-class VRepeatDate : public VRepeat
-{
-public:
- VRepeatDate(const Repeat& r) : VRepeat(r,"date",IntType) {}
- int endIndex() const;
- int currentIndex() const;
- std::string value(int index) const;
-};
-
-class VRepeatDay : public VRepeat
-{
-public:
- VRepeatDay(const Repeat& r) : VRepeat(r,"day",IntType) {}
- int endIndex() const {return 0;}
- int currentIndex() const {return 0;}
- std::string value(int index) const;
-};
-
-class VRepeatInt : public VRepeat
-{
-public:
- VRepeatInt(const Repeat& r) : VRepeat(r,"integer",IntType) {}
- int endIndex() const;
- int currentIndex() const;
- std::string value(int index) const;
-};
-
-class VRepeatEnum : public VRepeat
-{
-public:
- VRepeatEnum(const Repeat& r) : VRepeat(r,"enumeated",StringType) {}
- int endIndex() const {return repeat_.end();}
- int currentIndex() const {return repeat_.index_or_value();}
- std::string value(int index) const;
-};
-
-class VRepeatString : public VRepeat
-{
-public:
- VRepeatString(const Repeat& r) : VRepeat(r,"string",StringType) {}
- int endIndex() const {return repeat_.end();}
- int currentIndex() const {return repeat_.index_or_value();}
- std::string value(int index) const;
-};
-
-
-#endif // VREPEAT_HPP
-
diff --git a/Viewer/src/VRepeatAttr.cpp b/Viewer/src/VRepeatAttr.cpp
new file mode 100644
index 0000000..f66e6e6
--- /dev/null
+++ b/Viewer/src/VRepeatAttr.cpp
@@ -0,0 +1,418 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "VRepeatAttr.hpp"
+
+#include <sstream>
+
+#include "VAttributeType.hpp"
+#include "VNode.hpp"
+
+std::string VRepeatDateAttr::subType_("date");
+std::string VRepeatIntAttr::subType_("integer");
+std::string VRepeatStringAttr::subType_("string");
+std::string VRepeatEnumAttr::subType_("enumerated");
+std::string VRepeatDayAttr::subType_("day");
+
+static long ecf_repeat_date_to_julian(long ddate);
+static long ecf_repeat_julian_to_date(long jdate);
+
+long ecf_repeat_julian_to_date(long jdate)
+{
+ long x,y,d,m,e;
+ long day,month,year;
+
+ x = 4 * jdate - 6884477;
+ y = (x / 146097) * 100;
+ e = x % 146097;
+ d = e / 4;
+
+ x = 4 * d + 3;
+ y = (x / 1461) + y;
+ e = x % 1461;
+ d = e / 4 + 1;
+
+ x = 5 * d - 3;
+ m = x / 153 + 1;
+ e = x % 153;
+ d = e / 5 + 1;
+
+ if( m < 11 )
+ month = m + 2;
+ else
+ month = m - 10;
+
+
+ day = d;
+ year = y + m / 11;
+
+ return year * 10000 + month * 100 + day;
+}
+
+long ecf_repeat_date_to_julian(long ddate)
+{
+ long m1,y1,a,b,c,d,j1;
+
+ long month,day,year;
+
+ year = ddate / 10000;
+ ddate %= 10000;
+ month = ddate / 100;
+ ddate %= 100;
+ day = ddate;
+
+ if (0) {
+ a = (14 - month) / 12;
+ y1 = year + 4800 - a;
+ m1 = month + 12*a - 3;
+ j1 = day + (153*m1 + 2)/5 + 365*y1 + y1/4 - y1/100 + y1/400 - 32045;
+ return j1 - 0.5;
+ }
+
+ if (month > 2)
+ {
+ m1 = month - 3;
+ y1 = year;
+ }
+ else
+ {
+ m1 = month + 9;
+ y1 = year - 1;
+ }
+ a = 146097*(y1/100)/4;
+ d = y1 % 100;
+ b = 1461*d/4;
+ c = (153*m1+2)/5+day+1721119;
+ j1 = a+b+c;
+
+ return j1;
+}
+
+//================================
+// VRepeatAttrType
+//================================
+
+class VRepeatAttrType : public VAttributeType
+{
+public:
+ explicit VRepeatAttrType();
+ QString toolTip(QStringList d) const;
+ void encode(const Repeat&,QStringList&,const std::string&) const;
+
+private:
+ enum DataIndex {TypeIndex=0,SubtypeIndex=1,NameIndex=2,ValueIndex=3,StartIndex=4,EndIndex=5,StepIndex=6};
+};
+
+
+VRepeatAttrType::VRepeatAttrType() : VAttributeType("repeat")
+{
+ dataCount_=7;
+ searchKeyToData_["repeat_name"]=NameIndex;
+ searchKeyToData_["repeat_value"]=ValueIndex;
+ searchKeyToData_["name"]=NameIndex;
+ scanProc_=VRepeatAttr::scan;
+}
+
+QString VRepeatAttrType::toolTip(QStringList d) const
+{
+ QString t="<b>Type:</b> Repeat";
+ if(d.count() == dataCount_)
+ {
+ t+=" " + d[SubtypeIndex] + "<br>";
+
+ if(d[SubtypeIndex] != "day")
+ {
+ t+="<b>Name:</b> " + d[NameIndex] + "<br>";
+ t+="<b>Value:</b> " + d[ValueIndex] + "<br>";
+ t+="<b>Start:</b> " + d[StartIndex] + "<br>";
+ t+="<b>End:</b> " + d[EndIndex] + "<br>";
+ t+="<b>Step:</b> " + d[StepIndex];
+ }
+ else
+ {
+ t+="<b>Step:</b> " + d[StepIndex];
+ }
+ }
+
+ return t;
+}
+
+void VRepeatAttrType::encode(const Repeat& r,QStringList& data,const std::string& type) const
+{
+ //We try to avoid creating a VRepeat object everytime we are here
+ //std::string type=VRepeat::type(r);
+
+ data << qName_ << QString::fromStdString(type) <<
+ QString::fromStdString(r.name()) <<
+ QString::fromStdString(r.valueAsString()) <<
+ QString::fromStdString(r.value_as_string(r.start())) <<
+ QString::fromStdString(r.value_as_string(r.end())) <<
+ QString::number(r.step());
+
+}
+
+static VRepeatAttrType atype;
+
+//=====================================================
+//
+// VRepeatAttr
+//
+//=====================================================
+
+VRepeatAttr::VRepeatAttr(VNode *parent) : VAttribute(parent,0)
+{
+ //name_=e.name_or_number();
+}
+
+VAttributeType* VRepeatAttr::type() const
+{
+ return &atype;
+}
+
+int VRepeatAttr::step() const
+{
+ if(node_ptr node=parent_->node())
+ {
+ const Repeat& r=node->repeat();
+ return r.step();
+ }
+ return 0;
+}
+
+QStringList VRepeatAttr::data() const
+{
+ QStringList s;
+ if(parent_->node_)
+ {
+ const Repeat& r=parent_->node_->repeat();
+ atype.encode(r,s,subType());
+ }
+ return s;
+}
+
+std::string VRepeatAttr::strName() const
+{
+ if(parent_->node_)
+ {
+ const Repeat& r=parent_->node_->repeat();
+ if(r.empty() == false)
+ return r.name();
+ }
+ return std::string();
+}
+
+void VRepeatAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
+{
+ if(vnode->node_)
+ {
+ const Repeat& r=vnode->node_->repeat();
+ if(r.empty() == false)
+ {
+ std::string t=r.toString();
+
+ VRepeatAttr *a=0;
+
+ if(t.find("date") != std::string::npos)
+ a=new VRepeatDateAttr(vnode);
+ else if(t.find("integer") != std::string::npos)
+ a=new VRepeatIntAttr(vnode);
+ else if(t.find("string") != std::string::npos)
+ a=new VRepeatStringAttr(vnode);
+ else if(t.find("enumerated") != std::string::npos)
+ a=new VRepeatEnumAttr(vnode);
+ else if(t.find("day") != std::string::npos)
+ a=new VRepeatDayAttr(vnode);
+
+ if(a)
+ vec.push_back(a);
+ }
+ }
+}
+
+//=====================================================
+//
+// VRepeatDateAttr
+//
+//=====================================================
+
+int VRepeatDateAttr::endIndex() const
+{
+ if(node_ptr node=parent_->node())
+ {
+ const Repeat& r=node->repeat();
+ return (ecf_repeat_date_to_julian(r.end()) -
+ ecf_repeat_date_to_julian(r.start())) / r.step() + 1;
+ }
+ return 0;
+}
+
+int VRepeatDateAttr::currentIndex() const
+{
+ if(node_ptr node=parent_->node())
+ {
+ const Repeat& r=node->repeat();
+ int cur=(ecf_repeat_date_to_julian(r.index_or_value()) -
+ ecf_repeat_date_to_julian(r.start())) / r.step();
+ return cur;
+ }
+ return 0;
+}
+
+std::string VRepeatDateAttr::value(int index) const
+{
+ std::stringstream ss;
+ if(node_ptr node=parent_->node())
+ {
+ const Repeat& r=node->repeat();
+ ss << (ecf_repeat_julian_to_date
+ (ecf_repeat_date_to_julian(r.start()) + index * r.step()));
+ }
+
+ return ss.str();
+}
+
+//=====================================================
+//
+// VRepeatIntAttr
+//
+//=====================================================
+
+int VRepeatIntAttr::endIndex() const
+{
+ if(node_ptr node=parent_->node())
+ {
+ const Repeat& r=node->repeat();
+ if(r.step() >0)
+ {
+ int index=(r.end() - r.start()) / r.step() + 1;
+ int val=r.start() + index*r.step();
+ while(val > r.end() && index >=1)
+ {
+ index--;
+ val=r.start() + index*r.step();
+ }
+ return index;
+ }
+ }
+ return 0;
+}
+
+int VRepeatIntAttr::currentIndex() const
+{
+ if(node_ptr node=parent_->node())
+ {
+ const Repeat& r=node->repeat();
+ if(r.step() >0)
+ return (r.index_or_value() - r.start())/r.step();
+ }
+ return 0;
+}
+
+std::string VRepeatIntAttr::value(int index) const
+{
+ std::stringstream ss;
+ if(node_ptr node=parent_->node())
+ {
+ const Repeat& r=node->repeat();
+ ss << r.start() + index*r.step();
+ }
+ return ss.str();
+}
+
+//=====================================================
+//
+// VRepeatDayAttr
+//
+//=====================================================
+
+std::string VRepeatDayAttr::value(int /*index*/) const
+{
+ std::stringstream ss;
+ if(node_ptr node=parent_->node())
+ {
+ const Repeat& r=node->repeat();
+ ss << r.step();
+ }
+ return ss.str();
+}
+
+//=====================================================
+//
+// VRepeatEnumAttr
+//
+//=====================================================
+
+std::string VRepeatEnumAttr::value(int index) const
+{
+ if(node_ptr node=parent_->node())
+ {
+ const Repeat& r=node->repeat();
+ return r.value_as_string(index);
+ }
+ return std::string();
+}
+
+int VRepeatEnumAttr::endIndex() const
+{
+ if(node_ptr node=parent_->node())
+ {
+ const Repeat& r=node->repeat();
+ return r.end();
+ }
+ return 0;
+}
+
+int VRepeatEnumAttr::currentIndex() const
+{
+ if(node_ptr node=parent_->node())
+ {
+ const Repeat& r=node->repeat();
+ return r.index_or_value();
+ }
+ return 0;
+}
+
+//=====================================================
+//
+// VRepeatStringAttr
+//
+//=====================================================
+
+std::string VRepeatStringAttr::value(int index) const
+{
+ if(node_ptr node=parent_->node())
+ {
+ const Repeat& r=node->repeat();
+ return r.value_as_string(index);
+ }
+ return std::string();
+}
+
+int VRepeatStringAttr::endIndex() const
+{
+ if(node_ptr node=parent_->node())
+ {
+ const Repeat& r=node->repeat();
+ return r.end();
+ }
+ return 0;
+}
+
+int VRepeatStringAttr::currentIndex() const
+{
+ if(node_ptr node=parent_->node())
+ {
+ const Repeat& r=node->repeat();
+ return r.index_or_value();
+ }
+ return 0;
+}
+
+
diff --git a/Viewer/src/VRepeatAttr.hpp b/Viewer/src/VRepeatAttr.hpp
new file mode 100644
index 0000000..4869568
--- /dev/null
+++ b/Viewer/src/VRepeatAttr.hpp
@@ -0,0 +1,107 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#ifndef VREPEATATTR_HPP
+#define VREPEATATTR_HPP
+
+#include "VAttribute.hpp"
+#include <string>
+#include <QStringList>
+
+class VAttributeType;
+class VNode;
+class Repeat;
+
+class VRepeatAttr : public VAttribute
+{
+public:
+ VRepeatAttr(VNode *parent);
+
+ int startIndex() const {return 0;}
+ virtual int endIndex() const=0;
+ virtual int currentIndex() const=0;
+ int step() const;
+ virtual std::string value(int index) const=0;
+
+ VAttributeType* type() const;
+ QStringList data() const;
+ std::string strName() const;
+
+ static void scan(VNode* vnode,std::vector<VAttribute*>& vec);
+};
+
+class VRepeatDateAttr : public VRepeatAttr
+{
+public:
+ VRepeatDateAttr(VNode* n) : VRepeatAttr(n) {}
+ int endIndex() const;
+ int currentIndex() const;
+ std::string value(int index) const;
+ const std::string& subType() const {return subType_;}
+
+protected:
+ static std::string subType_;
+};
+
+class VRepeatDayAttr : public VRepeatAttr
+{
+public:
+ VRepeatDayAttr(VNode* n) : VRepeatAttr(n) {}
+ int endIndex() const {return 0;}
+ int currentIndex() const {return 0;}
+ std::string value(int index) const;
+ const std::string& subType() const {return subType_;}
+
+protected:
+ static std::string subType_;
+};
+
+class VRepeatIntAttr : public VRepeatAttr
+{
+public:
+ VRepeatIntAttr(VNode* n) : VRepeatAttr(n) {}
+ int endIndex() const;
+ int currentIndex() const;
+ std::string value(int index) const;
+ const std::string& subType() const {return subType_;}
+
+protected:
+ static std::string subType_;
+};
+
+class VRepeatEnumAttr : public VRepeatAttr
+{
+public:
+ VRepeatEnumAttr(VNode* n) : VRepeatAttr(n) {}
+ int endIndex() const;
+ int currentIndex() const;
+ std::string value(int index) const;
+ const std::string& subType() const {return subType_;}
+
+protected:
+ static std::string subType_;
+};
+
+class VRepeatStringAttr : public VRepeatAttr
+{
+public:
+ VRepeatStringAttr(VNode* n) : VRepeatAttr(n) {}
+ int endIndex() const;
+ int currentIndex() const;
+ std::string value(int index) const;
+ const std::string& subType() const {return subType_;}
+
+protected:
+ static std::string subType_;
+};
+
+
+#endif // VREPEATATTR_HPP
+
diff --git a/Viewer/src/VReply.cpp b/Viewer/src/VReply.cpp
index 248fa27..d8c1dc2 100644
--- a/Viewer/src/VReply.cpp
+++ b/Viewer/src/VReply.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VReply.hpp b/Viewer/src/VReply.hpp
index b6b0964..1749cb7 100644
--- a/Viewer/src/VReply.hpp
+++ b/Viewer/src/VReply.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -37,9 +37,9 @@ public:
const std::string& text() const {return text_;}
const std::vector<std::string>& textVec() const {return textVec_;}
Status status() const {return status_;}
- const std::string fileName() const {return fileName_;}
+ const std::string& fileName() const {return fileName_;}
FileReadMode fileReadMode() const {return readMode_;}
- const std::string fileReadMethod() {return readMethod_;}
+ const std::string& fileReadMethod() {return readMethod_;}
VFile_ptr tmpFile() const {return tmpFile_;}
VDir_ptr directory() const {return dir_;}
const std::vector<Zombie>& zombies() const {return zombies_;}
diff --git a/Viewer/src/VSState.cpp b/Viewer/src/VSState.cpp
index cc9cfc1..ddc8593 100644
--- a/Viewer/src/VSState.cpp
+++ b/Viewer/src/VSState.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VSState.hpp b/Viewer/src/VSState.hpp
index 69f7653..230504e 100644
--- a/Viewer/src/VSState.hpp
+++ b/Viewer/src/VSState.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VServerSettings.cpp b/Viewer/src/VServerSettings.cpp
index e6465a5..1eff21a 100644
--- a/Viewer/src/VServerSettings.cpp
+++ b/Viewer/src/VServerSettings.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VServerSettings.hpp b/Viewer/src/VServerSettings.hpp
index c61659c..511f192 100644
--- a/Viewer/src/VServerSettings.hpp
+++ b/Viewer/src/VServerSettings.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VSettings.cpp b/Viewer/src/VSettings.cpp
index dca4ceb..7e43a20 100644
--- a/Viewer/src/VSettings.cpp
+++ b/Viewer/src/VSettings.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -14,8 +14,6 @@
#include "UiLog.hpp"
#include "UserMessage.hpp"
-#include <QDebug>
-
#include <sstream>
#include <boost/algorithm/string/join.hpp>
@@ -143,7 +141,7 @@ void VSettings::put(const std::string& key,const std::vector<std::string>& val)
boost::property_tree::ptree array;
for(std::vector<std::string>::const_iterator it=val.begin(); it != val.end(); ++it)
{
- array.push_back(std::make_pair("",(*it)));
+ array.push_back(std::make_pair("",boost::property_tree::ptree((*it))));
}
pt_.put_child(path_.path(key),array);
}
@@ -155,7 +153,7 @@ void VSettings::put(const std::string& key,const std::vector<int>& val)
{
std::stringstream ss;
ss << (*it);
- array.push_back(std::make_pair("",ss.str()));
+ array.push_back(std::make_pair("",boost::property_tree::ptree(ss.str())));
}
pt_.put_child(path_.path(key),array);
}
@@ -295,7 +293,7 @@ void VComboSettings::putQs(const std::string& key,QVariant val)
QVariant VComboSettings::getQs(const std::string& key)
{
#ifdef _UI_SETTINGS_DEBUG
- qDebug() << "qt group" << qs_.group();
+ UiLog().dbg() << "qt group " << qs_.group();
#endif
return qs_.value(QString::fromStdString(key));
}
@@ -305,7 +303,7 @@ void VComboSettings::beginGroup(const std::string &id)
VSettings::beginGroup(id);
qs_.beginGroup(QString::fromStdString(id));
#ifdef _UI_SETTINGS_DEBUG
- qDebug() << "qt group" << qs_.group();
+ UiLog().dbg() << "qt group " << qs_.group();
#endif
}
diff --git a/Viewer/src/VSettings.hpp b/Viewer/src/VSettings.hpp
index 5ea0038..8098785 100644
--- a/Viewer/src/VSettings.hpp
+++ b/Viewer/src/VSettings.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VTask.cpp b/Viewer/src/VTask.cpp
index 3acae35..d3cbe2d 100644
--- a/Viewer/src/VTask.cpp
+++ b/Viewer/src/VTask.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -11,6 +11,7 @@
#include "VNode.hpp"
#include "VReply.hpp"
#include "VTaskObserver.hpp"
+#include "Zombie.hpp"
VTask::VTask(Type t,VTaskObserver* obs) :
type_(t),
@@ -97,6 +98,12 @@ void VTask::status(Status s, bool broadcastIt)
if(broadcastIt)
broadcast();
}
+
+void VTask::setZombie(const Zombie& z)
+{
+ zombie_=z;
+}
+
void VTask::removeObserver(VTaskObserver* o)
{
std::vector<VTaskObserver*>::iterator it=std::find(observers_.begin(), observers_.end(),o);
diff --git a/Viewer/src/VTask.hpp b/Viewer/src/VTask.hpp
index ac11a2f..feae8e0 100644
--- a/Viewer/src/VTask.hpp
+++ b/Viewer/src/VTask.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -15,6 +15,7 @@
#include <vector>
#include "NodeFwd.hpp"
+#include "Zombie.hpp"
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
@@ -39,7 +40,7 @@ public:
enum Type {NoTask,CommandTask,OverviewTask,WhyTask,ManualTask,ScriptTask,
JobTask,MessageTask,OutputTask,StatsTask,NewsTask,SyncTask,ResetTask,SuiteAutoRegisterTask,
SuiteListTask,ScriptEditTask,ScriptPreprocTask,ScriptSubmitTask,HistoryTask,LogOutTask,
- ZombieListTask};
+ ZombieListTask,ZombieCommandTask};
enum Status {NOSTATUS,QUEUED,RUNNING,FINISHED,CANCELLED,ABORTED,REJECTED};
virtual ~VTask();
@@ -56,11 +57,13 @@ public:
const std::vector<std::string>& contents() const {return contents_;}
const NameValueVec& vars() const {return vars_;}
VReply* reply() const {return reply_;}
+ const Zombie& zombie() const {return zombie_;}
void param(const std::string& key,const std::string& val) {params_[key]=val;}
void command(const std::vector<std::string>& cmd) {command_=cmd;}
void contents(const std::vector<std::string>& c) {contents_=c;}
void vars(const NameValueVec& v) {vars_=v;}
+ void setZombie(const Zombie&);
//When it is called the observers are notified about the change in status.
void status(Status s,bool broadcast=true);
@@ -86,6 +89,7 @@ protected:
VNode *node_;
std::vector<VTaskObserver*> observers_;
VReply* reply_;
+ Zombie zombie_;
};
#endif
diff --git a/Viewer/src/VTaskNode.cpp b/Viewer/src/VTaskNode.cpp
index 8d00bd2..6ff24d5 100644
--- a/Viewer/src/VTaskNode.cpp
+++ b/Viewer/src/VTaskNode.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VTaskNode.hpp b/Viewer/src/VTaskNode.hpp
index cb02d45..0004550 100644
--- a/Viewer/src/VTaskNode.hpp
+++ b/Viewer/src/VTaskNode.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VTaskObserver.hpp b/Viewer/src/VTaskObserver.hpp
index ac91124..04d024a 100644
--- a/Viewer/src/VTaskObserver.hpp
+++ b/Viewer/src/VTaskObserver.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VTimeAttr.cpp b/Viewer/src/VTimeAttr.cpp
new file mode 100644
index 0000000..ad0970b
--- /dev/null
+++ b/Viewer/src/VTimeAttr.cpp
@@ -0,0 +1,190 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "VTimeAttr.hpp"
+#include "VAttributeType.hpp"
+#include "VNode.hpp"
+
+//================================
+// VTimeAttrType
+//================================
+
+class VTimeAttrType : public VAttributeType
+{
+public:
+ explicit VTimeAttrType();
+ QString toolTip(QStringList d) const;
+ void encode(const ecf::TimeAttr& d,QStringList& data);
+ void encode(const ecf::TodayAttr& d,QStringList& data);
+ void encode(const ecf::CronAttr& d,QStringList& data);
+
+private:
+ enum DataIndex {TypeIndex=0,NameIndex=1};
+};
+
+
+VTimeAttrType::VTimeAttrType() : VAttributeType("time")
+{
+ dataCount_=2;
+ searchKeyToData_["time_name"]=NameIndex;
+ searchKeyToData_["name"]=NameIndex;
+ scanProc_=VTimeAttr::scan;
+}
+
+QString VTimeAttrType::toolTip(QStringList d) const
+{
+ QString t="<b>Type:</b> Time<br>";
+ if(d.count() == dataCount_)
+ {
+ t+="<b>Name:</b> " + d[NameIndex];
+ }
+ return t;
+}
+
+void VTimeAttrType::encode(const ecf::TimeAttr& d,QStringList& data)
+{
+ data << qName_ << QString::fromStdString(d.name());
+}
+
+void VTimeAttrType::encode(const ecf::TodayAttr& d,QStringList& data)
+{
+ data << qName_ << QString::fromStdString(d.name());
+}
+
+void VTimeAttrType::encode(const ecf::CronAttr& d,QStringList& data)
+{
+ data << qName_ << QString::fromStdString(d.name());
+}
+
+static VTimeAttrType atype;
+
+//=====================================================
+//
+// VTimeAttr
+//
+//=====================================================
+
+VTimeAttr::VTimeAttr(VNode *parent,const ecf::TimeAttr& t, int index) :
+ VAttribute(parent,index),
+ dataType_(TimeData)
+{
+ //name_=t.name();
+}
+
+VTimeAttr::VTimeAttr(VNode *parent,const ecf::TodayAttr& t, int index) :
+ VAttribute(parent,index),
+ dataType_(TodayData)
+{
+ //name_=t.name();
+}
+
+VTimeAttr::VTimeAttr(VNode *parent,const ecf::CronAttr& t, int index) :
+ VAttribute(parent,index),
+ dataType_(CronData)
+{
+ //name_=t.name();
+}
+
+VAttributeType* VTimeAttr::type() const
+{
+ return &atype;
+}
+
+QStringList VTimeAttr::data() const
+{
+ QStringList s;
+ if(parent_->node_)
+ {
+ if(dataType_ == TimeData)
+ {
+ const std::vector<ecf::TimeAttr>& v=parent_->node_->timeVec();
+ if(index_ < v.size())
+ atype.encode(v[index_],s);
+ }
+ else if(dataType_ == TodayData)
+ {
+ const std::vector<ecf::TodayAttr>& v=parent_->node_->todayVec();
+ if(index_ < v.size())
+ atype.encode(v[index_],s);
+ }
+ else if(dataType_ == CronData)
+ {
+ const std::vector<ecf::CronAttr>& v=parent_->node_->crons();
+ if(index_ < v.size())
+ atype.encode(v[index_],s);
+ }
+ }
+ return s;
+}
+
+std::string VTimeAttr::strName() const
+{
+ if(parent_->node_)
+ {
+ if(dataType_ == TimeData)
+ {
+ const std::vector<ecf::TimeAttr>& v=parent_->node_->timeVec();
+ if(index_ < v.size())
+ return v[index_].name();
+ }
+ else if(dataType_ == TodayData)
+ {
+ const std::vector<ecf::TodayAttr>& v=parent_->node_->todayVec();
+ if(index_ < v.size())
+ return v[index_].name();
+ }
+ else if(dataType_ == CronData)
+ {
+ const std::vector<ecf::CronAttr>& v=parent_->node_->crons();
+ if(index_ < v.size())
+ return v[index_].name();
+ }
+ }
+ return std::string();
+}
+
+void VTimeAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
+{
+ if(vnode->node_)
+ {
+ const std::vector<ecf::TimeAttr>& tV=vnode->node_->timeVec();
+ const std::vector<ecf::TodayAttr>& tdV=vnode->node_->todayVec();
+ const std::vector<ecf::CronAttr>& cV=vnode->node_->crons();
+
+ int n=tV.size();
+ for(size_t i=0; i < n; i++)
+ {
+ vec.push_back(new VTimeAttr(vnode,tV[i],i));
+ }
+
+ n=tdV.size();
+ for(size_t i=0; i < n; i++)
+ {
+ vec.push_back(new VTimeAttr(vnode,tdV[i],i));
+ }
+
+ n=cV.size();
+ for(size_t i=0; i < n; i++)
+ {
+ vec.push_back(new VTimeAttr(vnode,cV[i],i));
+ }
+ }
+}
+
+int VTimeAttr::totalNum(VNode* vnode)
+{
+ if(vnode->node_)
+ {
+ return vnode->node_->timeVec().size() +
+ vnode->node_->todayVec().size() +
+ vnode->node_->crons().size();
+ }
+ return 0;
+}
diff --git a/Viewer/src/VTimeAttr.hpp b/Viewer/src/VTimeAttr.hpp
new file mode 100644
index 0000000..dea4d9a
--- /dev/null
+++ b/Viewer/src/VTimeAttr.hpp
@@ -0,0 +1,48 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#ifndef VTIME_HPP
+#define VTIME_HPP
+
+#include "VAttribute.hpp"
+
+#include <QStringList>
+#include <vector>
+
+#include "CronAttr.hpp"
+#include "TimeAttr.hpp"
+#include "TodayAttr.hpp"
+
+class AttributeFilter;
+class VAttributeType;
+class VNode;
+
+class VTimeAttr : public VAttribute
+{
+
+public:
+ enum DataType {TimeData,TodayData,CronData};
+
+ VTimeAttr(VNode *parent,const ecf::TimeAttr&,int index);
+ VTimeAttr(VNode *parent,const ecf::TodayAttr&,int index);
+ VTimeAttr(VNode *parent,const ecf::CronAttr&,int index);
+
+ VAttributeType* type() const;
+ QStringList data() const;
+ std::string strName() const;
+
+ static void scan(VNode* vnode,std::vector<VAttribute*>& vec);
+ static int totalNum(VNode* vnode);
+
+protected:
+ DataType dataType_;
+};
+
+#endif // VTIME_HPP
diff --git a/Viewer/src/VTree.cpp b/Viewer/src/VTree.cpp
index ca7b140..9e153c1 100644
--- a/Viewer/src/VTree.cpp
+++ b/Viewer/src/VTree.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -99,10 +99,10 @@ int VTreeNode::attrRow(int row,AttributeFilter *filter) const
int VTreeNode::attrNum(AttributeFilter *filter) const
{
- if(!isAttrInitialised())
+ if(isAttrInitialised() == false)
attrNum_=vnode_->attrNum(filter);
- return attrNum_;
+ return attrNum_;
}
void VTreeNode::updateAttrNum(AttributeFilter *filter)
@@ -148,8 +148,6 @@ int VTreeNode::totalNumOfChildren() const
return num;
}
-
-
VTreeSuiteNode::VTreeSuiteNode(VNode* n,VTreeNode* parent) : VTreeNode(n,parent), num_(0)
{
}
@@ -173,7 +171,8 @@ int VTreeSuiteNode::totalNumOfChildren() const
VTree::VTree(VTreeServer* server) :
VTreeNode(server->realServer()->vRoot(),0),
- server_(server)
+ server_(server),
+ totalNum_(0)
{
}
@@ -277,8 +276,8 @@ void VTree::remove(VTreeNode* node)
{
removeChildren(node);
p->children_.erase(it);
- delete node;
nodeVec_[node->vnode()->index()]=NULL;
+ delete node;
totalNum_--;
assert(totalNum_ >=0);
}
diff --git a/Viewer/src/VTree.hpp b/Viewer/src/VTree.hpp
index daca6a9..39b4937 100644
--- a/Viewer/src/VTree.hpp
+++ b/Viewer/src/VTree.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VTriggerAttr.cpp b/Viewer/src/VTriggerAttr.cpp
new file mode 100644
index 0000000..e9c097e
--- /dev/null
+++ b/Viewer/src/VTriggerAttr.cpp
@@ -0,0 +1,139 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "VTriggerAttr.hpp"
+#include "VAttributeType.hpp"
+#include "VNode.hpp"
+
+#include "NodeAttr.hpp"
+
+//================================
+// VTriggerAttrType
+//================================
+
+class VTriggerAttrType : public VAttributeType
+{
+public:
+ explicit VTriggerAttrType();
+ QString toolTip(QStringList d) const;
+ void encodeTrigger(Expression*,QStringList&) const;
+ void encodeComplete(Expression*,QStringList&) const;
+
+private:
+ enum DataIndex {TypeIndex=0,CompleteIndex=1,ExprIndex=2};
+};
+
+
+VTriggerAttrType::VTriggerAttrType() : VAttributeType("trigger")
+{
+ dataCount_=3;
+ searchKeyToData_["trigger_type"]=CompleteIndex;
+ searchKeyToData_["trigger_expression"]=ExprIndex;
+ searchKeyToData_["name"]=TypeIndex;
+ scanProc_=VTriggerAttr::scan;
+}
+
+QString VTriggerAttrType::toolTip(QStringList d) const
+{
+ QString t;
+ if(d.count() == dataCount_)
+ {
+ if(d[CompleteIndex] == "0")
+ t+="<b>Type:</b> Trigger<br>";
+ else if(d[CompleteIndex] == "1")
+ t+="<b>Type:</b> Complete<br>";
+ else
+ return t;
+
+ t+="<b>Expression:</b> " + d[ExprIndex];
+ }
+ return t;
+}
+
+void VTriggerAttrType::encodeTrigger(Expression *e,QStringList& data) const
+{
+ data << qName_ << "0" << QString::fromStdString(e->expression());
+}
+
+void VTriggerAttrType::encodeComplete(Expression *e,QStringList& data) const
+{
+ data << qName_ << "1" << QString::fromStdString(e->expression());
+}
+
+static VTriggerAttrType atype;
+
+//=====================================================
+//
+// VTriggerAttr
+//
+//=====================================================
+
+VTriggerAttr::VTriggerAttr(VNode *parent,Expression* e, int index) :
+ VAttribute(parent,index)
+{
+}
+
+VAttributeType* VTriggerAttr::type() const
+{
+ return &atype;
+}
+
+QStringList VTriggerAttr::data() const
+{
+ QStringList s;
+ if(node_ptr node=parent_->node())
+ {
+ if(index_ == 0)
+ {
+ atype.encodeTrigger(node->get_trigger(),s);
+ }
+ else
+ {
+ atype.encodeComplete(node->get_complete(),s);
+ }
+ }
+ return s;
+}
+
+std::string VTriggerAttr::strName() const
+{
+ return std::string("trigger");
+}
+
+void VTriggerAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
+{
+ if(node_ptr node=vnode->node())
+ {
+ Expression* eT=node->get_trigger();
+ Expression* eC=node->get_complete();
+
+ if(eT)
+ vec.push_back(new VTriggerAttr(vnode,eT,0));
+
+ if(eC)
+ vec.push_back(new VTriggerAttr(vnode,eC,1));
+ }
+}
+
+void VTriggerAttr::expressions(const VNode* vnode,std::string& trigger, std::string& complete)
+{
+ if(node_ptr node=vnode->node())
+ {
+ Expression* eT=node->get_trigger();
+ Expression* eC=node->get_complete();
+
+ if(eT)
+ trigger=eT->expression();
+
+ if(eC)
+ complete=eC->expression();
+ }
+}
+
diff --git a/Viewer/src/VTriggerAttr.hpp b/Viewer/src/VTriggerAttr.hpp
new file mode 100644
index 0000000..5e00ecb
--- /dev/null
+++ b/Viewer/src/VTriggerAttr.hpp
@@ -0,0 +1,40 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#ifndef VTRIGGERATTR_HPP
+#define VTRIGGERATTR_HPP
+
+#include "VAttribute.hpp"
+
+#include <QStringList>
+#include <vector>
+
+class AttributeFilter;
+class VAttributeType;
+class VNode;
+
+class Expression;
+
+class VTriggerAttr : public VAttribute
+{
+
+public:
+ VTriggerAttr(VNode *parent,Expression*, int index);
+
+ VAttributeType* type() const;
+ QStringList data() const;
+ std::string strName() const;
+
+ static void scan(VNode* vnode,std::vector<VAttribute*>& vec);
+ static void expressions(const VNode* vnode,std::string& trigger, std::string& complete);
+};
+
+#endif // VTRIGGERATTR_HPP
+
diff --git a/Viewer/src/VUserVarAttr.cpp b/Viewer/src/VUserVarAttr.cpp
new file mode 100644
index 0000000..8c799f3
--- /dev/null
+++ b/Viewer/src/VUserVarAttr.cpp
@@ -0,0 +1,144 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#include "VUserVarAttr.hpp"
+#include "VAttributeType.hpp"
+#include "VNode.hpp"
+
+#include "NodeAttr.hpp"
+
+//================================
+// VUserVarAttrType
+//================================
+
+class VUserVarAttrType : public VAttributeType
+{
+public:
+ explicit VUserVarAttrType();
+ QString toolTip(QStringList d) const;
+ void encode(const Variable&,QStringList&) const;
+
+private:
+ enum DataIndex {TypeIndex=0,NameIndex=1,ValueIndex=2};
+};
+
+
+VUserVarAttrType::VUserVarAttrType() : VAttributeType("var")
+{
+ dataCount_=3;
+ searchKeyToData_["var_name"]=NameIndex;
+ searchKeyToData_["var_value"]=ValueIndex;
+ searchKeyToData_["var_type"]=TypeIndex;
+ searchKeyToData_["name"]=NameIndex;
+ scanProc_=VUserVarAttr::scan;
+}
+
+QString VUserVarAttrType::toolTip(QStringList d) const
+{
+ return QString();
+}
+
+void VUserVarAttrType::encode(const Variable& v,QStringList& data) const
+{
+ data << qName_ <<
+ QString::fromStdString(v.name()) <<
+ QString::fromStdString(v.theValue());
+}
+
+static VUserVarAttrType atype;
+
+//=====================================================
+//
+// VUserVarAttr
+//
+//=====================================================
+
+VUserVarAttr::VUserVarAttr(VNode *parent,const Variable& v, int index) : VAttribute(parent,index)
+{
+ //name_=v.name();
+}
+
+VAttributeType* VUserVarAttr::type() const
+{
+ return &atype;
+}
+
+QStringList VUserVarAttr::data() const
+{
+ QStringList s;
+
+ //Node
+ if(parent_->isServer() == 0)
+ {
+ if(parent_->node_)
+ {
+ const std::vector<Variable>& v=parent_->node_->variables();
+ atype.encode(v[index_],s);
+ }
+ }
+ //Server
+ else
+ {
+ std::vector<Variable> v;
+ parent_->variables(v);
+ atype.encode(v[index_],s);
+ }
+
+ return s;
+}
+
+std::string VUserVarAttr::strName() const
+{
+ //Node
+ if(parent_->isServer() == 0)
+ {
+ if(parent_->node_)
+ {
+ const std::vector<Variable>& v=parent_->node_->variables();
+ return v[index_].name();
+ }
+ }
+ //Server
+ else
+ {
+ std::vector<Variable> v;
+ parent_->variables(v);
+ return v[index_].name();
+ }
+ return std::string();
+}
+
+void VUserVarAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
+{
+ //Node
+ if(vnode->isServer() == 0)
+ {
+ if(vnode->node_)
+ {
+ const std::vector<Variable>& v=vnode->node_->variables();
+ int n=v.size();
+ for(size_t i=0; i < n; i++)
+ {
+ vec.push_back(new VUserVarAttr(vnode,v[i],i));
+ }
+ }
+ }
+ //Server
+ else
+ {
+ std::vector<Variable> v;
+ vnode->variables(v);
+ int n=v.size();
+ for(size_t i=0; i < n; i++)
+ {
+ vec.push_back(new VUserVarAttr(vnode,v[i],i));
+ }
+ }
+}
diff --git a/Viewer/src/FileWatcher.hpp b/Viewer/src/VUserVarAttr.hpp
similarity index 53%
copy from Viewer/src/FileWatcher.hpp
copy to Viewer/src/VUserVarAttr.hpp
index 2e33bf6..93975e6 100644
--- a/Viewer/src/FileWatcher.hpp
+++ b/Viewer/src/VUserVarAttr.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -8,30 +8,30 @@
//
//============================================================================
-#ifndef VIEWER_SRC_FILEWATCHER_HPP_
-#define VIEWER_SRC_FILEWATCHER_HPP_
+#ifndef VUSERVARATTR_HPP
+#define VUSERVARATTR_HPP
+
+#include "VAttribute.hpp"
-#include <QFileSystemWatcher>
-#include <QFile>
#include <QStringList>
+#include <string>
+#include <vector>
-class FileWatcher : public QFileSystemWatcher
-{
-Q_OBJECT
+class AttributeFilter;
+class VAttributeType;
+class VNode;
+class Variable;
+class VUserVarAttr : public VAttribute
+{
public:
- FileWatcher(const std::string& filePath,qint64 offset,QObject* parent);
+ VUserVarAttr(VNode *parent,const Variable&,int index);
-protected Q_SLOTS:
- void slotChanged(const QString& path);
+ VAttributeType* type() const;
+ QStringList data() const;
+ std::string strName() const;
-Q_SIGNALS:
- void linesAppended(QStringList);
-
-protected:
- QFile file_;
- qint64 offset_;
+ static void scan(VNode* vnode,std::vector<VAttribute*>& vec);
};
-
-#endif /* VIEWER_SRC_FILEWATCHER_HPP_ */
+#endif
diff --git a/Viewer/src/VariableItemWidget.cpp b/Viewer/src/VariableItemWidget.cpp
index 7a5801e..6f4ca35 100644
--- a/Viewer/src/VariableItemWidget.cpp
+++ b/Viewer/src/VariableItemWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -10,7 +10,6 @@
#include "VariableItemWidget.hpp"
#include <QClipboard>
-#include <QDebug>
#include <QHeaderView>
#include <QItemSelectionModel>
#include <QMessageBox>
@@ -739,8 +738,8 @@ void VariableItemWidget::slotItemSelected(const QModelIndex& idx,const QModelInd
{
#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
UiLog().dbg() << "VariableItemWidget::slotItemSelected -->";
- qDebug() << " current:" << idx << "prev:" << prevIdx;
- qDebug() << " in view:" << varView->currentIndex();
+ UiLog().dbg() << " current: " << idx << " prev: " << prevIdx;
+ UiLog().dbg() << " in view: " << varView->currentIndex();
#endif
checkActionState();
@@ -837,14 +836,13 @@ void VariableItemWidget::editItem(const QModelIndex& index)
bool genVar;
#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
- UiLog().dbg() << "VariableItemWidget::editItem -->";
- qDebug() << " index:" << index;
+ UiLog().dbg() << "VariableItemWidget::editItem -->" << " index:" << index;
#endif
QModelIndex vIndex=sortModel_->mapToSource(index);
#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
- qDebug() << " vIndex:" << vIndex;
+ UiLog().dbg() << " vIndex:" << vIndex;
#endif
int block=-1;
@@ -869,7 +867,7 @@ void VariableItemWidget::editItem(const QModelIndex& index)
d->show();
#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
- qDebug() << "selected after:" << varView->currentIndex();
+ UiLog().dbg() << "selected after: " << varView->currentIndex();
#endif
}
@@ -943,16 +941,36 @@ void VariableItemWidget::removeItem(const QModelIndex& index)
//Get the data from the model
if(data && model_->variable(vIndex,name,value,genVar))
{
- if(QMessageBox::question(0,tr("Confirm: delete variable"),
+ std::string nodePath=data->fullPath();
+ std::string nodeName=data->name();
+
+ if(QMessageBox::question(0,tr("Confirm: delete variable"),
tr("Are you sure that you want to delete variable <b>") + name + "</b> from " +
QString::fromStdString(data->type()) + " <b>" + QString::fromStdString(data->name()) + "</b>?",
QMessageBox::Ok | QMessageBox::Cancel,QMessageBox::Cancel) == QMessageBox::Ok)
{
- //data might have deleted while the dialog was open
- //so we alter it via the model that can properly lookup the
- //data object
- model_->removeVariable(vIndex,name,value);
- }
+ //data might have been changed while the dialog was open
+ //so we cant use the data object but need to look up the variable again
+ int block=-1;
+ int row=-1;
+ data_->findVariable(name.toStdString(),nodePath,genVar,block,row);
+ if(block != -1 && row != -1)
+ {
+ data_->data(block)->remove(name.toStdString());
+ }
+ else
+ {
+ std::string msg="Could not delete variable=<b>" + name.toStdString() +
+ "</b> from node <b>" + nodeName + "</b>!";
+
+ if(block == -1)
+ msg+=" Node does not exist.";
+ else
+ msg+=" Variable does not exist.";
+
+ UserMessage::message(UserMessage::ERROR,true,msg);
+ }
+ }
}
}
@@ -961,7 +979,16 @@ void VariableItemWidget::slotVariableEdited()
VariablePropDialog* d=static_cast<VariablePropDialog*>(sender());
Q_ASSERT(d);
- model_->alterVariable(QModelIndex(),d->name(),d->value());
+ if(data_->count() > 0)
+ {
+ //This will call the ServerComThread so we
+ //do not know if it was successful or not. The model will be
+ //updated through the observer when the value will actually
+ //change.
+ //We always only perform the alter variable operation on the selected
+ //node i.e. on data(0) !!!
+ data_->data(0)->alter(d->name().toStdString(),d->value().toStdString());
+ }
}
void VariableItemWidget::slotVariableAdded()
@@ -1052,7 +1079,6 @@ void VariableItemWidget::on_shadowTb_clicked(bool showShadowed)
if(shadowProp_)
{
shadowProp_->setValue(showShadowed);
- qDebug() << shadowProp_->value().toBool();
}
sortModel_->slotShowShadowed(showShadowed);
}
@@ -1074,37 +1100,34 @@ void VariableItemWidget::toClipboard(QString txt) const
void VariableItemWidget::slotFilterTextChanged(QString text)
{
#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
- UiLog().dbg() << "VariableItemWidget::slotFilterTextChanged -->";
- qDebug() << "selected before:" << varView->currentIndex();
+ UiLog().dbg() << "VariableItemWidget::slotFilterTextChanged -->" <<
+ " selected before:" << varView->currentIndex();
#endif
sortModel_->setMatchText(text);
#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
- qDebug() << "selected after:" << varView->currentIndex();
- qDebug() << sortModel_->data(varView->currentIndex());
- //UiLog().dbg() << "<-- slotFilterTextChanged";
+ UiLog().dbg() << "selected after:" << varView->currentIndex() << " " <<
+ sortModel_->data(varView->currentIndex());
+ UiLog().dbg() << "<-- slotFilterTextChanged";
#endif
}
-
void VariableItemWidget::nodeChanged(const VNode* node, const std::vector<ecf::Aspect::Type>& aspect)
{
#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
- UiLog().dbg() << "VariableItemWidget::nodeChanged -->";
- qDebug() << "selected before:" << varView->currentIndex();
+ UiLog().dbg() << "VariableItemWidget::nodeChanged -->" <<
+ " selected before:" << varView->currentIndex();
#endif
- QModelIndex cIdx=sortModel_->mapToSource(varView->currentIndex());
-
if(data_->nodeChanged(node,aspect))
{
#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
UiLog().dbg() << " reselect currentIndex!";
#endif
- //After any change we need to reselect the current row. See issue ECFLOW-613.
+ //After any change done we need to reselect the current row. See issue ECFLOW-613.
reselectCurrent();
}
#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
- qDebug() << "selected after:" << varView->currentIndex();
+ UiLog().dbg() << "selected after: " << varView->currentIndex();
UiLog().dbg() << "<-- nodeChanged";
#endif
}
@@ -1112,8 +1135,7 @@ void VariableItemWidget::nodeChanged(const VNode* node, const std::vector<ecf::A
void VariableItemWidget::defsChanged(const std::vector<ecf::Aspect::Type>& aspect)
{
#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
- UiLog().dbg() << "VariableItemWidget::defsChanged -->";
- qDebug() << "selected before:" << varView->currentIndex();
+ UiLog().dbg() << "VariableItemWidget::defsChanged --> selected before:" << varView->currentIndex();
#endif
if(data_->defsChanged(aspect))
{
@@ -1124,7 +1146,7 @@ void VariableItemWidget::defsChanged(const std::vector<ecf::Aspect::Type>& aspec
reselectCurrent();
}
#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
- qDebug() << "selected after:" << varView->currentIndex();
+ UiLog().dbg() << "selected after: " << varView->currentIndex();
UiLog().dbg() << "<-- defsChanged";
#endif
}
diff --git a/Viewer/src/VariableItemWidget.hpp b/Viewer/src/VariableItemWidget.hpp
index 8aef7cd..b1ab14a 100644
--- a/Viewer/src/VariableItemWidget.hpp
+++ b/Viewer/src/VariableItemWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VariableModel.cpp b/Viewer/src/VariableModel.cpp
index c9adcb5..14ad177 100644
--- a/Viewer/src/VariableModel.cpp
+++ b/Viewer/src/VariableModel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -12,6 +12,7 @@
#include <QColor>
#include "ServerHandler.hpp"
+#include "UIDebug.hpp"
#include "UiLog.hpp"
#include "VariableModelData.hpp"
@@ -238,109 +239,6 @@ bool VariableModel::variable(const QModelIndex& idx, QString& name,QString& valu
return false;
}
-bool VariableModel::alterVariable(const QModelIndex& index, QString name,QString value)
-{
-#ifdef _UI_VARIABLEMODEL_DEBUG
- UiLog().dbg() << "VariableModel::alterVariable --> " << index << " name=" <<
- name << " value=" << value;
-#endif
-
- if(data_->count() > 0)
- {
- //This will call the ServerComThread so we
- //do not know if it was successful or not. The model will be
- //updated through the observer when the value will actually
- //change.
- data_->data(0)->alter(name.toStdString(),value.toStdString());
- }
-
-#if 0
- int block;
- int row;
-
- identify(index,block,row);
-
-#ifdef _UI_VARIABLEMODEL_DEBUG
- UiLog().dbg() << " block=" << block << " row=" << row;
-#endif
-
- if(block == -1 || row == -1)
- return false;
-
- if(block >=0 && block < data_->count())
- {
- //This will call the ServerComThread so we
- //do not know if it was successful or not. The model will be
- //updated through the observer when the value will actually
- //change.
- data_->data(block)->alter(name.toStdString(),value.toStdString());
- }
-#endif
-
-#ifdef _UI_VARIABLEMODEL_DEBUG
- UiLog().dbg() << "<-- alterVariable";
-#endif
- return false;
-}
-
-bool VariableModel::setVariable(const QModelIndex& index, QString name,QString value)
-{
- int block;
- int row;
-
- identify(index,block,row);
-
- if(block == -1 || row == -1)
- return false;
-
- if(block >=0 && block < data_->count())
- {
- //double check
- if(data_->data(block)->name(row) != name.toStdString())
- {
- assert(0);
- return false;
- }
-
- //This will call the ServerComThread so we
- //do not know if it was successful or not. The model will be
- //updated through the observer when the value will actually
- //change.
- data_->data(block)->setValue(row,value.toStdString());
- }
-
- return false;
-}
-
-bool VariableModel::removeVariable(const QModelIndex& index, QString name,QString value)
-{
- int block;
- int row;
-
- identify(index,block,row);
-
- if(block == -1 || row == -1)
- return false;
-
- if(block >=0 && block < data_->count())
- {
- //double check
- if(data_->data(block)->name(row) != name.toStdString())
- {
- assert(0);
- return false;
- }
-
- //This will call the ServerComThread so we
- //do not know if it was succesful. The model will be
- //updated through the observer when the value will actually
- //change.
- data_->data(block)->remove(row,name.toStdString());
- }
-
- return false;
-}
-
QVariant VariableModel::headerData( const int section, const Qt::Orientation orient , const int role ) const
{
if ( orient != Qt::Horizontal || role != Qt::DisplayRole )
diff --git a/Viewer/src/VariableModel.hpp b/Viewer/src/VariableModel.hpp
index 06ce7b1..132b129 100644
--- a/Viewer/src/VariableModel.hpp
+++ b/Viewer/src/VariableModel.hpp
@@ -36,9 +36,6 @@ public:
QModelIndex parent (const QModelIndex & ) const;
bool variable(const QModelIndex& index, QString& name,QString& value,bool& genVar) const;
- bool alterVariable(const QModelIndex& index,QString name,QString value);
- bool setVariable(const QModelIndex& index,QString name,QString value);
- bool removeVariable(const QModelIndex& index,QString name,QString value);
VariableModelData* indexToData(const QModelIndex& index) const;
VariableModelData* indexToData(const QModelIndex& index,int& block) const;
diff --git a/Viewer/src/VariableModelData.cpp b/Viewer/src/VariableModelData.cpp
index 2aeaf73..ef499a8 100644
--- a/Viewer/src/VariableModelData.cpp
+++ b/Viewer/src/VariableModelData.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2015 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -213,6 +213,32 @@ bool VariableModelData::hasName(const std::string& n) const
}
+int VariableModelData::indexOf(const std::string& varName,bool genVar) const
+{
+ int idx=-1;
+ for(std::vector<Variable>::const_iterator it=vars_.begin(); it != vars_.end(); ++it)
+ {
+ idx++;
+ if(!genVar && (*it).name() == varName)
+ {
+ return idx;
+ }
+ }
+
+ if(!genVar)
+ return -1;
+
+ for(std::vector<Variable>::const_iterator it=genVars_.begin(); it != genVars_.end(); ++it)
+ {
+ if((*it).name() == varName)
+ {
+ return idx;
+ }
+ }
+
+ return -1;
+}
+
void VariableModelData::buildAlterCommand(std::vector<std::string>& cmd,
const std::string& action, const std::string& type,
const std::string& name,const std::string& value)
@@ -273,15 +299,11 @@ void VariableModelData::add(const std::string& name,const std::string& val)
ServerHandler::command(info_,cmd);
}
-void VariableModelData::remove(int index,const std::string& varName)
+void VariableModelData::remove(const std::string& varName)
{
- if(varName == name(index))
- {
- std::vector<std::string> cmd;
- buildAlterCommand(cmd,"delete","variable",varName,"");
-
- ServerHandler::command(info_,cmd);
- }
+ std::vector<std::string> cmd;
+ buildAlterCommand(cmd,"delete","variable",varName,"");
+ ServerHandler::command(info_,cmd);
}
bool VariableModelData::isGenVar(int index) const
@@ -828,6 +850,26 @@ const std::string& VariableModelDataHandler::value(const std::string& node,const
return defaultStr;
}
+void VariableModelDataHandler::findVariable(const std::string& name,const std::string& nodePath,
+ bool genVar,int& block,int& row) const
+{
+ block=-1;
+ row=-1;
+ for(size_t i=0; i < data_.size(); i++)
+ {
+ if(data_[i]->fullPath() == nodePath)
+ {
+ block=i;
+ row=data_[i]->indexOf(name,genVar);
+ return;
+ }
+ }
+}
+
+
+
+
+
void VariableModelDataHandler::addObserver(VariableModelDataObserver* o)
{
std::vector<VariableModelDataObserver*>::iterator it=std::find(observers_.begin(),observers_.end(),o);
diff --git a/Viewer/src/VariableModelData.hpp b/Viewer/src/VariableModelData.hpp
index ec40c5a..50cfd0a 100644
--- a/Viewer/src/VariableModelData.hpp
+++ b/Viewer/src/VariableModelData.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -38,6 +38,7 @@ public:
const std::string& name(int index) const;
const std::string& value(int index) const;
const std::string& value(const std::string name,bool&) const;
+ int indexOf(const std::string& varName,bool genVar) const;
bool isGenVar(const std::string& varName) const;
bool isGenVar(int index) const;
bool isReadOnly(int index) const;
@@ -55,7 +56,7 @@ public:
void setValue(int index,const std::string& val);
void alter(const std::string& name,const std::string& val);
void add(const std::string& name,const std::string& val);
- void remove(int index,const std::string& val);
+ void remove(const std::string& val);
//const std::vector<Variable>& vars() const {return vars_;}
//const std::vector<Variable>& genVars() const {return genVars_;}
@@ -91,6 +92,8 @@ public:
int count() const {return static_cast<int>(data_.size());}
int varNum(int index) const;
VariableModelData* data(int index) const;
+ void findVariable(const std::string& name,const std::string& nodePath,
+ bool genVar,int& block,int& row) const;
bool nodeChanged(const VNode* node, const std::vector<ecf::Aspect::Type>&);
bool defsChanged(const std::vector<ecf::Aspect::Type>&);
const std::string& value(const std::string& node,const std::string& name,bool&) const;
diff --git a/Viewer/src/VariableModelDataObserver.hpp b/Viewer/src/VariableModelDataObserver.hpp
index 04604c4..f61a110 100644
--- a/Viewer/src/VariableModelDataObserver.hpp
+++ b/Viewer/src/VariableModelDataObserver.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VariableSearchLine.cpp b/Viewer/src/VariableSearchLine.cpp
index 3a2935f..b115001 100644
--- a/Viewer/src/VariableSearchLine.cpp
+++ b/Viewer/src/VariableSearchLine.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VariableSearchLine.hpp b/Viewer/src/VariableSearchLine.hpp
index db897f1..3d6bdeb 100644
--- a/Viewer/src/VariableSearchLine.hpp
+++ b/Viewer/src/VariableSearchLine.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/VariableView.cpp b/Viewer/src/VariableView.cpp
index ba099ee..0ffd334 100644
--- a/Viewer/src/VariableView.cpp
+++ b/Viewer/src/VariableView.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -39,7 +39,12 @@ VariableDelegate::VariableDelegate(QTreeView *parent) : QStyledItemDelegate(pare
void VariableDelegate::paint(QPainter *painter,const QStyleOptionViewItem &option,
const QModelIndex& index) const
{
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+ QStyleOptionViewItem vopt(option);
+#else
QStyleOptionViewItemV4 vopt(option);
+#endif
+
initStyleOption(&vopt, index);
const QStyle *style = vopt.widget ? vopt.widget->style() : QApplication::style();
@@ -120,7 +125,7 @@ void VariableDelegate::paint(QPainter *painter,const QStyleOptionViewItem &optio
//Display text
QString text=index.data(Qt::DisplayRole).toString();
- QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &vopt, widget);
+ QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &vopt,widget);
QFont f;
QFontMetrics fm(f);
textRect.setWidth(fm.width(text));
diff --git a/Viewer/src/VariableView.hpp b/Viewer/src/VariableView.hpp
index c079d9f..1b3ec4f 100644
--- a/Viewer/src/VariableView.hpp
+++ b/Viewer/src/VariableView.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/Viewer.hpp b/Viewer/src/Viewer.hpp
index d68d725..a87accc 100644
--- a/Viewer/src/Viewer.hpp
+++ b/Viewer/src/Viewer.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ViewerMain.cpp b/Viewer/src/ViewerMain.cpp
index 0ecaf6a..7396931 100644
--- a/Viewer/src/ViewerMain.cpp
+++ b/Viewer/src/ViewerMain.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -109,6 +109,22 @@ int main(int argc, char **argv)
//from the central the system server list
ServerList::instance()->init();
+ // startup - via the session manager, or straight to the main window?
+ bool startMainWindow = true;
+
+ //Initialise the session. We have to call thi before VConfig::init() because
+ //some settings Vconfig loads are session-dependent.
+ if (SessionHandler::requestStartupViaSessionManager())
+ {
+ SessionDialog sessionDialog;
+ if (sessionDialog.exec() != QDialog::Accepted)
+ startMainWindow = false;
+ }
+ else
+ {
+ SessionHandler::setTemporarySessionIfReqested(); // user starts with -ts command-line switch?
+ }
+
//Load the global configurations
VConfig::instance()->init(DirectoryHandler::etcDir());
@@ -127,27 +143,13 @@ int main(int argc, char **argv)
Palette::load(DirectoryHandler::concatenate(DirectoryHandler::etcDir(),
"ecflowview_palette.json"));
-
//Initialise the list containing all the icon names existed on last exit
VIcon::initLastNames();
- // startup - via the session manager, or straight to the main window?
- bool startMainWindow = true;
-
- if (SessionHandler::requestStartupViaSessionManager())
- {
- SessionDialog sessionDialog;
- if (sessionDialog.exec() != QDialog::Accepted)
- startMainWindow = false;
- }
- else
- {
- SessionHandler::setTemporarySessionIfReqested(); // user starts with -ts command-line switch?
- }
-
+ //Start the GUI
if (startMainWindow)
{
- //Build the GUI
+ //Build the GUI
MainWindow::init();
//Show all the windows
diff --git a/Viewer/src/WhyItemWidget.cpp b/Viewer/src/WhyItemWidget.cpp
index 7e2679e..9f91887 100644
--- a/Viewer/src/WhyItemWidget.cpp
+++ b/Viewer/src/WhyItemWidget.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -13,9 +13,13 @@
#include "Node.hpp"
+#include "InfoProvider.hpp"
+#include "ServerHandler.hpp"
+#include "UiLog.hpp"
#include "VConfig.hpp"
#include "VItemPathParser.hpp"
#include "VNode.hpp"
+#include "VNState.hpp"
//========================================================
//
@@ -23,23 +27,55 @@
//
//========================================================
-WhyItemWidget::WhyItemWidget(QWidget *parent) : CodeItemWidget(parent)
+WhyItemWidget::WhyItemWidget(QWidget *parent) : HtmlItemWidget(parent)
{
messageLabel_->hide();
fileLabel_->hide();
- textEdit_->setShowLineNumbers(false);
- textEdit_->setHyperlinkEnabled(true);
- //Editor font
- textEdit_->setFontProperty(VConfig::instance()->find("panel.why.font"));
+ //Will be used for ECFLOW-901
+ infoProvider_=new WhyProvider(this);
+
+ textEdit_->setProperty("trigger","1");
+ textEdit_->setFontProperty(VConfig::instance()->find("panel.why.font"));
+
+ //Read css for the text formatting
+ QString cssDoc;
+ QFile f(":/viewer/trigger.css");
+ //QTextStream in(&f);
+ if(f.open(QIODevice::ReadOnly | QIODevice::Text))
+ {
+ cssDoc=QString(f.readAll());
+ }
+ f.close();
+
+ //Add css for state names
+ std::vector<VParam*> states=VNState::filterItems();
+ for(std::vector<VParam*>::const_iterator it=states.begin(); it!=states.end();++it)
+ {
+ cssDoc+="font." + (*it)->name() +
+ " {background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 " +
+ (*it)->colour().lighter(120).name() + ", stop: 1 " + (*it)->colour().name() +
+ "); color: " + (*it)->typeColour().name() + ";}";
+
+ }
+
+ //Add css for false statements
+ QColor falseCol(218,219,219);
+ cssDoc+="font.false {background-color: " + falseCol.name() + ";}";
- //Set css for the text formatting
- QString cssDoc="a:link { text-decoration:none; color: #0645AD;}";
textEdit_->document()->setDefaultStyleSheet(cssDoc);
+ connect(textEdit_,SIGNAL(anchorClicked(QUrl)),
+ this,SLOT(anchorClicked(QUrl)));
+
+ //Define the mapping for <state>stateName</state> tag replacement with
+ //<font class='stateName'>stateName</font>
+ for(std::vector<VParam*>::const_iterator it=states.begin(); it!=states.end();++it)
+ {
+ stateMap_["<state>" + (*it)->name() + "</state>"]="<font class=\'"+ (*it)->name() + "\'>" + (*it)->name() + "</font>";
+ }
+
- connect(textEdit_,SIGNAL(hyperlinkActivated(QString)),
- this,SLOT(anchorClicked(QString)));
}
WhyItemWidget::~WhyItemWidget()
@@ -63,10 +99,9 @@ void WhyItemWidget::reload(VInfo_ptr info)
info_=info;
if(info_)
- {
- //textEdit_->setPlainText(why());
- textEdit_->appendHtml(why());
- }
+ {
+ textEdit_->insertHtml(why());
+ }
}
void WhyItemWidget::clearContents()
@@ -79,76 +114,83 @@ QString WhyItemWidget::why() const
{
QString s;
- std::vector<std::string> theReasonWhy;
+ std::vector<std::string> bottomUpWhy,topDownWhy;
- if(info_ && info_.get())
+ if(info_ && info_->server())
{
- if(info_->isServer())
+ //This stops the queue on the serverhandler so that no update
+ //could happen while we generate the why? information
+ info_->server()->searchBegan();
+
+ if(info_->isServer())
{
- info_->node()->why(theReasonWhy);
+ info_->node()->why(topDownWhy);
}
else if(info_->isNode() && info_->node())
{
- info_->node()->why(theReasonWhy);
+ info_->node()->why(bottomUpWhy,topDownWhy);
}
+
+ //Resume the queue on the serverhandler
+ info_->server()->searchFinished();
}
- s=makeHtml(theReasonWhy);
+ s=makeHtml(bottomUpWhy,topDownWhy);
return s;
}
+QString WhyItemWidget::makeHtml(const std::vector<std::string>& bottomUpTxt,
+ const std::vector<std::string>& topDownTxt) const
+{
+ if(bottomUpTxt.empty() && topDownTxt.empty())
+ return QString();
+
+ QString s="<table width=\'100%\'>";
+
+ if(!bottomUpTxt.empty())
+ {
+ s+="<tr><td class=\'direct_title\'>Bottom-up why? - through the parents</td></tr>";
+ s+=makeHtml(bottomUpTxt);
+ }
+
+ if(!topDownTxt.empty())
+ {
+ s+="<tr><td class=\'direct_title\'>Top-down why? - through the children</td></tr>";
+ s+=makeHtml(topDownTxt);
+ }
+
+ s+="</table>";
+ return s;
+}
QString WhyItemWidget::makeHtml(const std::vector<std::string>& rawTxt) const
-{
+{
QString s;
for(std::vector<std::string>::const_iterator it=rawTxt.begin(); it != rawTxt.end(); ++it)
{
QString line=QString::fromStdString(*it);
- QRegExp rx("'\\S+:(\\S+)'");
- if(rx.indexIn(line) > -1 && rx.captureCount() == 1)
- {
- QString path=rx.cap(1);
- rx=QRegExp("'(\\S+):");
- QString type,typeOri;
- if(rx.indexIn(line) > -1 && rx.captureCount() == 1)
- {
- typeOri=rx.cap(1);
- type=typeOri.toLower();
- }
-
- QString anchor=QString::fromStdString(VItemPathParser::encode(path.toStdString(),type.toStdString()));
- line.replace("\'" + typeOri + ":"," " + typeOri + " ");
- line.replace(path + "'","<a href=\'" + anchor + "\'>" + path +"</a>");
- }
- else
+ //UiLog().dbg() << line;
+
+ QMap<QString,QString>::const_iterator stIt = stateMap_.constBegin();
+ while (stIt != stateMap_.constEnd())
{
- rx=QRegExp("\\s+(/\\S+)\\b");
- if(rx.indexIn(line) > -1 && rx.captureCount() == 1)
- {
- QString path=rx.cap(1);
- rx=QRegExp("(SUITE|FAMILY|TASK|ALIAS)");
- QString type;
- if(rx.indexIn(line) > -1 && rx.captureCount() == 1)
- {
- type=rx.cap(1);
- }
-
- QString anchor=QString::fromStdString(VItemPathParser::encode(path.toStdString(),type.toStdString()));
- line.replace(path,"<a href=\'" + anchor + "\'>" + path +"</a>");
- }
+ line.replace(stIt.key(),stIt.value());
+ ++stIt;
}
+ line.replace("<false>","<font class=\'false\'>");
+ line.replace("</false>","</font>");
-
- s+=line+"<br>";
+ //UiLog().dbg() << " -->" << line;
+ s+="<tr><td width=\'100%\'>" + line + "</td></tr>";
}
return s;
}
-void WhyItemWidget::anchorClicked(QString link)
+void WhyItemWidget::anchorClicked(const QUrl& link)
{
- linkSelected(link.toStdString());
+ linkSelected(link.path().toStdString());
}
static InfoPanelItemMaker<WhyItemWidget> maker1("why");
diff --git a/Viewer/src/WhyItemWidget.hpp b/Viewer/src/WhyItemWidget.hpp
index b1e3d3d..f51dcb7 100644
--- a/Viewer/src/WhyItemWidget.hpp
+++ b/Viewer/src/WhyItemWidget.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -14,12 +14,12 @@
#include <QPlainTextEdit>
#include "InfoPanelItem.hpp"
-#include "CodeItemWidget.hpp"
+#include "HtmlItemWidget.hpp"
#include "VInfo.hpp"
class VNode;
-class WhyItemWidget : public CodeItemWidget, public InfoPanelItem
+class WhyItemWidget : public HtmlItemWidget, public InfoPanelItem
{
Q_OBJECT
@@ -35,14 +35,17 @@ public:
void defsChanged(const std::vector<ecf::Aspect::Type>&) {}
protected Q_SLOTS:
- void anchorClicked(QString link);
+ void anchorClicked(const QUrl& link);
protected:
void updateState(const ChangeFlags&) {}
private:
QString why() const;
+ QString makeHtml(const std::vector<std::string>&,const std::vector<std::string>&) const;
QString makeHtml(const std::vector<std::string>&) const;
+
+ QMap<QString,QString> stateMap_;
};
#endif
diff --git a/Viewer/src/WidgetNameProvider.cpp b/Viewer/src/WidgetNameProvider.cpp
index 96adf87..26e4387 100644
--- a/Viewer/src/WidgetNameProvider.cpp
+++ b/Viewer/src/WidgetNameProvider.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -9,6 +9,7 @@
#include "WidgetNameProvider.hpp"
+#include <QtGlobal>
#include <QAbstractButton>
#include <QAbstractScrollArea>
#include <QAction>
@@ -24,10 +25,18 @@ void WidgetNameProvider::nameChildren(QWidget* w)
{
nameButtons(w->actions());
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
Q_FOREACH(QToolBar* tb,w->findChildren<QToolBar*>(QString(),Qt::FindDirectChildrenOnly))
{
nameButtons(tb->actions());
}
+#else
+ Q_FOREACH(QToolBar* tb,w->findChildren<QToolBar*>(QString()))
+ {
+ if(tb->parent() == w)
+ nameButtons(tb->actions());
+ }
+#endif
Q_FOREACH(QDialogButtonBox* bb,w->findChildren<QDialogButtonBox*>(QString()))
{
@@ -74,15 +83,31 @@ void WidgetNameProvider::nameButtons(QDialogButtonBox* bb)
void WidgetNameProvider::nameTabWidget(QTabWidget* t)
{
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
Q_FOREACH(QTabBar* tb,t->findChildren<QTabBar*>(QString(),Qt::FindDirectChildrenOnly))
{
nameTabBar(tb);
}
+#else
+ Q_FOREACH(QTabBar* tb,t->findChildren<QTabBar*>(QString()))
+ {
+ if(tb->parent() == t)
+ nameTabBar(tb);
+ }
+#endif
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
Q_FOREACH(QStackedWidget* tb,t->findChildren<QStackedWidget*>(QString(),Qt::FindDirectChildrenOnly))
{
nameStacked(tb);
}
+#else
+ Q_FOREACH(QStackedWidget* tb,t->findChildren<QStackedWidget*>(QString()))
+ {
+ if(tb->parent() == t)
+ nameStacked(tb);
+ }
+#endif
}
void WidgetNameProvider::nameTabBar(QTabBar* t)
diff --git a/Viewer/src/WidgetNameProvider.hpp b/Viewer/src/WidgetNameProvider.hpp
index a4094df..bbdabec 100644
--- a/Viewer/src/WidgetNameProvider.hpp
+++ b/Viewer/src/WidgetNameProvider.hpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/Viewer/src/ZombieItemWidget.cpp b/Viewer/src/ZombieItemWidget.cpp
index f6e0305..b354f59 100644
--- a/Viewer/src/ZombieItemWidget.cpp
+++ b/Viewer/src/ZombieItemWidget.cpp
@@ -1,294 +1,255 @@
-//============================================================================
-// Copyright 2014 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not waive the privileges and immunities
-// granted to it by virtue of its status as an intergovernmental organisation
-// nor does it submit to any jurisdiction.
-//============================================================================
-
-#include "ZombieItemWidget.hpp"
-
-#include <QItemSelectionModel>
-#include <QSortFilterProxyModel>
-
-#include "ServerHandler.hpp"
-#include "VNode.hpp"
-#include "VReply.hpp"
-#include "InfoProvider.hpp"
-#include "ZombieModel.hpp"
-
-static bool firstRun=true;
-
-//========================================================
-//
-// ZombieItemWidget
-//
-//========================================================
-
-ZombieItemWidget::ZombieItemWidget(QWidget *parent) :
- QWidget(parent),
- commandSent_(false)
-{
- setupUi(this);
-
- infoProvider_=new ZombieProvider(this);
-
- model_=new ZombieModel(this);
-
- sortModel_=new QSortFilterProxyModel(this);
- sortModel_->setSourceModel(model_);
-
- zombieView->setModel(sortModel_);
-
- //The selection changes in the view
- connect(zombieView->selectionModel(),SIGNAL(currentChanged(QModelIndex,QModelIndex)),
- this,SLOT(slotItemSelected(QModelIndex,QModelIndex)));
-
- //Build context menu
- zombieView->addAction(actionRescue);
- zombieView->addAction(actionFoboff);
- zombieView->addAction(actionKill);
- zombieView->addAction(actionTerminate);
- zombieView->addAction(actionDelete);
-
- //Add actions for the pushbuttons
- terminateTb_->setDefaultAction(actionTerminate);
- rescueTb_->setDefaultAction(actionRescue);
- foboffTb_->setDefaultAction(actionFoboff);
- deleteTb_->setDefaultAction(actionDelete);
- killTb_->setDefaultAction(actionKill);
-
- checkActionState();
-}
-
-ZombieItemWidget::~ZombieItemWidget()
-{
-
-}
-
-QWidget* ZombieItemWidget::realWidget()
-{
- return this;
-}
-
-void ZombieItemWidget::reload(VInfo_ptr info)
-{
- assert(active_);
-
- if(suspended_)
- return;
-
- clearContents();
- info_=info;
-
- if(info_ && info_->isServer() && info_->server())
- {
- commandSent_=false;
- infoProvider_->info(info_);
- }
-}
-
-void ZombieItemWidget::clearContents()
-{
- InfoPanelItem::clear();
- model_->clearData();
- checkActionState();
-}
-
-
-void ZombieItemWidget::updateContents()
-{
- //model_->clearData();
- if(info_ && info_->isServer() && info_->server())
- {
- infoProvider_->info(info_);
- }
-}
-
-void ZombieItemWidget::updateState(const FlagSet<ChangeFlag>&)
-{
- checkActionState();
-}
-
-/*
-void ZombieItemWidget::saveSelection()
-{
- QModelIndexList lst=zombieView->selectionModel()->selectedRows(0);
- lastSelection_.clear();
-
- if(!lst.isEmpty())
- {
- std::vector<std::string> paths;
- Q_FOREACH(QModelIndex idx,lst)
- {
- lastSelection_.push_back(model_->data(idx,Qt::DisplayRole).toString().toStdString());
- }
- }
-}
-
-void ZombieItemWidget::resetSelection()
-{
- Q_FOREACH(QString s,lastSelection_)
- {
-
-
- QModelIndex idx,lst)
- {
- lastSelection_.push_back(model_->data(idx,Qt::DisplayRole).toString().toStdString());
- }
-
-
- QModelIndexList lst=zombieView->selectionModel()->selectedRows(0);
- lastSelection_.clear();
-
- if(!lst.isEmpty())
- {
- std::vector<std::string> paths;
- Q_FOREACH(QModelIndex idx,lst)
- {
- lastSelection_.push_back(model_->data(idx,Qt::DisplayRole).toString().toStdString());
- }
- }
-}
-*/
-
-
-void ZombieItemWidget::infoReady(VReply* reply)
-{
- commandSent_=false;
-
- //We need to know what task it was!
- if(model_->hasData())
- {
- model_->updateData(reply->zombies());
- }
- else
- {
- model_->setData(reply->zombies());
- }
-
- //Adjust column size if it is the first run
- if(firstRun && model_->hasData())
- {
- firstRun=false;
- for(int i=0; i < model_->columnCount()-1; i++)
- {
- zombieView->resizeColumnToContents(i);
- }
- }
- checkActionState();
-}
-
-void ZombieItemWidget::infoFailed(VReply* reply)
-{
- commandSent_=false;
- //QString s=QString::fromStdString(reply->errorText());
- checkActionState();
-}
-
-void ZombieItemWidget::on_actionTerminate_triggered()
-{
- command("zombie_fail");
-}
-
-void ZombieItemWidget::on_actionRescue_triggered()
-{
- command("zombie_adopt");
-}
-
-void ZombieItemWidget::on_actionFoboff_triggered()
-{
- command("zombie_fob");
-}
-
-void ZombieItemWidget::on_actionDelete_triggered()
-{
- command("zombie_remove");
-}
-
-void ZombieItemWidget::on_actionKill_triggered()
-{
- command("zombie_kill");
-}
-
-void ZombieItemWidget::on_reloadTb__clicked(bool)
-{
- updateContents();
-}
-
-void ZombieItemWidget::command(const std::string& cmdName)
-{
- if(info_ && info_->server())
- {
- //Get selection form view
- QModelIndexList lst=zombieView->selectionModel()->selectedRows(0);
-
- if(!lst.isEmpty())
- {
- std::vector<std::string> paths;
- Q_FOREACH(QModelIndex idx,lst)
- {
- paths.push_back(model_->data(sortModel_->mapToSource(idx),Qt::DisplayRole).toString().toStdString());
- }
-
- std::vector<std::string> cmd;
- cmd.push_back("ecflow_client");
- cmd.push_back("--" + cmdName);
- cmd.push_back("<full_name>");
-
- commandSent_=true;
-
- info_->server()->command(paths,cmd);
- }
- }
-}
-
-
-void ZombieItemWidget::slotItemSelected(QModelIndex,QModelIndex)
-{
- checkActionState();
-}
-
-void ZombieItemWidget::checkActionState()
-{
- if(suspended_)
- {
- reloadTb_->setEnabled(false);
- actionRescue->setEnabled(false);
- actionFoboff->setEnabled(false);
- actionKill->setEnabled(false);
- actionTerminate->setEnabled(false);
- actionDelete->setEnabled(false);
- return;
- }
- else
- {
- reloadTb_->setEnabled(true);
- }
-
- QModelIndex vIndex=zombieView->currentIndex();
- QModelIndex index=sortModel_->mapToSource(vIndex);
-
- bool acState=(index.isValid())?true:false;
-
- actionRescue->setEnabled(acState);
- actionFoboff->setEnabled(acState);
- actionKill->setEnabled(acState);
- actionTerminate->setEnabled(acState);
- actionDelete->setEnabled(acState);
-}
-
-void ZombieItemWidget::serverSyncFinished()
-{
- //If a command has previously sent
- if(commandSent_)
- {
- commandSent_=false;
- updateContents();
- }
-}
-
-
-static InfoPanelItemMaker<ZombieItemWidget> maker1("zombie");
-
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//============================================================================
+
+#include "ZombieItemWidget.hpp"
+
+#include <QItemSelectionModel>
+#include <QSortFilterProxyModel>
+
+#include "ServerHandler.hpp"
+#include "VNode.hpp"
+#include "VReply.hpp"
+#include "InfoProvider.hpp"
+#include "ZombieModel.hpp"
+
+static bool firstRun=true;
+
+//========================================================
+//
+// ZombieItemWidget
+//
+//========================================================
+
+ZombieItemWidget::ZombieItemWidget(QWidget *parent) :
+ QWidget(parent),
+ commandSent_(false)
+{
+ setupUi(this);
+
+ infoProvider_=new ZombieProvider(this);
+
+ model_=new ZombieModel(this);
+
+ sortModel_=new QSortFilterProxyModel(this);
+ sortModel_->setSourceModel(model_);
+
+ zombieView->setModel(sortModel_);
+
+ //The selection changes in the view
+ connect(zombieView->selectionModel(),SIGNAL(currentChanged(QModelIndex,QModelIndex)),
+ this,SLOT(slotItemSelected(QModelIndex,QModelIndex)));
+
+ //Build context menu
+ zombieView->addAction(actionRescue);
+ zombieView->addAction(actionFoboff);
+ zombieView->addAction(actionKill);
+ zombieView->addAction(actionTerminate);
+ zombieView->addAction(actionDelete);
+
+ //Add actions for the pushbuttons
+ terminateTb_->setDefaultAction(actionTerminate);
+ rescueTb_->setDefaultAction(actionRescue);
+ foboffTb_->setDefaultAction(actionFoboff);
+ deleteTb_->setDefaultAction(actionDelete);
+ killTb_->setDefaultAction(actionKill);
+
+ checkActionState();
+}
+
+ZombieItemWidget::~ZombieItemWidget()
+{
+
+}
+
+QWidget* ZombieItemWidget::realWidget()
+{
+ return this;
+}
+
+void ZombieItemWidget::reload(VInfo_ptr info)
+{
+ assert(active_);
+
+ if(suspended_)
+ return;
+
+ clearContents();
+ info_=info;
+
+ if(info_ && info_->isServer() && info_->server())
+ {
+ commandSent_=false;
+ infoProvider_->info(info_);
+ }
+}
+
+void ZombieItemWidget::clearContents()
+{
+ InfoPanelItem::clear();
+ model_->clearData();
+ checkActionState();
+}
+
+
+void ZombieItemWidget::updateContents()
+{
+ //model_->clearData();
+ if(info_ && info_->isServer() && info_->server())
+ {
+ infoProvider_->info(info_);
+ }
+}
+
+void ZombieItemWidget::updateState(const FlagSet<ChangeFlag>&)
+{
+ checkActionState();
+}
+
+
+void ZombieItemWidget::infoReady(VReply* reply)
+{
+ commandSent_=false;
+
+ //We need to know what task it was!
+ if(model_->hasData())
+ {
+ model_->updateData(reply->zombies());
+ }
+ else
+ {
+ model_->setData(reply->zombies());
+ }
+
+ //Adjust column size if it is the first run
+ if(firstRun && model_->hasData())
+ {
+ firstRun=false;
+ for(int i=0; i < model_->columnCount()-1; i++)
+ {
+ zombieView->resizeColumnToContents(i);
+ }
+ }
+ checkActionState();
+}
+
+void ZombieItemWidget::infoFailed(VReply* reply)
+{
+ commandSent_=false;
+ //QString s=QString::fromStdString(reply->errorText());
+ checkActionState();
+}
+
+void ZombieItemWidget::on_actionTerminate_triggered()
+{
+ command("zombie_fail");
+}
+
+void ZombieItemWidget::on_actionRescue_triggered()
+{
+ command("zombie_adopt");
+}
+
+void ZombieItemWidget::on_actionFoboff_triggered()
+{
+ command("zombie_fob");
+}
+
+void ZombieItemWidget::on_actionDelete_triggered()
+{
+ command("zombie_remove");
+}
+
+void ZombieItemWidget::on_actionKill_triggered()
+{
+ command("zombie_kill");
+}
+
+void ZombieItemWidget::on_reloadTb__clicked(bool)
+{
+ updateContents();
+}
+
+void ZombieItemWidget::command(const std::string& cmdName)
+{
+ if(info_ && info_->server())
+ {
+ //Get selection form view
+ QModelIndexList lst=zombieView->selectionModel()->selectedRows(0);
+
+ if(!lst.isEmpty())
+ {
+ QList<Zombie> zLst;
+ Q_FOREACH(QModelIndex idx,lst)
+ {
+ zLst <<model_->indexToZombie(sortModel_->mapToSource(idx));
+ }
+
+ Q_FOREACH(Zombie z,zLst)
+ {
+ if(z.empty() == false)
+ {
+ VTask_ptr t=VTask::create(VTask::ZombieCommandTask);
+ t->setZombie(z);
+ t->param("command",cmdName);
+ info_->server()->run(t);
+ commandSent_=true;
+ }
+ }
+ }
+ }
+}
+
+
+void ZombieItemWidget::slotItemSelected(QModelIndex,QModelIndex)
+{
+ checkActionState();
+}
+
+void ZombieItemWidget::checkActionState()
+{
+ if(suspended_)
+ {
+ reloadTb_->setEnabled(false);
+ actionRescue->setEnabled(false);
+ actionFoboff->setEnabled(false);
+ actionKill->setEnabled(false);
+ actionTerminate->setEnabled(false);
+ actionDelete->setEnabled(false);
+ return;
+ }
+ else
+ {
+ reloadTb_->setEnabled(true);
+ }
+
+ QModelIndex vIndex=zombieView->currentIndex();
+ QModelIndex index=sortModel_->mapToSource(vIndex);
+
+ bool acState=(index.isValid())?true:false;
+
+ actionRescue->setEnabled(acState);
+ actionFoboff->setEnabled(acState);
+ actionKill->setEnabled(acState);
+ actionTerminate->setEnabled(acState);
+ actionDelete->setEnabled(acState);
+}
+
+void ZombieItemWidget::serverSyncFinished()
+{
+ //If a command has previously sent
+ if(commandSent_)
+ {
+ commandSent_=false;
+ updateContents();
+ }
+}
+
+
+static InfoPanelItemMaker<ZombieItemWidget> maker1("zombie");
+
diff --git a/Viewer/src/ZombieItemWidget.hpp b/Viewer/src/ZombieItemWidget.hpp
index b01cf2e..5090d89 100644
--- a/Viewer/src/ZombieItemWidget.hpp
+++ b/Viewer/src/ZombieItemWidget.hpp
@@ -1,68 +1,68 @@
-//============================================================================
-// Copyright 2014 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not waive the privileges and immunities
-// granted to it by virtue of its status as an intergovernmental organisation
-// nor does it submit to any jurisdiction.
-//
-//============================================================================
-
-#ifndef ZOMBIEITEMWIDGET_HPP_
-#define ZOMBIEITEMWIDGET_HPP_
-
-#include <QWidget>
-
-#include "InfoPanelItem.hpp"
-#include "VInfo.hpp"
-
-#include "ui_ZombieItemWidget.h"
-
-class ZombieModel;
-class QSortFilterProxyModel;
-
-class ZombieItemWidget : public QWidget, public InfoPanelItem, protected Ui::ZombieItemWidget
-{
-Q_OBJECT
-
-public:
- explicit ZombieItemWidget(QWidget *parent=0);
- ~ZombieItemWidget();
- void reload(VInfo_ptr);
- QWidget* realWidget();
- void clearContents();
-
- //From VInfoPresenter
- void infoReady(VReply*);
- void infoFailed(VReply*);
- void infoProgress(VReply*) {}
-
- void nodeChanged(const VNode*, const std::vector<ecf::Aspect::Type>&) {}
- void defsChanged(const std::vector<ecf::Aspect::Type>&) {}
-
-protected Q_SLOTS:
- void on_actionTerminate_triggered();
- void on_actionRescue_triggered();
- void on_actionFoboff_triggered();
- void on_actionDelete_triggered();
- void on_actionKill_triggered();
- void on_reloadTb__clicked(bool);
- void slotItemSelected(QModelIndex,QModelIndex);
-
-protected:
- void updateState(const ChangeFlags&);
- void serverSyncFinished();
-
-private:
- void command(const std::string& cmdName);
- void updateContents();
- void checkActionState();
-
- ZombieModel *model_;
- QSortFilterProxyModel* sortModel_;
- bool commandSent_;
- QStringList lastSelection_;
-};
-
-#endif
-
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the privileges and immunities
+// granted to it by virtue of its status as an intergovernmental organisation
+// nor does it submit to any jurisdiction.
+//
+//============================================================================
+
+#ifndef ZOMBIEITEMWIDGET_HPP_
+#define ZOMBIEITEMWIDGET_HPP_
+
+#include <QWidget>
+
+#include "InfoPanelItem.hpp"
+#include "VInfo.hpp"
+
+#include "ui_ZombieItemWidget.h"
+
+class ZombieModel;
+class QSortFilterProxyModel;
+
+class ZombieItemWidget : public QWidget, public InfoPanelItem, protected Ui::ZombieItemWidget
+{
+Q_OBJECT
+
+public:
+ explicit ZombieItemWidget(QWidget *parent=0);
+ ~ZombieItemWidget();
+ void reload(VInfo_ptr);
+ QWidget* realWidget();
+ void clearContents();
+
+ //From VInfoPresenter
+ void infoReady(VReply*);
+ void infoFailed(VReply*);
+ void infoProgress(VReply*) {}
+
+ void nodeChanged(const VNode*, const std::vector<ecf::Aspect::Type>&) {}
+ void defsChanged(const std::vector<ecf::Aspect::Type>&) {}
+
+protected Q_SLOTS:
+ void on_actionTerminate_triggered();
+ void on_actionRescue_triggered();
+ void on_actionFoboff_triggered();
+ void on_actionDelete_triggered();
+ void on_actionKill_triggered();
+ void on_reloadTb__clicked(bool);
+ void slotItemSelected(QModelIndex,QModelIndex);
+
+protected:
+ void updateState(const ChangeFlags&);
+ void serverSyncFinished();
+
+private:
+ void command(const std::string& cmdName);
+ void updateContents();
+ void checkActionState();
+
+ ZombieModel *model_;
+ QSortFilterProxyModel* sortModel_;
+ bool commandSent_;
+ QStringList lastSelection_;
+};
+
+#endif
+
diff --git a/Viewer/src/ZombieModel.cpp b/Viewer/src/ZombieModel.cpp
index 736e5bd..94dfd3f 100644
--- a/Viewer/src/ZombieModel.cpp
+++ b/Viewer/src/ZombieModel.cpp
@@ -1,5 +1,5 @@
//============================================================================
-// Copyright 2014 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -130,30 +130,30 @@ QVariant ZombieModel::data( const QModelIndex& index, int role ) const
if(role == Qt::DisplayRole)
{
if(id == "path")
- return QString::fromStdString(data_.at(row).path_to_task());
+ return QString::fromStdString(data_[row].path_to_task());
else if(id == "type")
- return QString::fromStdString(data_.at(row).type_str());
+ return QString::fromStdString(data_[row].type_str());
else if(id == "tryno")
- return data_.at(row).try_no();
+ return data_[row].try_no();
else if(id == "duration")
- return QString::number(data_.at(row).duration()) + " s";
+ return QString::number(data_[row].duration()) + " s";
else if(id == "creation")
{
- const boost::posix_time::ptime& t= data_.at(row).creation_time();
+ const boost::posix_time::ptime& t= data_[row].creation_time();
return QString::fromStdString(boost::posix_time::to_simple_string(t));
}
else if(id == "allowed")
- return QString::number(data_.at(row).allowed_age()) + " s";
+ return QString::number(data_[row].allowed_age()) + " s";
else if(id == "calls")
- return data_.at(row).calls();
+ return data_[row].calls();
else if(id == "action")
- return QString::fromStdString(data_.at(row).user_action_str());
+ return QString::fromStdString(data_[row].user_action_str());
else if(id == "password")
- return QString::fromStdString(data_.at(row).jobs_password());
+ return QString::fromStdString(data_[row].jobs_password());
else if(id == "child")
- return QString::fromStdString(ecf::Child::to_string(data_.at(row).last_child_cmd()));
+ return QString::fromStdString(ecf::Child::to_string(data_[row].last_child_cmd()));
else if(id == "pid")
- return QString::fromStdString(data_.at(row).process_or_remote_id());
+ return QString::fromStdString(data_[row].process_or_remote_id());
else
return QVariant();
}
@@ -195,3 +195,14 @@ QModelIndex ZombieModel::parent(const QModelIndex &child) const
{
return QModelIndex();
}
+
+Zombie ZombieModel::indexToZombie(const QModelIndex& idx) const
+{
+ if(idx.isValid() && hasData())
+ {
+ int row=idx.row();
+ if(row >= 0 || row < data_.size())
+ return data_[row];
+ }
+ return Zombie();
+}
diff --git a/Viewer/src/ZombieModel.hpp b/Viewer/src/ZombieModel.hpp
index b63321c..82eb7fa 100644
--- a/Viewer/src/ZombieModel.hpp
+++ b/Viewer/src/ZombieModel.hpp
@@ -30,6 +30,7 @@ public:
bool updateData(const std::vector<Zombie>&);
void clearData();
bool hasData() const;
+ Zombie indexToZombie(const QModelIndex&) const;
protected:
std::vector<Zombie> data_;
diff --git a/Viewer/src/trigger.css b/Viewer/src/trigger.css
index 7307ec0..faf3718 100644
--- a/Viewer/src/trigger.css
+++ b/Viewer/src/trigger.css
@@ -1,5 +1,5 @@
/*============================================================================
-// Copyright 2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -80,6 +80,6 @@ td.trigger {
}
td
{
- background-color: #F9F9F9;
+ background-color: #F5F5F5;
color: #000000;
}
diff --git a/Viewer/src/viewer.qrc b/Viewer/src/viewer.qrc
index d647748..00f3433 100644
--- a/Viewer/src/viewer.qrc
+++ b/Viewer/src/viewer.qrc
@@ -30,14 +30,20 @@
<file alias="add_tab.svg">../images/add_tab.svg</file>
<file alias="attribute.svg">../images/attribute.svg</file>
<file alias="chain.svg">../images/chain.svg</file>
+ <file alias="chain_open.svg">../images/chain_open.svg</file>
+ <file alias="chain_closed.svg">../images/chain_closed.svg</file>
<file alias="clear_left.svg">../images/clear_left.svg</file>
<file alias="case_sensitive.svg">../images/case_sensitive.svg</file>
+ <file alias="cogwheel.svg">../images/cogwheel.svg</file>
<file alias="colour.svg">../images/colour.svg</file>
<file alias="directory_arrow.svg">../images/directory_arrow.svg</file>
<file alias="dock_chain_closed.svg">../images/dock_chain_closed.svg</file>
<file alias="dock_chain_open.svg">../images/dock_chain_open.svg</file>
<file alias="dock_config.svg">../images/dock_config.svg</file>
+ <file alias="dock_max.svg">../images/dock_max.svg</file>
+ <file alias="dock_max_disabled.svg">../images/dock_max_disabled.svg</file>
<file alias="dock_menu_indicator.png">../images/dock_menu_indicator.png</file>
+ <file alias="dock_restore.svg">../images/dock_restore.svg</file>
<file alias="drawer_open.svg">../images/drawer_open.svg</file>
<file alias="drawer_close.svg">../images/drawer_close.svg</file>
<file alias="edit.svg">../images/edit.svg</file>
diff --git a/build_scripts/aix_fix/README b/build_scripts/aix_fix/README
index 1e440fd..63f2537 100644
--- a/build_scripts/aix_fix/README
+++ b/build_scripts/aix_fix/README
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/boost_1_47_fix.sh b/build_scripts/boost_1_47_fix.sh
index e6169d4..24e8cf0 100644
--- a/build_scripts/boost_1_47_fix.sh
+++ b/build_scripts/boost_1_47_fix.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/boost_1_48_fix.sh b/build_scripts/boost_1_48_fix.sh
index bbb306d..c2b1866 100644
--- a/build_scripts/boost_1_48_fix.sh
+++ b/build_scripts/boost_1_48_fix.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/boost_1_51_fix.sh b/build_scripts/boost_1_51_fix.sh
index c0dba4a..f8623b6 100644
--- a/build_scripts/boost_1_51_fix.sh
+++ b/build_scripts/boost_1_51_fix.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/boost_1_53_fix.sh b/build_scripts/boost_1_53_fix.sh
index fb0291a..833cd32 100755
--- a/build_scripts/boost_1_53_fix.sh
+++ b/build_scripts/boost_1_53_fix.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/boost_1_56_fix.sh b/build_scripts/boost_1_56_fix.sh
index 0cd9fd7..4aea474 100644
--- a/build_scripts/boost_1_56_fix.sh
+++ b/build_scripts/boost_1_56_fix.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/boost_1_57_fix.sh b/build_scripts/boost_1_57_fix.sh
index afb27d0..4ff2c66 100644
--- a/build_scripts/boost_1_57_fix.sh
+++ b/build_scripts/boost_1_57_fix.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/boost_build.sh b/build_scripts/boost_build.sh
index b79661d..223e51d 100755
--- a/build_scripts/boost_build.sh
+++ b/build_scripts/boost_build.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
@@ -25,8 +25,13 @@ echo "BOOST_ROOT=$BOOST_ROOT"
# From boost 1.56 > the location of site-config.jam location has changed
#
SITE_CONFIG_LOCATION=$BOOST_ROOT/tools/build/v2/site-config.jam
-BOOST_VERSION="$(basename $BOOST_ROOT)"
-if [ "$BOOST_VERSION" = boost_1_56_0 -o "$BOOST_VERSION" = boost_1_57_0 -o "$BOOST_VERSION" = boost_1_58_0 -o "$BOOST_VERSION" = boost_1_61_0 ] ; then
+BOOST_VERSION="$(basename $BOOST_ROOT)" # boost_1_53_0
+BOOST_MAJOR_VERSION=$(echo $BOOST_VERSION | cut -d_ -f2) # 1
+BOOST_MINOR_VERSION=$(echo $BOOST_VERSION | cut -d_ -f3) # 53
+BOOST_PATCH_VERSION=$(echo $BOOST_VERSION | cut -d_ -f4) # 0
+BOOST_NUMERIC_VERSION=$(( 1000*BOOST_MAJOR_VERSION + 10*BOOST_MINOR_VERSION + BOOST_PATCH_VERSION ))
+
+if [[ ${BOOST_NUMERIC_VERSION} -ge 1570 ]] ; then
SITE_CONFIG_LOCATION=$BOOST_ROOT/tools/build/src/site-config.jam
fi
@@ -80,7 +85,6 @@ if test_uname Linux ; then
else
if [ $tool = gcc ] ; then
-
cp $WK/build_scripts/site_config/site-config-Linux64.jam $SITE_CONFIG_LOCATION
# for boost 1.53 and > gcc 4.3 -Wno-unused-local-typedefs : not valid
diff --git a/build_scripts/clean.sh b/build_scripts/clean.sh
index 992d9e5..25b8ed2 100755
--- a/build_scripts/clean.sh
+++ b/build_scripts/clean.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/hpux_fix/README b/build_scripts/hpux_fix/README
index 44e80d3..47e6341 100644
--- a/build_scripts/hpux_fix/README
+++ b/build_scripts/hpux_fix/README
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/kill_ecf.sh b/build_scripts/kill_ecf.sh
index 9e2d86f..0ddb708 100755
--- a/build_scripts/kill_ecf.sh
+++ b/build_scripts/kill_ecf.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/massif.sh b/build_scripts/massif.sh
index 5234303..2c620f3 100755
--- a/build_scripts/massif.sh
+++ b/build_scripts/massif.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/profile.sh b/build_scripts/profile.sh
index 578a2bc..b440555 100755
--- a/build_scripts/profile.sh
+++ b/build_scripts/profile.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/rmbin.sh b/build_scripts/rmbin.sh
index 8314d55..496b024 100755
--- a/build_scripts/rmbin.sh
+++ b/build_scripts/rmbin.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/site_config/site-config-AIX.jam b/build_scripts/site_config/site-config-AIX.jam
index fa0aae5..1cb1df2 100644
--- a/build_scripts/site_config/site-config-AIX.jam
+++ b/build_scripts/site_config/site-config-AIX.jam
@@ -1,9 +1,9 @@
-## Copyright 2009-2016 ECMWF.
-## This software is licensed under the terms of the Apache Licence version 2.0
-## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-## In applying this licence, ECMWF does not waive the privileges and immunities
-## granted to it by virtue of its status as an intergovernmental organisation
-## nor does it submit to any jurisdiction.
+## Copyright 2009-2017 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
#
# site-config.jam for AIX v11.1 compiler
@@ -15,7 +15,7 @@ local BOOST_ROOT = [ os.environ BOOST_ROOT ] ;
# ========================= referenced libs =========================================
-# Boost libraries referenced in client/server programs.
+# Boost libraries referenced in client/server programs.
# Assumes --layout=tagged
#
lib boost_serialization : : <variant>debug <file>$(BOOST_ROOT)/stage/lib/libboost_serialization-mt-d.a ;
@@ -66,9 +66,9 @@ lib boost_python_static : : <variant>release <file>$(BOOST_ROOT)/stage/lib/lib
# Currently option 2-4 didn't work!
# <threading>multi
-# Note: in order to use xlC_r compiler, you have to use either
+# Note: in order to use xlC_r compiler, you have to use either
# "bjam threading=multi" OR
-# add
+# add
# requirements <threading>multi
# as below.
#
@@ -76,20 +76,20 @@ lib boost_python_static : : <variant>release <file>$(BOOST_ROOT)/stage/lib/lib
# <cxxflags>-qsuppress=1500-029
# In release mode we get hundreds of 1500-029 warning message, ie failure to inline
# hence decided to supress this.
-#
+#
# Suppress 1540-2883 (W) Inline function "<funtion>" given attribute noinline.
# This was the fix for release mode of the compiler & fixed the serialisation crash
-# Unfortunately it generates hundreds of warnings for each type seralized in each header file
+# Unfortunately it generates hundreds of warnings for each type seralized in each header file
# "/s1a/emos_esuite/emos_data/sms/boost/boost_1_45_0/boost/serialization/singleton.hpp", line 126.17: 1540-2883 (W) Inline function "void use(const void_caster_primitive<Alias,Submittable> &)" given attribute noinline.
# "/s1a/emos_esuite/emos_data/sms/boost/boost_1_45_0/boost/serialization/singleton.hpp", line 126.17: 1540-2883 (W) Inline function "void use(const iserializer<boost::archive::text_iarchive,PartExpression> &)" given attribute noinline.
-project site-config
- : requirements <include>$(BOOST_ROOT)
- : requirements <threading>multi
+project site-config
+ : requirements <include>$(BOOST_ROOT)
+ : requirements <threading>multi
: requirements <cxxflags>-qsuppress=1540-0198 # (W) The omitted keyword "private" is assumed for base class
: requirements <cxxflags>-qsuppress=1540-2883 # (W) Inline function "<function>" given attribute noinline.
: requirements <variant>release:<cxxflags>-qsuppress=1500-029 # supress could not be inlined message
- : requirements <linkflags>-bbigtoc
+ : requirements <linkflags>-bbigtoc
;
# using syntax:
diff --git a/build_scripts/site_config/site-config-HPUX.jam b/build_scripts/site_config/site-config-HPUX.jam
index b8e7b6f..ca032a9 100644
--- a/build_scripts/site_config/site-config-HPUX.jam
+++ b/build_scripts/site_config/site-config-HPUX.jam
@@ -1,9 +1,9 @@
-## Copyright 2009-2016 ECMWF.
-## This software is licensed under the terms of the Apache Licence version 2.0
-## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-## In applying this licence, ECMWF does not waive the privileges and immunities
-## granted to it by virtue of its status as an intergovernmental organisation
-## nor does it submit to any jurisdiction.
+## Copyright 2009-2017 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
#
# This file should be changed depending on the new system
@@ -43,7 +43,7 @@ lib boost_python_static : : <variant>release <file>$(BOOST_ROOT)/stage/lib/lib
lib rtc : : <variant>debug <file>/opt/langtools/lib/hpux32/librtc.so ;
-# project wide settings. Please disable requirements <variant>debug:<linkflags>+check=all
+# project wide settings. Please disable requirements <variant>debug:<linkflags>+check=all
# for release build.
# Note: _XOPEN_SOURCE_EXTENDED is only needed for Client/Server categories
# assuming its no harm to define everywhere
@@ -52,23 +52,23 @@ lib rtc : : <variant>debug <file>/opt/langtools/lib/hpux32/librtc.so ;
# hence use of BOOST_THREAD_DONT_USE_CHRONO, See http://www.boost.org/doc/libs/1_51_0/doc/html/thread/build.html
# Even with this boost thread/chrono does not compile. Kept in case fixed in the future
#
-project site-config
+project site-config
: requirements <include>$(BOOST_ROOT)
- : requirements <threading>multi
- : requirements <define>HPUX
- : requirements <define>_XOPEN_SOURCE_EXTENDED
- : requirements <define>BOOST_THREAD_DONT_USE_CHRONO
-# : requirements <library>rtc
-# : requirements <variant>debug:<linkflags>+check=all
+ : requirements <threading>multi
+ : requirements <define>HPUX
+ : requirements <define>_XOPEN_SOURCE_EXTENDED
+ : requirements <define>BOOST_THREAD_DONT_USE_CHRONO
+# : requirements <library>rtc
+# : requirements <variant>debug:<linkflags>+check=all
;
-
-
+
+
# STATIC: Additional Lint type checks.Will drastically slow down compiles, hence optional
#
# use <compileflags>+w for additional lint style checking
# Suppress the most prevalent boost warnings, this allows us to see lint
# checks in our own code
-#
+#
# suppress - warning #2261-D: controlling expression is constant
# - warning #2236-D: controlling expression is constant
# - remark #4296-D: arithmetic operation on boolean type
@@ -107,5 +107,5 @@ project site-config
#
using acc : : : <compileflags>+W2236,2461,2191,2815,4232,4189
;
-
+
using testing ;
diff --git a/build_scripts/site_config/site-config-Linux.jam b/build_scripts/site_config/site-config-Linux.jam
index 52231f4..1343631 100644
--- a/build_scripts/site_config/site-config-Linux.jam
+++ b/build_scripts/site_config/site-config-Linux.jam
@@ -1,9 +1,9 @@
-## Copyright 2009-2016 ECMWF.
-## This software is licensed under the terms of the Apache Licence version 2.0
-## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-## In applying this licence, ECMWF does not waive the privileges and immunities
-## granted to it by virtue of its status as an intergovernmental organisation
-## nor does it submit to any jurisdiction.
+## Copyright 2009-2017 ECMWF.
+## This software is licensed under the terms of the Apache Licence version 2.0
+## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+## In applying this licence, ECMWF does not waive the privileges and immunities
+## granted to it by virtue of its status as an intergovernmental organisation
+## nor does it submit to any jurisdiction.
# ===================================================================
# site-config.jam file for Linux/gcc
@@ -18,7 +18,7 @@ local BOOST_ROOT = [ os.environ BOOST_ROOT ] ;
#
# --layout=system -> libboost_system.a (default)
-# --layout=tagged -> libboost_system-mt-d.a(debug) libboost_system-mt.a(release)
+# --layout=tagged -> libboost_system-mt-d.a(debug) libboost_system-mt.a(release)
# --layout=versioned -> libboost_system-xlc-mt-d-1.42(debug) libboost_system-xlc-mt-1_42.a(release)
#
# Boost libraries referenced in client/server programs
@@ -63,8 +63,8 @@ lib boost_python_static : : <variant>release <file>$(BOOST_ROOT)/stage/lib/lib
# a/ Not all tests require it
# b/ Can cause links errors
# Hence left to individual projects/test
-project site-config
- : requirements <include>$(BOOST_ROOT)
+project site-config
+ : requirements <include>$(BOOST_ROOT)
;
# using syntax:
@@ -77,7 +77,7 @@ using testing ;
# ==================== ECFLOWVIEW =======================================================
local motif_library = [ os.environ MOTIF_LIBRARY ] ;
-motif_library default = "/usr/lib64" ;
-constant MOTIF_LIBRARY : $(motif_library) ;
+motif_library default = "/usr/lib64" ;
+constant MOTIF_LIBRARY : $(motif_library) ;
MOTIF_LIBRARY default = /usr/lib ;
diff --git a/build_scripts/site_config/site-config-Linux64-clang.jam b/build_scripts/site_config/site-config-Linux64-clang.jam
index 0b2cea5..5872b63 100644
--- a/build_scripts/site_config/site-config-Linux64-clang.jam
+++ b/build_scripts/site_config/site-config-Linux64-clang.jam
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/site_config/site-config-Linux64-intel.jam b/build_scripts/site_config/site-config-Linux64-intel.jam
index 5ef00f9..384e343 100644
--- a/build_scripts/site_config/site-config-Linux64-intel.jam
+++ b/build_scripts/site_config/site-config-Linux64-intel.jam
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/site_config/site-config-Linux64.jam b/build_scripts/site_config/site-config-Linux64.jam
index 8ae2710..b633ec4 100644
--- a/build_scripts/site_config/site-config-Linux64.jam
+++ b/build_scripts/site_config/site-config-Linux64.jam
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/site_config/site-config-cray.jam b/build_scripts/site_config/site-config-cray.jam
index b1889d3..9938d85 100644
--- a/build_scripts/site_config/site-config-cray.jam
+++ b/build_scripts/site_config/site-config-cray.jam
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/tar_ecflow.sh b/build_scripts/tar_ecflow.sh
index e04a16a..9257c17 100755
--- a/build_scripts/tar_ecflow.sh
+++ b/build_scripts/tar_ecflow.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/test.sh b/build_scripts/test.sh
index 351ddfc..af66724 100755
--- a/build_scripts/test.sh
+++ b/build_scripts/test.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/update_site_config.sh b/build_scripts/update_site_config.sh
index ee31158..7d5d15f 100644
--- a/build_scripts/update_site_config.sh
+++ b/build_scripts/update_site_config.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/build_scripts/val.sh b/build_scripts/val.sh
index 8ab7bb9..ff65874 100755
--- a/build_scripts/val.sh
+++ b/build_scripts/val.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/cmake.sh b/cmake.sh
index 7015e94..0a59595 100755
--- a/cmake.sh
+++ b/cmake.sh
@@ -11,13 +11,15 @@ umask 0022
show_error_and_exit() {
echo "cmake.sh expects at least one argument"
echo " cmake.sh debug || release [clang] [san] [make] [verbose] [test] [stest] [no_gui] [package_source] [debug]"
- echo " "
+ echo ""
echo " make - run make after cmake"
+ echo " python3 - build with python3"
echo " ecbuild - Use git cloned ecbuild over the module loaded ecbuild(default)"
echo " install - install to /usr/local/apps/eflow. defaults is /var/tmp/$USER/install/cmake/ecflow"
echo " test - run all the tests"
echo " test_safe - only run deterministic tests"
echo " ctest - all ctest -R <test> -V"
+ echo " clang - build with clang compiler"
echo " san - is short for clang thread sanitiser"
echo " no_gui - Don't build the gui"
echo " ssl - build using openssl"
@@ -26,6 +28,9 @@ show_error_and_exit() {
echo " package_source - produces ecFlow-<version>-Source.tar.gz file, for users"
echo " copies the tar file to $SCRATCH"
echo " copy_tarball - copies ecFlow-<version>-Source.tar.gz to /tmp/$USER/tmp/. and untars file"
+ echo "\nTo Build with system boost, just call:"
+ echo " 'module load boost/1.53.0' "
+ echo "first"
exit 1
}
@@ -113,22 +118,33 @@ echo "no_gui_arg=$no_gui_arg"
echo "ecbuild_arg=$ecbuild_arg"
set -x # echo script lines as they are executed
+# ==================== compiler flags ========================================
+#
+# GNU 4.8+ -Wno-unused-local-typedefs -> get round warning in boost headers
+# GNU 5.3 -Wno-unused-variable -> get round warning in boost headers
+# GNU 6.1 -Wno-deprecated-declarations -> auto_ptr deprecated warning, mostly in boost headers
+# CLANG -ftemplate-depth=512
+#
+CXX_FLAGS="-Wno-unused-local-typedefs -Wno-unused-variable"
+
# ==================== modules ================================================
# To load module automatically requires Korn shell, system start scripts
module load cmake/3.3.2
-module load ecbuild/2.5.0
+module load ecbuild/2.6.0
cmake_extra_options=""
if [[ "$clang_arg" = clang ]] ; then
module unload gnu
module load clang
- cmake_extra_options="-DCMAKE_CXX_FLAGS=-ftemplate-depth=512"
+ CXX_FLAGS="$CXX_FLAGS -ftemplate-depth=512 -Wno-expansion-to-defined"
+ cmake_extra_options="-DBOOST_ROOT=/var/tmp/ma0/boost/clang/boost_1_53_0"
fi
if [[ "$clang_sanitiser_arg" = san ]] ; then
module unload gnu
module load clang
- cmake_extra_options="$cmake_extra_options -DCMAKE_C_FLAGS=-fsanitize=thread"
+ CXX_FLAGS="$CXX_FLAGS -ftemplate-depth=512 -Wno-expansion-to-defined -fsanitize=thread"
+ cmake_extra_options="-DBOOST_ROOT=/var/tmp/ma0/boost/clang/boost_1_53_0"
fi
if [[ "$ARCH" = cray ]] ; then
@@ -151,18 +167,11 @@ fi
if [[ "$python3_arg" = python3 ]] ; then
# Need to wait for ecbuild to fix print error, meanwhile use local ecbuild to test python3
cmake_extra_options="$cmake_extra_options -DPYTHON_EXECUTABLE=/usr/local/apps/python3/3.5.1-01/bin/python3.5"
+ cmake_extra_options="$cmake_extra_options -DBOOST_ROOT=/var/tmp/ma0/boost/boost_1_53_0.python3"
fi
-
-# ===================================================================================
-# boost
-# if OS_VERSION not defined , default to empty string
-: ${OS_VERSION:=""}
-
-if [[ "$OS_VERSION" = "leap42" ]] ; then
- module load boost/1.53.0
-fi
-
-# ====================================================================================
+
+# ====================================================================================
+# default to Release
cmake_build_type=
if [[ $mode_arg = debug ]] ; then
cmake_build_type=Debug
@@ -178,12 +187,14 @@ minor=$(cat VERSION.cmake | grep 'set( ECFLOW_MINOR' | awk '{print $3}'| sed
# ====================================================================================
# clean up source before packaging, do this after deleting ecbuild
+#
if [[ $package_source_arg = package_source ]] ; then
source build_scripts/clean.sh
fi
# =======================================================================================
# Change directory
+#
source_dir=$(pwd)
workspace=$(pwd)/..
@@ -194,8 +205,9 @@ fi
mkdir -p ../bdir/$mode_arg/ecflow
cd ../bdir/$mode_arg/ecflow
-
# =============================================================================================
+# ctest
+#
if [[ $test_arg = test || $test_safe_arg = test_safe ]] ; then
ctest -R ^u_
ctest -R c_
@@ -210,8 +222,6 @@ if [[ $test_arg = test ]] ; then
ctest -R py_s
exit 0
fi
-
-# ctest
if [[ "$ctest_arg" != "" ]] ; then
$ctest_arg
exit 0
@@ -228,8 +238,6 @@ fi
# -DCMAKE_PYTHON_INSTALL_PREFIX should *only* used when using python setup.py (CMAKE_PYTHON_INSTALL_TYPE=setup)
# *AND* for testing python install to local directory
#
-# GNU 4.8+ -Wno-unused-local-typedefs -> get round warning in boost headers
-# GNU 6.1 -Wno-deprecated-declarations -> auto_ptr deprecated warning, mostly in boost headers
ssl_options=
if [[ $ssl_arg = ssl ]] ; then
@@ -270,7 +278,7 @@ $ecbuild $source_dir \
-DCMAKE_BUILD_TYPE=$cmake_build_type \
-DCMAKE_INSTALL_PREFIX=$install_prefix \
-DENABLE_WARNINGS=ON \
- -DCMAKE_CXX_FLAGS="-Wno-unused-local-typedefs" \
+ -DCMAKE_CXX_FLAGS="$CXX_FLAGS" \
-DCMAKE_PYTHON_INSTALL_TYPE=local \
-DCMAKE_PREFIX_PATH="/usr/local/apps/qt/5.5.0/5.5/gcc_64/" \
-DENABLE_STATIC_BOOST_LIBS=ON \
@@ -282,12 +290,14 @@ $ecbuild $source_dir \
#-DENABLE_ALL_TESTS=ON
#-DENABLE_GUI=ON -DENABLE_UI=ON
#-DENABLE_SERVER=OFF \
- #-DCMAKE_PYTHON_INSTALL_PREFIX=/var/tmp/$USER/install/python/ecflow/$release.$major.$minor \
- #-DCMAKE_CXX_FLAGS="'-Wno-unused-local-typedefs -Wno-deprecated'"
+ #-DCMAKE_PYTHON_INSTALL_PREFIX=/var/tmp/$USER/install/python/ecflow/$release.$major.$minor
+ #-DENABLE_PROFILING=ON
+ #-DECBUILD_GPROF_FLAGS
# =============================================================================================
if [[ "$make_arg" != "" ]] ; then
- $make_arg
+ $make_arg
+ # $make_arg VERBOSE=1
exit 0
fi
diff --git a/cmake/FindADSM.cmake b/cmake/FindADSM.cmake
index b46e798..daadf0e 100644
--- a/cmake/FindADSM.cmake
+++ b/cmake/FindADSM.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindAEC.cmake b/cmake/FindAEC.cmake
index 717b2b5..0b0f69b 100644
--- a/cmake/FindAEC.cmake
+++ b/cmake/FindAEC.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindAIO.cmake b/cmake/FindAIO.cmake
index 76e357a..5dd9244 100644
--- a/cmake/FindAIO.cmake
+++ b/cmake/FindAIO.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindArmadillo.cmake b/cmake/FindArmadillo.cmake
index 4ef1a4a..dfe77a2 100644
--- a/cmake/FindArmadillo.cmake
+++ b/cmake/FindArmadillo.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindCMath.cmake b/cmake/FindCMath.cmake
index b8a2a0b..741728a 100644
--- a/cmake/FindCMath.cmake
+++ b/cmake/FindCMath.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindDl.cmake b/cmake/FindDl.cmake
index 16463c6..31e426f 100644
--- a/cmake/FindDl.cmake
+++ b/cmake/FindDl.cmake
@@ -1,4 +1,4 @@
-# © Copyright 1996-2016 ECMWF.
+# © Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindEMOS.cmake b/cmake/FindEMOS.cmake
index c549fc2..43f896e 100644
--- a/cmake/FindEMOS.cmake
+++ b/cmake/FindEMOS.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindFDB.cmake b/cmake/FindFDB.cmake
index 4bcbdf3..66879c1 100644
--- a/cmake/FindFDB.cmake
+++ b/cmake/FindFDB.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindFFTW.cmake b/cmake/FindFFTW.cmake
index b76afa5..d57c09a 100644
--- a/cmake/FindFFTW.cmake
+++ b/cmake/FindFFTW.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindGeoTIFF.cmake b/cmake/FindGeoTIFF.cmake
index 126bc46..7226f61 100644
--- a/cmake/FindGeoTIFF.cmake
+++ b/cmake/FindGeoTIFF.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindHPSS.cmake b/cmake/FindHPSS.cmake
index b2b662b..1cc829e 100644
--- a/cmake/FindHPSS.cmake
+++ b/cmake/FindHPSS.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindLEX.cmake b/cmake/FindLEX.cmake
index 221868f..b6ab838 100644
--- a/cmake/FindLEX.cmake
+++ b/cmake/FindLEX.cmake
@@ -44,7 +44,7 @@
# This file is based on the FindFLEX CMake macro, and adapted by ECMWF
#=============================================================================
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindLibGFortran.cmake b/cmake/FindLibGFortran.cmake
index a293ea5..7f9cc64 100644
--- a/cmake/FindLibGFortran.cmake
+++ b/cmake/FindLibGFortran.cmake
@@ -1,4 +1,4 @@
-# © Copyright 1996-2016 ECMWF.
+# © Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindLibIFort.cmake b/cmake/FindLibIFort.cmake
index da782a4..4c3e299 100644
--- a/cmake/FindLibIFort.cmake
+++ b/cmake/FindLibIFort.cmake
@@ -1,4 +1,4 @@
-# © Copyright 1996-2016 ECMWF.
+# © Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindLustreAPI.cmake b/cmake/FindLustreAPI.cmake
new file mode 100644
index 0000000..6db0ba2
--- /dev/null
+++ b/cmake/FindLustreAPI.cmake
@@ -0,0 +1,43 @@
+# (C) Copyright 1996-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+
+# - Try to find lib Lustre API
+
+# usually installed on Cray systems under /opt/cray/lustre-cray_ari_s/default / create_test.c -L
+# .../include/lustre/lustreapi.h
+# .../lib64/liblustreapi.so
+
+# Once done this will define
+# LUSTREAPI_FOUND - System has LustreAPI
+# LUSTREAPI_INCLUDE_DIRS - The LustreAPI include directories
+# LUSTREAPI_LIBRARIES - The libraries needed to use LustreAPI
+#
+# The following paths will be searched with priority if set in CMake or env
+#
+# LUSTREAPI_DIR - prefix path of the LustreAPI installation
+# LUSTREAPI_PATH - prefix path of the LustreAPI installation
+
+find_path( LUSTREAPI_INCLUDE_DIR lustre/lustreapi.h
+ PATHS ${LUSTREAPI_DIR} ${LUSTREAPI_PATH} ENV LUSTREAPI_DIR ENV LUSTREAPI_PATH
+ PATH_SUFFIXES include NO_DEFAULT_PATH )
+
+find_path( LUSTREAPI_INCLUDE_DIR lustre/lustreapi.h PATH_SUFFIXES include )
+
+find_library( LUSTREAPI_LIBRARY NAMES lustreapi
+ PATHS ${LUSTREAPI_DIR} ${LUSTREAPI_PATH} ENV LUSTREAPI_DIR ENV LUSTREAPI_PATH
+ PATH_SUFFIXES lib lib64 NO_DEFAULT_PATH )
+find_library( LUSTREAPI_LIBRARY NAMES lustreapi PATH_SUFFIXES lib lib64 )
+
+set( LUSTREAPI_LIBRARIES ${LUSTREAPI_LIBRARY} )
+set( LUSTREAPI_INCLUDE_DIRS ${LUSTREAPI_INCLUDE_DIR} )
+
+include(FindPackageHandleStandardArgs)
+
+find_package_handle_standard_args(LUSTREAPI DEFAULT_MSG LUSTREAPI_LIBRARY LUSTREAPI_INCLUDE_DIR)
+
+mark_as_advanced(LUSTREAPI_INCLUDE_DIR LUSTREAPI_LIBRARY )
diff --git a/cmake/FindMKL.cmake b/cmake/FindMKL.cmake
index 5941179..59eaa60 100644
--- a/cmake/FindMKL.cmake
+++ b/cmake/FindMKL.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindNDBM.cmake b/cmake/FindNDBM.cmake
index 869223f..8cd350e 100644
--- a/cmake/FindNDBM.cmake
+++ b/cmake/FindNDBM.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindNetCDF.cmake b/cmake/FindNetCDF.cmake
index 9084549..69b88bd 100644
--- a/cmake/FindNetCDF.cmake
+++ b/cmake/FindNetCDF.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindNetCDF3.cmake b/cmake/FindNetCDF3.cmake
index 5519fd6..1783a72 100644
--- a/cmake/FindNetCDF3.cmake
+++ b/cmake/FindNetCDF3.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindODB.cmake b/cmake/FindODB.cmake
index 1beb5c8..7c35d6e 100644
--- a/cmake/FindODB.cmake
+++ b/cmake/FindODB.cmake
@@ -1,4 +1,4 @@
-# © Copyright 1996-2016 ECMWF.
+# © Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindOpenCL.cmake b/cmake/FindOpenCL.cmake
index 9b6e978..510a3a9 100644
--- a/cmake/FindOpenCL.cmake
+++ b/cmake/FindOpenCL.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindOpenJPEG.cmake b/cmake/FindOpenJPEG.cmake
index c660238..66d976e 100644
--- a/cmake/FindOpenJPEG.cmake
+++ b/cmake/FindOpenJPEG.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindPGIFortran.cmake b/cmake/FindPGIFortran.cmake
index e68bdf6..5d33239 100644
--- a/cmake/FindPGIFortran.cmake
+++ b/cmake/FindPGIFortran.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindPango.cmake b/cmake/FindPango.cmake
index 76e152a..f135864 100644
--- a/cmake/FindPango.cmake
+++ b/cmake/FindPango.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindPangoCairo.cmake b/cmake/FindPangoCairo.cmake
index 9979550..cb70737 100644
--- a/cmake/FindPangoCairo.cmake
+++ b/cmake/FindPangoCairo.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindREADLINE.cmake b/cmake/FindREADLINE.cmake
index 2ba08b4..a146c62 100644
--- a/cmake/FindREADLINE.cmake
+++ b/cmake/FindREADLINE.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindRPCGEN.cmake b/cmake/FindRPCGEN.cmake
index fd42e9f..42ed90c 100644
--- a/cmake/FindRPCGEN.cmake
+++ b/cmake/FindRPCGEN.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindRealtime.cmake b/cmake/FindRealtime.cmake
index 843a54f..78fa4c5 100644
--- a/cmake/FindRealtime.cmake
+++ b/cmake/FindRealtime.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindSZip.cmake b/cmake/FindSZip.cmake
index 925348c..f005546 100644
--- a/cmake/FindSZip.cmake
+++ b/cmake/FindSZip.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindTrilinos.cmake b/cmake/FindTrilinos.cmake
index 0d99b54..b1584f8 100644
--- a/cmake/FindTrilinos.cmake
+++ b/cmake/FindTrilinos.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindViennaCL.cmake b/cmake/FindViennaCL.cmake
index aba2980..8f442c9 100644
--- a/cmake/FindViennaCL.cmake
+++ b/cmake/FindViennaCL.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindXLFortranLibs.cmake b/cmake/FindXLFortranLibs.cmake
index 37800c7..80f2923 100644
--- a/cmake/FindXLFortranLibs.cmake
+++ b/cmake/FindXLFortranLibs.cmake
@@ -1,4 +1,4 @@
-# © Copyright 1996-2016 ECMWF.
+# © Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/FindYACC.cmake b/cmake/FindYACC.cmake
index 7b15bfe..3eb3b5c 100644
--- a/cmake/FindYACC.cmake
+++ b/cmake/FindYACC.cmake
@@ -41,7 +41,7 @@
# This file is based on the FindFLEX CMake macro, and adapted by ECMWF
#=============================================================================
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/Findgrib_api.cmake b/cmake/Findgrib_api.cmake
index ab6fc0b..c6f6421 100644
--- a/cmake/Findgrib_api.cmake
+++ b/cmake/Findgrib_api.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/Findodb_api.cmake b/cmake/Findodb_api.cmake
index 0058fbe..00f4152 100644
--- a/cmake/Findodb_api.cmake
+++ b/cmake/Findodb_api.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/Findspot.cmake b/cmake/Findspot.cmake
index 52e0fb5..d932bfe 100644
--- a/cmake/Findspot.cmake
+++ b/cmake/Findspot.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/VERSION.cmake b/cmake/VERSION.cmake
index d9d8705..ce5f7de 100644
--- a/cmake/VERSION.cmake
+++ b/cmake/VERSION.cmake
@@ -1,7 +1,7 @@
set( ECBUILD_MAJOR_VERSION "2" )
-set( ECBUILD_MINOR_VERSION "5" )
+set( ECBUILD_MINOR_VERSION "6" )
set( ECBUILD_PATCH_VERSION "0" )
-set( ECBUILD_VERSION_STR "2.5.0" )
+set( ECBUILD_VERSION_STR "2.6.0" )
set( ECBUILD_MACRO_VERSION "${ECBUILD_MAJOR_VERSION}.${ECBUILD_MINOR_VERSION}" )
diff --git a/cmake/compiler_flags/Clang_C.cmake b/cmake/compiler_flags/Clang_C.cmake
index bc73c69..b742a5b 100644
--- a/cmake/compiler_flags/Clang_C.cmake
+++ b/cmake/compiler_flags/Clang_C.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/Clang_CXX.cmake b/cmake/compiler_flags/Clang_CXX.cmake
index 53f0f21..7570630 100644
--- a/cmake/compiler_flags/Clang_CXX.cmake
+++ b/cmake/compiler_flags/Clang_CXX.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/Cray_C.cmake b/cmake/compiler_flags/Cray_C.cmake
index f487cf4..f9b6e4b 100644
--- a/cmake/compiler_flags/Cray_C.cmake
+++ b/cmake/compiler_flags/Cray_C.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/Cray_CXX.cmake b/cmake/compiler_flags/Cray_CXX.cmake
index a2a6632..fdc4749 100644
--- a/cmake/compiler_flags/Cray_CXX.cmake
+++ b/cmake/compiler_flags/Cray_CXX.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/Cray_Fortran.cmake b/cmake/compiler_flags/Cray_Fortran.cmake
index 34b96e4..8575bba 100644
--- a/cmake/compiler_flags/Cray_Fortran.cmake
+++ b/cmake/compiler_flags/Cray_Fortran.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/GNU_C.cmake b/cmake/compiler_flags/GNU_C.cmake
index 955f527..288fc70 100644
--- a/cmake/compiler_flags/GNU_C.cmake
+++ b/cmake/compiler_flags/GNU_C.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/GNU_CXX.cmake b/cmake/compiler_flags/GNU_CXX.cmake
index 0ab8c3a..1a01e2d 100644
--- a/cmake/compiler_flags/GNU_CXX.cmake
+++ b/cmake/compiler_flags/GNU_CXX.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/GNU_Fortran.cmake b/cmake/compiler_flags/GNU_Fortran.cmake
index a12abec..6e28844 100644
--- a/cmake/compiler_flags/GNU_Fortran.cmake
+++ b/cmake/compiler_flags/GNU_Fortran.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/Intel_C.cmake b/cmake/compiler_flags/Intel_C.cmake
index dbea59f..5736004 100644
--- a/cmake/compiler_flags/Intel_C.cmake
+++ b/cmake/compiler_flags/Intel_C.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/Intel_CXX.cmake b/cmake/compiler_flags/Intel_CXX.cmake
index 5b8dc78..8e466e5 100644
--- a/cmake/compiler_flags/Intel_CXX.cmake
+++ b/cmake/compiler_flags/Intel_CXX.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/Intel_Fortran.cmake b/cmake/compiler_flags/Intel_Fortran.cmake
index 86b69dc..abd85f8 100644
--- a/cmake/compiler_flags/Intel_Fortran.cmake
+++ b/cmake/compiler_flags/Intel_Fortran.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/PGI_C.cmake b/cmake/compiler_flags/PGI_C.cmake
index 6784a14..1cc6485 100644
--- a/cmake/compiler_flags/PGI_C.cmake
+++ b/cmake/compiler_flags/PGI_C.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/PGI_CXX.cmake b/cmake/compiler_flags/PGI_CXX.cmake
index 877ef3f..6d31cf4 100644
--- a/cmake/compiler_flags/PGI_CXX.cmake
+++ b/cmake/compiler_flags/PGI_CXX.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/compiler_flags/PGI_Fortran.cmake b/cmake/compiler_flags/PGI_Fortran.cmake
index a268cc9..86c2a35 100644
--- a/cmake/compiler_flags/PGI_Fortran.cmake
+++ b/cmake/compiler_flags/PGI_Fortran.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild-config-version.cmake b/cmake/ecbuild-config-version.cmake
index 735aaf1..3ca2385 100644
--- a/cmake/ecbuild-config-version.cmake
+++ b/cmake/ecbuild-config-version.cmake
@@ -1,4 +1,4 @@
-set(PACKAGE_VERSION "2.5.0")
+set(PACKAGE_VERSION "2.6.0")
# check whether the requested PACKAGE_FIND_VERSION is compatible
diff --git a/cmake/ecbuild-config.cmake b/cmake/ecbuild-config.cmake
index 260664d..73fe5a1 100644
--- a/cmake/ecbuild-config.cmake
+++ b/cmake/ecbuild-config.cmake
@@ -28,9 +28,9 @@ set( ECBUILD_TPL_INCLUDE_DIRS "" )
set( ECBUILD_TPL_DEFINITIONS "" )
set( ECBUILD_TPL_LIBRARIES "" )
-set( ECBUILD_VERSION "2.5.0" )
-set( ECBUILD_GIT_SHA1 "7ec05b00ab6843a69d6dff1f0c0450ca894b409b" )
-set( ECBUILD_GIT_SHA1_SHORT "7ec05b0" )
+set( ECBUILD_VERSION "2.6.0" )
+set( ECBUILD_GIT_SHA1 "2967c31ee4768c165e61cab919c370a54dde0772" )
+set( ECBUILD_GIT_SHA1_SHORT "2967c31" )
### export include paths as absolute paths
@@ -73,7 +73,7 @@ include( ${CMAKE_CURRENT_LIST_FILE}.tpls OPTIONAL )
if( NOT ecbuild_BINARY_DIR )
if( ECBUILD_IS_BUILD_DIR_EXPORT )
- include( "/tmp/metabuilds/ecflow-metab_5062/opensuse131/ecbuild/builds/ecbuild-targets.cmake" OPTIONAL )
+ include( "/tmp/metabuilds/ecflow-metab_5062/leap42/ecbuild/builds/ecbuild-targets.cmake" OPTIONAL )
else()
include( "${ECBUILD_CMAKE_DIR}/ecbuild-targets.cmake" )
endif()
@@ -89,7 +89,7 @@ mark_as_advanced( ECBUILD_IMPORT_FILE )
if( NOT ecbuild )
if( ECBUILD_IS_BUILD_DIR_EXPORT )
- set( ecbuild_BASE_DIR /tmp/metabuilds/ecflow-metab_5062/opensuse131/ecbuild/builds )
+ set( ecbuild_BASE_DIR /tmp/metabuilds/ecflow-metab_5062/leap42/ecbuild/builds )
else()
get_filename_component( abspath ${CMAKE_CURRENT_LIST_DIR}/../../.. ABSOLUTE )
set( ecbuild_BASE_DIR ${abspath} )
diff --git a/cmake/ecbuild_add_c_flags.cmake b/cmake/ecbuild_add_c_flags.cmake
index 098c254..138e4d8 100644
--- a/cmake/ecbuild_add_c_flags.cmake
+++ b/cmake/ecbuild_add_c_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_add_cxx11_flags.cmake b/cmake/ecbuild_add_cxx11_flags.cmake
index df8cde5..6c5c861 100644
--- a/cmake/ecbuild_add_cxx11_flags.cmake
+++ b/cmake/ecbuild_add_cxx11_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_add_cxx_flags.cmake b/cmake/ecbuild_add_cxx_flags.cmake
index 5104880..699c50a 100644
--- a/cmake/ecbuild_add_cxx_flags.cmake
+++ b/cmake/ecbuild_add_cxx_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_add_executable.cmake b/cmake/ecbuild_add_executable.cmake
index 424059e..5d78348 100644
--- a/cmake/ecbuild_add_executable.cmake
+++ b/cmake/ecbuild_add_executable.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -142,6 +142,28 @@ macro( ecbuild_add_executable )
if( _${_PAR_TARGET}_condition )
+ # insert already compiled objects (from OBJECT libraries)
+ unset( _all_objects )
+ foreach( _obj ${_PAR_OBJECTS} )
+ list( APPEND _all_objects $<TARGET_OBJECTS:${_obj}> )
+ endforeach()
+
+ list( APPEND _PAR_SOURCES ${_glob_srcs} )
+
+ if( ECBUILD_LIST_SOURCES )
+ ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): sources ${_PAR_SOURCES}")
+ endif()
+
+ # glob sources
+ unset( _glob_srcs )
+ foreach( pattern ${_PAR_SOURCES_GLOB} )
+ ecbuild_list_add_pattern( LIST _glob_srcs GLOB "${pattern}" )
+ endforeach()
+
+ foreach( pattern ${_PAR_SOURCES_EXCLUDE_REGEX} )
+ ecbuild_list_exclude_pattern( LIST _glob_srcs REGEX "${pattern}" )
+ endforeach()
+
# add persistent layer files
if( DEFINED _PAR_PERSISTENT )
if( DEFINED PERSISTENT_NAMESPACE )
@@ -158,29 +180,26 @@ macro( ecbuild_add_executable )
add_custom_target( ${_PAR_TARGET}_templates SOURCES ${_PAR_TEMPLATES} )
endif()
- # glob sources
- unset( _glob_srcs )
- foreach( pattern ${_PAR_SOURCES_GLOB} )
- ecbuild_list_add_pattern( LIST _glob_srcs GLOB "${pattern}" )
- endforeach()
-
- foreach( pattern ${_PAR_SOURCES_EXCLUDE_REGEX} )
- ecbuild_list_exclude_pattern( LIST _glob_srcs REGEX "${pattern}" )
- endforeach()
-
- # insert already compiled objects (from OBJECT libraries)
- unset( _all_objects )
- foreach( _obj ${_PAR_OBJECTS} )
- list( APPEND _all_objects $<TARGET_OBJECTS:${_obj}> )
- endforeach()
-
- list( APPEND _PAR_SOURCES ${_glob_srcs} )
+ # Separate sources
+ if( _PAR_SOURCES )
+ ecbuild_separate_sources( TARGET ${_PAR_TARGET} SOURCES ${_PAR_SOURCES} )
+ endif()
- if( ECBUILD_LIST_SOURCES )
- ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): sources ${_PAR_SOURCES}")
+ if( ${_PAR_TARGET}_cuda_srcs )
+ if( NOT CUDA_FOUND )
+ ecbuild_error("ecbuild_add_executable(${_PAR_TARGET}): CUDA source files detected"
+ "but CUDA was not found.")
+ endif()
+ ecbuild_debug("ecbuild_add_executable(${_PAR_TARGET}): CUDA sources detected."
+ "Building executable with ecbuild_add_executable() rather than intrinsic"
+ "add_executable().")
endif()
- add_executable( ${_PAR_TARGET} ${_PAR_SOURCES} ${_all_objects} )
+ if( NOT ${_PAR_TARGET}_cuda_srcs )
+ add_executable( ${_PAR_TARGET} ${_PAR_SOURCES} ${_all_objects} )
+ else()
+ cuda_add_executable( ${_PAR_TARGET} ${_PAR_SOURCES} ${_all_objects} )
+ endif()
# ecbuild_echo_target( ${_PAR_TARGET} )
@@ -225,15 +244,6 @@ macro( ecbuild_add_executable )
endforeach()
endif()
- # filter sources
-
- ecbuild_separate_sources( TARGET ${_PAR_TARGET} SOURCES ${_PAR_SOURCES} )
-
- # ecbuild_debug_var( ${_PAR_TARGET}_h_srcs )
- # ecbuild_debug_var( ${_PAR_TARGET}_c_srcs )
- # ecbuild_debug_var( ${_PAR_TARGET}_cxx_srcs )
- # ecbuild_debug_var( ${_PAR_TARGET}_fortran_srcs )
-
# Override compilation flags on a per source file basis
ecbuild_target_flags( ${_PAR_TARGET} "${_PAR_CFLAGS}" "${_PAR_CXXFLAGS}" "${_PAR_FFLAGS}" )
diff --git a/cmake/ecbuild_add_extra_search_paths.cmake b/cmake/ecbuild_add_extra_search_paths.cmake
index 94ac85b..690cde6 100644
--- a/cmake/ecbuild_add_extra_search_paths.cmake
+++ b/cmake/ecbuild_add_extra_search_paths.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_add_fortran_flags.cmake b/cmake/ecbuild_add_fortran_flags.cmake
index 0d3b544..2ac89e8 100644
--- a/cmake/ecbuild_add_fortran_flags.cmake
+++ b/cmake/ecbuild_add_fortran_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_add_library.cmake b/cmake/ecbuild_add_library.cmake
index a7f8001..ee29008 100644
--- a/cmake/ecbuild_add_library.cmake
+++ b/cmake/ecbuild_add_library.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -200,6 +200,26 @@ function( ecbuild_add_library_impl )
ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): library type is ${_PAR_TYPE}")
endif()
+ # insert already compiled objects (from OBJECT libraries)
+ unset( _all_objects )
+ foreach( _obj ${_PAR_OBJECTS} )
+ list( APPEND _all_objects $<TARGET_OBJECTS:${_obj}> )
+ endforeach()
+
+ # glob sources
+ unset( _glob_srcs )
+ foreach( pattern ${_PAR_SOURCES_GLOB} )
+ ecbuild_list_add_pattern( LIST _glob_srcs GLOB "${pattern}" )
+ endforeach()
+
+ foreach( pattern ${_PAR_SOURCES_EXCLUDE_REGEX} )
+ ecbuild_list_exclude_pattern( LIST _glob_srcs REGEX "${pattern}" )
+ endforeach()
+ list( APPEND _PAR_SOURCES ${_glob_srcs} )
+
+ if( ECBUILD_LIST_SOURCES )
+ ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): sources ${_PAR_SOURCES}")
+ endif()
# add persistent layer files
if( DEFINED _PAR_PERSISTENT )
@@ -217,30 +237,30 @@ function( ecbuild_add_library_impl )
add_custom_target( ${_PAR_TARGET}_templates SOURCES ${_PAR_TEMPLATES} )
endif()
- # glob sources
- unset( _glob_srcs )
- foreach( pattern ${_PAR_SOURCES_GLOB} )
- ecbuild_list_add_pattern( LIST _glob_srcs GLOB "${pattern}" )
- endforeach()
-
- foreach( pattern ${_PAR_SOURCES_EXCLUDE_REGEX} )
- ecbuild_list_exclude_pattern( LIST _glob_srcs REGEX "${pattern}" )
- endforeach()
-
- # insert already compiled objects (from OBJECT libraries)
- unset( _all_objects )
- foreach( _obj ${_PAR_OBJECTS} )
- list( APPEND _all_objects $<TARGET_OBJECTS:${_obj}> )
- endforeach()
-
- list( APPEND _PAR_SOURCES ${_glob_srcs} )
-
- if( ECBUILD_LIST_SOURCES )
- ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): sources ${_PAR_SOURCES}")
+ # Separate sources
+ if( _PAR_SOURCES )
+ ecbuild_separate_sources( TARGET ${_PAR_TARGET} SOURCES ${_PAR_SOURCES} )
endif()
- add_library( ${_PAR_TARGET} ${_PAR_TYPE} ${_PAR_SOURCES} ${_all_objects} )
+ if( ${_PAR_TARGET}_cuda_srcs )
+ if( NOT CUDA_FOUND )
+ ecbuild_error("ecbuild_add_library(${_PAR_TARGET}): CUDA source files detected"
+ "but CUDA was not found.")
+ endif()
+ if( _PAR_TYPE MATCHES "OBJECT" )
+ ecbuild_error("ecbuild_add_library(${_PAR_TARGET}): CUDA source files detected"
+ "but CMake OBJECT libraries with CUDA are not supported.")
+ endif()
+ ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): CUDA sources detected."
+ "Building library with cuda_add_library() rather than intrinsic"
+ "add_library().")
+ endif()
+ if( NOT ${_PAR_TARGET}_cuda_srcs )
+ add_library( ${_PAR_TARGET} ${_PAR_TYPE} ${_PAR_SOURCES} ${_all_objects} )
+ else()
+ cuda_add_library( ${_PAR_TARGET} ${_PAR_TYPE} ${_PAR_SOURCES} ${_all_objects} )
+ endif()
# ecbuild_echo_target( ${_PAR_TARGET} )
# set OUTPUT_NAME
@@ -363,17 +383,6 @@ function( ecbuild_add_library_impl )
endif()
endif()
- # filter sources
-
- if( _PAR_SOURCES )
- ecbuild_separate_sources( TARGET ${_PAR_TARGET} SOURCES ${_PAR_SOURCES} )
- endif()
-
- # ecbuild_debug_var( ${_PAR_TARGET}_h_srcs )
- # ecbuild_debug_var( ${_PAR_TARGET}_c_srcs )
- # ecbuild_debug_var( ${_PAR_TARGET}_cxx_srcs )
- # ecbuild_debug_var( ${_PAR_TARGET}_fortran_srcs )
-
# Override compilation flags on a per source file basis
ecbuild_target_flags( ${_PAR_TARGET} "${_PAR_CFLAGS}" "${_PAR_CXXFLAGS}" "${_PAR_FFLAGS}" )
@@ -536,7 +545,10 @@ macro( ecbuild_add_library )
ecbuild_add_library_impl( TARGET ${_p_TARGET} TYPE SHARED ${_p_UNPARSED_ARGUMENTS} )
ecbuild_add_library_impl( TARGET ${_p_TARGET}-static TYPE STATIC ${_p_UNPARSED_ARGUMENTS} DEPENDS ${_p_TARGET} )
- set_target_properties( ${_p_TARGET}-static PROPERTIES OUTPUT_NAME ${_p_TARGET} )
+ # If the library is built conditionally the target might not exist
+ if ( TARGET ${_p_TARGET}-static )
+ set_target_properties( ${_p_TARGET}-static PROPERTIES OUTPUT_NAME ${_p_TARGET} )
+ endif()
else()
diff --git a/cmake/ecbuild_add_option.cmake b/cmake/ecbuild_add_option.cmake
index fd8076e..6d5363f 100644
--- a/cmake/ecbuild_add_option.cmake
+++ b/cmake/ecbuild_add_option.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -17,7 +17,6 @@
# ecbuild_add_option( FEATURE <name>
# [ DEFAULT ON|OFF ]
# [ DESCRIPTION <description> ]
-# [ PURPOSE <purpose> ]
# [ REQUIRED_PACKAGES <package1> [<package2> ...] ]
# [ CONDITION <condition> ]
# [ ADVANCED ] [ NO_TPL ] )
@@ -34,12 +33,6 @@
# DESCRIPTION : optional
# string describing the feature (shown in summary and stored in the cache)
#
-# TYPE : optional, one of RUNTIME|OPTIONAL|RECOMMENDED|REQUIRED
-# type of dependency of the project on this package (defaults to OPTIONAL)
-#
-# PURPOSE : optional
-# string describing which functionality this package enables in the project
-#
# REQUIRED_PACKAGES : optional
# list of packages required to be found for this feature to be enabled
#
@@ -59,6 +52,22 @@
# The entire specification must be enclosed in quotes and is passed on
# verbatim. Any options of ``ecbuild_use_package`` are supported.
#
+# .. note::
+#
+# Arguments inside the package string that require quoting need to use the
+# `bracket argument syntax`_ introduced in CMake 3.0 since
+# regular quotes even when escaped are swallowed by the CMake parser.
+#
+# Alternatively, the name of a CMake variable containing the string can be
+# passed, which will be expanded by ``ecbuild_find_package``: ::
+#
+# set( ECCODES_FAIL_MSG
+# "grib_api can be used instead (select with -DENABLE_ECCODES=OFF)" )
+# ecbuild_add_option( FEATURE ECCODES
+# DESCRIPTION "Use eccodes instead of grib_api"
+# REQUIRED_PACKAGES "PROJECT eccodes REQUIRED FAILURE_MSG ECCODES_FAIL_MSG"
+# DEFAULT ON )
+#
# CONDITION : optional
# conditional expression which must evaluate to true for this option to be
# enabled (must be valid in a CMake ``if`` statement)
@@ -83,6 +92,8 @@
# With an already populated cache, use ``-DENABLE_<FEATURE>=REQUIRE`` to make
# the feature a required feature (this cannot be done via the CMake GUI).
#
+# .. _bracket argument syntax: https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#bracket-argument
+#
##############################################################################
macro( ecbuild_add_option )
@@ -114,8 +125,11 @@ macro( ecbuild_add_option )
endif()
ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): defaults to ${_p_DEFAULT}")
- if( NOT _p_TYPE )
- set( _p_TYPE OPTIONAL )
+ if( _p_PURPOSE )
+ ecbuild_deprecate( "ecbuild_add_option: argument PURPOSE is ignored and will be removed in a future release." )
+ endif()
+ if( _p_TYPE )
+ ecbuild_deprecate( "ecbuild_add_option: argument TYPE is ignored and will be removed in a future release." )
endif()
# check CONDITION parameter
@@ -154,13 +168,14 @@ macro( ecbuild_add_option )
# define the option -- for cmake GUI
option( ENABLE_${_p_FEATURE} "${_p_DESCRIPTION}" ${_p_DEFAULT} )
- ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): defining option ENABLE_${_p_FEATURE} '${_p_DESCRIPTION}' ${_p_DEFAULT}")
- ecbuild_set_feature( ${_p_FEATURE} ENABLED ${_p_DEFAULT} )
- set_package_properties( ${_p_FEATURE} PROPERTIES
- DESCRIPTION "${_p_DESCRIPTION}"
- TYPE ${_p_TYPE}
- PURPOSE "${_p_PURPOSE}" )
+ get_property( _feature_desc GLOBAL PROPERTY _CMAKE_${_p_FEATURE}_DESCRIPTION )
+ if( _feature_desc )
+ add_feature_info( ${_p_FEATURE} ENABLE_${_p_FEATURE} "${_feature_desc}, ${PROJECT_NAME}: ${_p_DESCRIPTION}" )
+ else()
+ add_feature_info( ${_p_FEATURE} ENABLE_${_p_FEATURE} "${PROJECT_NAME}: ${_p_DESCRIPTION}" )
+ endif()
+ ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): defining option ENABLE_${_p_FEATURE} '${_p_DESCRIPTION}' ${_p_DEFAULT}")
ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): ENABLE_${_p_FEATURE}=${ENABLE_${_p_FEATURE}}")
if( ENABLE_${_p_FEATURE} )
@@ -183,6 +198,12 @@ macro( ecbuild_add_option )
if( pkgname STREQUAL "PROJECT" ) # if 1st entry is PROJECT, then we are looking for a ecbuild project
set( pkgproject 1 )
list( GET pkglist 1 pkgname )
+ # Use feature description as package description if there is none
+ list( FIND pkglist DESCRIPTION __description )
+ if( __description LESS 0 )
+ ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): no description for ${pkgname}, using feature description '${_p_DESCRIPTION}'")
+ list( APPEND pkglist DESCRIPTION "${_p_DESCRIPTION}" )
+ endif()
else() # else 1st entry is package name
set( pkgproject 0 )
endif()
@@ -209,7 +230,14 @@ macro( ecbuild_add_option )
else()
- if( pkgname STREQUAL "MPI" )
+ if( pkgname STREQUAL "LAPACK" )
+ ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): searching for LAPACK - ecbuild_find_package( NAME ${pkglist} )")
+ ecbuild_find_package( NAME ${pkglist} )
+ if( HAVE_LAPACK AND TARGET lapack )
+ ecbuild_debug( "LAPACK found as CMake target lapack" )
+ set( LAPACK_LIBRARIES lapack )
+ endif()
+ elseif( pkgname STREQUAL "MPI" )
set( _find_args ${pkglist} )
list( REMOVE_ITEM _find_args "MPI" )
ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): searching for MPI - ecbuild_find_mpi( ${_find_args} )")
@@ -270,15 +298,18 @@ macro( ecbuild_add_option )
set( HAVE_${_p_FEATURE} 0 )
endif( _${_p_FEATURE}_condition )
- ecbuild_set_feature( ${_p_FEATURE} ENABLED ${HAVE_${_p_FEATURE}} )
# FINAL CHECK
if( HAVE_${_p_FEATURE} )
+ ecbuild_enable_feature( ${_p_FEATURE} )
+
ecbuild_info( "Feature ${_p_FEATURE} enabled" )
else() # if user provided input and we cannot satisfy FAIL otherwise WARN
+ ecbuild_disable_feature( ${_p_FEATURE} )
+
if( ${_p_FEATURE}_user_provided_input )
if( NOT _${_p_FEATURE}_condition )
string(REPLACE ";" " " _condition_msg "${_p_CONDITION}")
@@ -294,7 +325,7 @@ macro( ecbuild_add_option )
ecbuild_info( "Feature ${_p_FEATURE} was not enabled (also not requested) -- following required packages weren't found: ${_failed_to_find_packages}" )
endif()
set( ENABLE_${_p_FEATURE} OFF )
- ecbuild_set_feature( ${_p_FEATURE} ENABLED OFF )
+ ecbuild_disable_feature( ${_p_FEATURE} )
endif()
endif()
@@ -303,7 +334,7 @@ macro( ecbuild_add_option )
ecbuild_debug("ecbuild_add_option(${_p_FEATURE}): feature disabled")
set( HAVE_${_p_FEATURE} 0 )
- ecbuild_set_feature( ${_p_FEATURE} ENABLED OFF )
+ ecbuild_disable_feature( ${_p_FEATURE} )
endif()
diff --git a/cmake/ecbuild_add_persistent.cmake b/cmake/ecbuild_add_persistent.cmake
index 42bb44b..e5a875b 100644
--- a/cmake/ecbuild_add_persistent.cmake
+++ b/cmake/ecbuild_add_persistent.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_add_resources.cmake b/cmake/ecbuild_add_resources.cmake
index cf0543b..2dfaa5e 100644
--- a/cmake/ecbuild_add_resources.cmake
+++ b/cmake/ecbuild_add_resources.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_add_test.cmake b/cmake/ecbuild_add_test.cmake
index 1dcf2c6..1da8568 100644
--- a/cmake/ecbuild_add_test.cmake
+++ b/cmake/ecbuild_add_test.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_append_to_rpath.cmake b/cmake/ecbuild_append_to_rpath.cmake
index 9ecde3e..895f837 100644
--- a/cmake/ecbuild_append_to_rpath.cmake
+++ b/cmake/ecbuild_append_to_rpath.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_bundle.cmake b/cmake/ecbuild_bundle.cmake
index aee900c..6a49354 100644
--- a/cmake/ecbuild_bundle.cmake
+++ b/cmake/ecbuild_bundle.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -165,13 +165,30 @@ endmacro()
#
# ecbuild_bundle_finalize()
#
+# Options
+# -------
+#
+# See documentation for ecbuild_install_project() since all arguments are
+# forwarded to an internal call to that macro.
+#
+# If no arguments are passed, then the default installation NAME is set to
+# the default project name ${CMAKE_PROJECT_NAME}
+#
##############################################################################
macro( ecbuild_bundle_finalize )
add_custom_target( update DEPENDS ${git_update_targets} )
- ecbuild_install_project( NAME ${CMAKE_PROJECT_NAME} )
+ ecbuild_info("---------------------------------------------------------")
+ ecbuild_info("Bundle ${CMAKE_PROJECT_NAME}")
+ ecbuild_info("---------------------------------------------------------")
+
+ if("${ARGV1}")
+ ecbuild_install_project( ${ARGV} )
+ else()
+ ecbuild_install_project( NAME ${CMAKE_PROJECT_NAME} )
+ endif()
ecbuild_print_summary()
diff --git a/cmake/ecbuild_cache.cmake b/cmake/ecbuild_cache.cmake
index e257b36..d45b31a 100644
--- a/cmake/ecbuild_cache.cmake
+++ b/cmake/ecbuild_cache.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_check_c_source_return.cmake b/cmake/ecbuild_check_c_source_return.cmake
index 18b6117..38d89f7 100644
--- a/cmake/ecbuild_check_c_source_return.cmake
+++ b/cmake/ecbuild_check_c_source_return.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_check_compiler.cmake b/cmake/ecbuild_check_compiler.cmake
index 437b81e..197f0b5 100644
--- a/cmake/ecbuild_check_compiler.cmake
+++ b/cmake/ecbuild_check_compiler.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_check_cxx11.cmake b/cmake/ecbuild_check_cxx11.cmake
index 9552389..d2f9629 100644
--- a/cmake/ecbuild_check_cxx11.cmake
+++ b/cmake/ecbuild_check_cxx11.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_check_cxx_source_return.cmake b/cmake/ecbuild_check_cxx_source_return.cmake
index 0868b22..7270540 100644
--- a/cmake/ecbuild_check_cxx_source_return.cmake
+++ b/cmake/ecbuild_check_cxx_source_return.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_check_fortran.cmake b/cmake/ecbuild_check_fortran.cmake
index 5612134..d7a63cf 100644
--- a/cmake/ecbuild_check_fortran.cmake
+++ b/cmake/ecbuild_check_fortran.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_check_fortran_source_return.cmake b/cmake/ecbuild_check_fortran_source_return.cmake
index 175f4ef..92168b9 100644
--- a/cmake/ecbuild_check_fortran_source_return.cmake
+++ b/cmake/ecbuild_check_fortran_source_return.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_check_functions.cmake b/cmake/ecbuild_check_functions.cmake
index 73f5cb5..4307429 100644
--- a/cmake/ecbuild_check_functions.cmake
+++ b/cmake/ecbuild_check_functions.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_check_os.cmake b/cmake/ecbuild_check_os.cmake
index 8d325dc..be92c87 100644
--- a/cmake/ecbuild_check_os.cmake
+++ b/cmake/ecbuild_check_os.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -42,35 +42,32 @@ endif()
if( ENABLE_OS_TYPES_TEST )
- set( EC_SIZEOF_PTR ${CMAKE_SIZEOF_VOID_P} )
- ecbuild_cache_var( EC_SIZEOF_PTR )
- ecbuild_cache_check_type_size( char EC_SIZEOF_CHAR )
- ecbuild_cache_check_type_size( short EC_SIZEOF_SHORT )
- ecbuild_cache_check_type_size( int EC_SIZEOF_INT )
- ecbuild_cache_check_type_size( long EC_SIZEOF_LONG )
- ecbuild_cache_check_type_size( "long long" EC_SIZEOF_LONG_LONG )
- ecbuild_cache_check_type_size( float EC_SIZEOF_FLOAT )
- ecbuild_cache_check_type_size( double EC_SIZEOF_DOUBLE )
- ecbuild_cache_check_type_size( "long double" EC_SIZEOF_LONG_DOUBLE )
- ecbuild_cache_check_type_size( size_t EC_SIZEOF_SIZE_T )
- ecbuild_cache_check_type_size( ssize_t EC_SIZEOF_SSIZE_T )
- ecbuild_cache_check_type_size( off_t EC_SIZEOF_OFF_T )
-
-# ecbuild_info( "sizeof void* [${EC_SIZEOF_PTR}]" )
-# ecbuild_info( "sizeof off_t [${EC_SIZEOF_OFF_T}]" )
-# ecbuild_info( "sizeof int [${EC_SIZEOF_INT}]" )
-# ecbuild_info( "sizeof short [${EC_SIZEOF_SHORT}]" )
-# ecbuild_info( "sizeof long [${EC_SIZEOF_LONG}]" )
-# ecbuild_info( "sizeof size_t [${EC_SIZEOF_SIZE_T}]" )
-# ecbuild_info( "sizeof float [${EC_SIZEOF_FLOAT}]" )
-# ecbuild_info( "sizeof double [${EC_SIZEOF_DOUBLE}]" )
-# ecbuild_info( "sizeof long long [${EC_SIZEOF_LONG_LONG}]" )
-# ecbuild_info( "sizeof long double [${EC_SIZEOF_LONG_DOUBLE}]" )
-
-# ecbuild_info( "system sizeof :" )
-# ecbuild_info( " void* [${EC_SIZEOF_PTR}] size_t [${EC_SIZEOF_SIZE_T}] off_t [${EC_SIZEOF_OFF_T}] short [${EC_SIZEOF_SHORT}]" )
-# ecbuild_info( " int [${EC_SIZEOF_INT}] long [${EC_SIZEOF_LONG}] long long [${EC_SIZEOF_LONG_LONG}]" )
-# ecbuild_info( " float [${EC_SIZEOF_FLOAT}] double [${EC_SIZEOF_DOUBLE}] long double [${EC_SIZEOF_LONG_DOUBLE}]" )
+ set( EC_SIZEOF_PTR ${CMAKE_SIZEOF_VOID_P} )
+ ecbuild_cache_var( EC_SIZEOF_PTR )
+ ecbuild_cache_check_type_size( char EC_SIZEOF_CHAR )
+ ecbuild_cache_check_type_size( short EC_SIZEOF_SHORT )
+ ecbuild_cache_check_type_size( int EC_SIZEOF_INT )
+ ecbuild_cache_check_type_size( long EC_SIZEOF_LONG )
+ ecbuild_cache_check_type_size( "long long" EC_SIZEOF_LONG_LONG )
+ ecbuild_cache_check_type_size( float EC_SIZEOF_FLOAT )
+ ecbuild_cache_check_type_size( double EC_SIZEOF_DOUBLE )
+ ecbuild_cache_check_type_size( "long double" EC_SIZEOF_LONG_DOUBLE )
+ ecbuild_cache_check_type_size( size_t EC_SIZEOF_SIZE_T )
+ ecbuild_cache_check_type_size( ssize_t EC_SIZEOF_SSIZE_T )
+ ecbuild_cache_check_type_size( off_t EC_SIZEOF_OFF_T )
+
+ ecbuild_debug( "sizeof void* [${EC_SIZEOF_PTR}]" )
+ ecbuild_debug( "sizeof char [${EC_SIZEOF_CHAR}]" )
+ ecbuild_debug( "sizeof short [${EC_SIZEOF_SHORT}]" )
+ ecbuild_debug( "sizeof int [${EC_SIZEOF_INT}]" )
+ ecbuild_debug( "sizeof long [${EC_SIZEOF_LONG}]" )
+ ecbuild_debug( "sizeof long long [${EC_SIZEOF_LONG_LONG}]" )
+ ecbuild_debug( "sizeof float [${EC_SIZEOF_FLOAT}]" )
+ ecbuild_debug( "sizeof double [${EC_SIZEOF_DOUBLE}]" )
+ ecbuild_debug( "sizeof long double [${EC_SIZEOF_LONG_DOUBLE}]" )
+ ecbuild_debug( "sizeof size_t [${EC_SIZEOF_SIZE_T}]" )
+ ecbuild_debug( "sizeof ssize_t [${EC_SIZEOF_SSIZE_T}]" )
+ ecbuild_debug( "sizeof off_t [${EC_SIZEOF_OFF_T}]" )
endif()
@@ -84,25 +81,25 @@ if( ENABLE_LARGE_FILE_SUPPORT )
ecbuild_cache_check_type_size( off_t EC_SIZEOF_OFF_T )
- if( EC_SIZEOF_OFF_T LESS "8" )
+ if( EC_SIZEOF_OFF_T LESS "8" )
- if( ${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" )
- add_definitions( -D_FILE_OFFSET_BITS=64 )
- endif()
+ if( ${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" )
+ add_definitions( -D_FILE_OFFSET_BITS=64 )
+ endif()
- if( ${CMAKE_SYSTEM_NAME} MATCHES "AIX" )
- add_definitions( -D_LARGE_FILES=64 )
- endif()
+ if( ${CMAKE_SYSTEM_NAME} MATCHES "AIX" )
+ add_definitions( -D_LARGE_FILES=64 )
+ endif()
- get_directory_property( __compile_defs COMPILE_DEFINITIONS )
+ get_directory_property( __compile_defs COMPILE_DEFINITIONS )
- if( __compile_defs )
- foreach( def ${__compile_defs} )
- list( APPEND CMAKE_REQUIRED_DEFINITIONS -D${def} )
- endforeach()
- endif()
+ if( __compile_defs )
+ foreach( def ${__compile_defs} )
+ list( APPEND CMAKE_REQUIRED_DEFINITIONS -D${def} )
+ endforeach()
+ endif()
- endif()
+ endif()
endif()
@@ -113,15 +110,15 @@ if( ENABLE_OS_ENDINESS_TEST )
if( NOT DEFINED EC_BIG_ENDIAN AND NOT DEFINED EC_LITTLE_ENDIAN )
- test_big_endian( _BIG_ENDIAN )
+ test_big_endian( _BIG_ENDIAN )
- if( _BIG_ENDIAN )
+ if( _BIG_ENDIAN )
set( EC_BIG_ENDIAN 1 )
set( EC_LITTLE_ENDIAN 0 )
- else()
+ else()
set( EC_BIG_ENDIAN 0 )
set( EC_LITTLE_ENDIAN 1 )
- endif()
+ endif()
endif()
@@ -129,35 +126,35 @@ if( ENABLE_OS_ENDINESS_TEST )
ecbuild_cache_var( EC_LITTLE_ENDIAN )
if( NOT DEFINED IEEE_BE )
- check_c_source_runs(
- "int compare(unsigned char* a,unsigned char* b) {
- while(*a != 0) if (*(b++)!=*(a++)) return 1;
- return 0;
- }
- int main(int argc,char** argv) {
- unsigned char dc[]={0x30,0x61,0xDE,0x80,0x93,0x67,0xCC,0xD9,0};
- double da=1.23456789e-75;
- unsigned char* ca;
+ check_c_source_runs(
+ "int compare(unsigned char* a,unsigned char* b) {
+ while(*a != 0) if (*(b++)!=*(a++)) return 1;
+ return 0;
+ }
+ int main(int argc,char** argv) {
+ unsigned char dc[]={0x30,0x61,0xDE,0x80,0x93,0x67,0xCC,0xD9,0};
+ double da=1.23456789e-75;
+ unsigned char* ca;
- unsigned char fc[]={0x05,0x83,0x48,0x22,0};
- float fa=1.23456789e-35;
+ unsigned char fc[]={0x05,0x83,0x48,0x22,0};
+ float fa=1.23456789e-35;
- if (sizeof(double)!=8) return 1;
+ if (sizeof(double)!=8) return 1;
- ca=(unsigned char*)&da;
- if (compare(dc,ca)) return 1;
+ ca=(unsigned char*)&da;
+ if (compare(dc,ca)) return 1;
- if (sizeof(float)!=4) return 1;
+ if (sizeof(float)!=4) return 1;
- ca=(unsigned char*)&fa;
- if (compare(fc,ca)) return 1;
+ ca=(unsigned char*)&fa;
+ if (compare(fc,ca)) return 1;
- return 0;
- }" IEEE_BE )
+ return 0;
+ }" IEEE_BE )
- if( "${IEEE_BE}" STREQUAL "" )
- set( IEEE_BE 0 CACHE INTERNAL "Test IEEE_BE")
- endif()
+ if( "${IEEE_BE}" STREQUAL "" )
+ set( IEEE_BE 0 CACHE INTERNAL "Test IEEE_BE")
+ endif()
endif()
@@ -167,36 +164,36 @@ if( ENABLE_OS_ENDINESS_TEST )
ecbuild_critical("Failed to sanity check on endiness: OS should be Big-Endian but compiled code runs differently -- to ignore this pass -DIEEE_BE=0 to CMake/ecBuild")
endif()
- if( NOT DEFINED IEEE_LE )
- check_c_source_runs(
- "int compare(unsigned char* a,unsigned char* b) {
- while(*a != 0) if (*(b++)!=*(a++)) return 1;
- return 0;
- }
- int main(int argc,char** argv) {
- unsigned char dc[]={0xD9,0xCC,0x67,0x93,0x80,0xDE,0x61,0x30,0};
- double da=1.23456789e-75;
- unsigned char* ca;
+ if( NOT DEFINED IEEE_LE )
+ check_c_source_runs(
+ "int compare(unsigned char* a,unsigned char* b) {
+ while(*a != 0) if (*(b++)!=*(a++)) return 1;
+ return 0;
+ }
+ int main(int argc,char** argv) {
+ unsigned char dc[]={0xD9,0xCC,0x67,0x93,0x80,0xDE,0x61,0x30,0};
+ double da=1.23456789e-75;
+ unsigned char* ca;
- unsigned char fc[]={0x22,0x48,0x83,0x05,0};
- float fa=1.23456789e-35;
+ unsigned char fc[]={0x22,0x48,0x83,0x05,0};
+ float fa=1.23456789e-35;
- if (sizeof(double)!=8) return 1;
+ if (sizeof(double)!=8) return 1;
- ca=(unsigned char*)&da;
- if (compare(dc,ca)) return 1;
+ ca=(unsigned char*)&da;
+ if (compare(dc,ca)) return 1;
- if (sizeof(float)!=4) return 1;
+ if (sizeof(float)!=4) return 1;
- ca=(unsigned char*)&fa;
- if (compare(fc,ca)) return 1;
+ ca=(unsigned char*)&fa;
+ if (compare(fc,ca)) return 1;
- return 0;
- }" IEEE_LE )
+ return 0;
+ }" IEEE_LE )
- if( "${IEEE_LE}" STREQUAL "" )
- set( IEEE_LE 0 CACHE INTERNAL "Test IEEE_LE")
- endif()
+ if( "${IEEE_LE}" STREQUAL "" )
+ set( IEEE_LE 0 CACHE INTERNAL "Test IEEE_LE")
+ endif()
endif()
ecbuild_cache_var( IEEE_LE )
@@ -281,102 +278,102 @@ if( UNIX )
endif()
- ### Solaris ###
+ ### Solaris ###
- if( ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" )
- set( EC_OS_NAME "solaris" )
- endif()
+ if( ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" )
+ set( EC_OS_NAME "solaris" )
+ endif()
- ### AIX ###
+ ### AIX ###
- if( ${CMAKE_SYSTEM_NAME} MATCHES "AIX" )
+ if( ${CMAKE_SYSTEM_NAME} MATCHES "AIX" )
- set( EC_OS_NAME "aix" )
+ set( EC_OS_NAME "aix" )
- set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -bbigtoc" )
+ set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -bbigtoc" )
- if( CMAKE_C_COMPILER_ID MATCHES "GNU" )
- set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker" )
- endif()
+ if( CMAKE_C_COMPILER_ID MATCHES "GNU" )
+ set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker" )
+ endif()
- if( CMAKE_COMPILER_IS_GNUCC )
- if( EC_OS_BITS EQUAL "64" )
- ecbuild_add_c_flags("-maix64")
- endif()
- if( EC_OS_BITS EQUAL "32" )
- ecbuild_add_c_flags("-maix32")
- endif()
- endif()
+ if( CMAKE_COMPILER_IS_GNUCC )
+ if( EC_OS_BITS EQUAL "64" )
+ ecbuild_add_c_flags("-maix64")
+ endif()
+ if( EC_OS_BITS EQUAL "32" )
+ ecbuild_add_c_flags("-maix32")
+ endif()
+ endif()
- if( CMAKE_COMPILER_IS_GNUCXX )
- if( EC_OS_BITS EQUAL "64" )
- ecbuild_add_cxx_flags("-maix64")
- endif()
- if( EC_OS_BITS EQUAL "32" )
- ecbuild_add_cxx_flags("-maix32")
- endif()
- endif()
+ if( CMAKE_COMPILER_IS_GNUCXX )
+ if( EC_OS_BITS EQUAL "64" )
+ ecbuild_add_cxx_flags("-maix64")
+ endif()
+ if( EC_OS_BITS EQUAL "32" )
+ ecbuild_add_cxx_flags("-maix32")
+ endif()
+ endif()
- if( CMAKE_C_COMPILER_ID MATCHES "XL" )
+ if( CMAKE_C_COMPILER_ID MATCHES "XL" )
- ecbuild_add_c_flags("-qpic=large")
+ ecbuild_add_c_flags("-qpic=large")
# ecbuild_add_c_flags("-qweaksymbol")
- if(EC_OS_BITS EQUAL "32" )
- ecbuild_add_c_flags("-q32")
- endif()
+ if(EC_OS_BITS EQUAL "32" )
+ ecbuild_add_c_flags("-q32")
+ endif()
- if(${CMAKE_BUILD_TYPE} MATCHES "Release" OR ${CMAKE_BUILD_TYPE} MATCHES "Production" )
- ecbuild_add_c_flags("-qstrict")
- ecbuild_add_c_flags("-qinline")
- endif()
+ if(${CMAKE_BUILD_TYPE} MATCHES "Release" OR ${CMAKE_BUILD_TYPE} MATCHES "Production" )
+ ecbuild_add_c_flags("-qstrict")
+ ecbuild_add_c_flags("-qinline")
+ endif()
- if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
- ecbuild_add_c_flags("-qfullpath")
- ecbuild_add_c_flags("-qkeepparm")
- endif()
+ if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
+ ecbuild_add_c_flags("-qfullpath")
+ ecbuild_add_c_flags("-qkeepparm")
+ endif()
- endif()
+ endif()
- if( CMAKE_CXX_COMPILER_ID MATCHES "XL" )
+ if( CMAKE_CXX_COMPILER_ID MATCHES "XL" )
- ecbuild_add_cxx_flags("-qpic=large")
- ecbuild_add_cxx_flags("-bmaxdata:0x40000000")
- ecbuild_add_cxx_flags("-qrtti")
- ecbuild_add_cxx_flags("-qfuncsect")
+ ecbuild_add_cxx_flags("-qpic=large")
+ ecbuild_add_cxx_flags("-bmaxdata:0x40000000")
+ ecbuild_add_cxx_flags("-qrtti")
+ ecbuild_add_cxx_flags("-qfuncsect")
# ecbuild_add_cxx_flags("-qweaksymbol")
- if(EC_OS_BITS EQUAL "32" )
- ecbuild_add_cxx_flags("-q32")
- endif()
+ if(EC_OS_BITS EQUAL "32" )
+ ecbuild_add_cxx_flags("-q32")
+ endif()
- if(${CMAKE_BUILD_TYPE} MATCHES "Release" OR ${CMAKE_BUILD_TYPE} MATCHES "Production" )
- ecbuild_add_cxx_flags("-qstrict")
- ecbuild_add_cxx_flags("-qinline")
- endif()
+ if(${CMAKE_BUILD_TYPE} MATCHES "Release" OR ${CMAKE_BUILD_TYPE} MATCHES "Production" )
+ ecbuild_add_cxx_flags("-qstrict")
+ ecbuild_add_cxx_flags("-qinline")
+ endif()
- if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
- ecbuild_add_cxx_flags("-qfullpath")
- ecbuild_add_cxx_flags("-qkeepparm")
- endif()
+ if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
+ ecbuild_add_cxx_flags("-qfullpath")
+ ecbuild_add_cxx_flags("-qkeepparm")
+ endif()
- endif()
+ endif()
- if( CMAKE_Fortran_COMPILER_ID MATCHES "XL" )
+ if( CMAKE_Fortran_COMPILER_ID MATCHES "XL" )
- ecbuild_add_fortran_flags("-qxflag=dealloc_cfptr")
- ecbuild_add_fortran_flags("-qextname")
- ecbuild_add_fortran_flags("-qdpc=e")
- ecbuild_add_fortran_flags("-bmaxdata:0x40000000")
- ecbuild_add_fortran_flags("-bloadmap:loadmap -bmap:loadmap")
+ ecbuild_add_fortran_flags("-qxflag=dealloc_cfptr")
+ ecbuild_add_fortran_flags("-qextname")
+ ecbuild_add_fortran_flags("-qdpc=e")
+ ecbuild_add_fortran_flags("-bmaxdata:0x40000000")
+ ecbuild_add_fortran_flags("-bloadmap:loadmap -bmap:loadmap")
- if(EC_OS_BITS EQUAL "32" )
- ecbuild_add_fortran_flags("-q32")
- endif()
- endif()
+ if(EC_OS_BITS EQUAL "32" )
+ ecbuild_add_fortran_flags("-q32")
+ endif()
+ endif()
- endif()
+ endif()
endif()
@@ -384,8 +381,8 @@ endif()
if( ${CMAKE_SYSTEM_NAME} MATCHES "CYGWIN" )
- set( EC_OS_NAME "cygwin" )
- ecbuild_warn( "Building on Cygwin should work but is untested" )
+ set( EC_OS_NAME "cygwin" )
+ ecbuild_warn( "Building on Cygwin should work but is untested" )
endif()
@@ -393,12 +390,12 @@ endif()
if( ${EC_OS_NAME} MATCHES "UNKNOWN" )
- if( DISABLE_OS_CHECK )
- ecbuild_warn( "ecBuild is untested for this operating system: [${CMAKE_SYSTEM_NAME}]"
+ if( DISABLE_OS_CHECK )
+ ecbuild_warn( "ecBuild is untested for this operating system: [${CMAKE_SYSTEM_NAME}]"
" -- DISABLE_OS_CHECK is ON so proceeding at your own risk ..." )
- else()
- ecbuild_critical( "ecBuild is untested for this operating system: [${CMAKE_SYSTEM_NAME}]"
+ else()
+ ecbuild_critical( "ecBuild is untested for this operating system: [${CMAKE_SYSTEM_NAME}]"
" -- refusing to continue. Disable this check with -DDISABLE_OS_CHECK=ON" )
- endif()
+ endif()
endif()
diff --git a/cmake/ecbuild_compiler_flags.cmake b/cmake/ecbuild_compiler_flags.cmake
index 0e3fe1e..a6c2944 100644
--- a/cmake/ecbuild_compiler_flags.cmake
+++ b/cmake/ecbuild_compiler_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -200,6 +200,12 @@ foreach( _lang C CXX Fortran )
endforeach()
# Apply user or toolchain specified linker flag overrides per object type (NOT written to cache)
+foreach( _obj EXE SHARED MODULE )
+ if( ECBUILD_${_obj}_LINKER_FLAGS )
+ set( CMAKE_${_obj}_LINKER_FLAGS ${ECBUILD_${_obj}_LINKER_FLAGS} )
+ endif()
+endforeach()
+
foreach( _btype NONE DEBUG BIT PRODUCTION RELEASE RELWITHDEBINFO )
foreach( _obj EXE SHARED MODULE )
diff --git a/cmake/ecbuild_config.h.in b/cmake/ecbuild_config.h.in
index df9eb91..2eed359 100644
--- a/cmake/ecbuild_config.h.in
+++ b/cmake/ecbuild_config.h.in
@@ -1,5 +1,5 @@
/*
- * (C) Copyright 1996-2016 ECMWF.
+ * (C) Copyright 1996-2017 ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_declare_project.cmake b/cmake/ecbuild_declare_project.cmake
index c95e8e3..e2f9cc8 100644
--- a/cmake/ecbuild_declare_project.cmake
+++ b/cmake/ecbuild_declare_project.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_define_build_types.cmake b/cmake/ecbuild_define_build_types.cmake
index cf92d23..7cfc591 100644
--- a/cmake/ecbuild_define_build_types.cmake
+++ b/cmake/ecbuild_define_build_types.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_define_libs_and_execs_target.cmake b/cmake/ecbuild_define_libs_and_execs_target.cmake
index 812f42c..799eb7d 100644
--- a/cmake/ecbuild_define_libs_and_execs_target.cmake
+++ b/cmake/ecbuild_define_libs_and_execs_target.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_define_links_target.cmake b/cmake/ecbuild_define_links_target.cmake
index b5f53fe..745288c 100644
--- a/cmake/ecbuild_define_links_target.cmake
+++ b/cmake/ecbuild_define_links_target.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_define_options.cmake b/cmake/ecbuild_define_options.cmake
index af40ae1..fc6376e 100644
--- a/cmake/ecbuild_define_options.cmake
+++ b/cmake/ecbuild_define_options.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_define_paths.cmake b/cmake/ecbuild_define_paths.cmake
index 6584b26..c5e4830 100644
--- a/cmake/ecbuild_define_paths.cmake
+++ b/cmake/ecbuild_define_paths.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_dont_pack.cmake b/cmake/ecbuild_dont_pack.cmake
index bc62182..9f9f4a4 100644
--- a/cmake/ecbuild_dont_pack.cmake
+++ b/cmake/ecbuild_dont_pack.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_download_resource.cmake b/cmake/ecbuild_download_resource.cmake
index 5d394f5..e1e8eff 100644
--- a/cmake/ecbuild_download_resource.cmake
+++ b/cmake/ecbuild_download_resource.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -18,25 +18,53 @@
#
# curl or wget is required (curl is preferred if available).
#
+# The default timeout is 30 seconds, which can be overridden with
+# ``ECBUILD_DOWNLOAD_TIMEOUT``. Downloads are by default only tried once, use
+# ``ECBUILD_DOWNLOAD_RETRIES`` to set the number of retries.
+#
##############################################################################
function( ecbuild_download_resource _p_OUT _p_URL )
+ # Do not retry downloads by default (ECBUILD-307)
+ if( NOT DEFINED ECBUILD_DOWNLOAD_RETRIES )
+ set( ECBUILD_DOWNLOAD_RETRIES 0 )
+ endif()
+ # Use default timeout of 30s if not specified (ECBUILD-307)
+ if( NOT DEFINED ECBUILD_DOWNLOAD_TIMEOUT )
+ set( ECBUILD_DOWNLOAD_TIMEOUT 30 )
+ endif()
+
if( NOT EXISTS ${_p_OUT} )
find_program( CURL_PROGRAM curl )
mark_as_advanced(CURL_PROGRAM)
if( CURL_PROGRAM )
- execute_process( COMMAND ${CURL_PROGRAM} --silent --show-error --fail --output ${_p_OUT} ${_p_URL}
+
+ execute_process( COMMAND ${CURL_PROGRAM} --silent --show-error --fail
+ --retry ${ECBUILD_DOWNLOAD_RETRIES}
+ --connect-timeout ${ECBUILD_DOWNLOAD_TIMEOUT}
+ --output ${_p_OUT} ${_p_URL}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} RESULT_VARIABLE CMD_RESULT )
+
else()
+
find_program( WGET_PROGRAM wget )
+
if( WGET_PROGRAM )
- execute_process( COMMAND ${WGET_PROGRAM} -nv -O ${_p_OUT} ${_p_URL}
+
+ # wget takes the total number of tries, curl the number or retries
+ math( EXPR ECBUILD_DOWNLOAD_RETRIES ${ECBUILD_DOWNLOAD_RETRIES} + 1 )
+
+ execute_process( COMMAND ${WGET_PROGRAM} -nv -O ${_p_OUT}
+ -t ${ECBUILD_DOWNLOAD_RETRIES}
+ -T ${ECBUILD_DOWNLOAD_TIMEOUT} ${_p_URL}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} RESULT_VARIABLE CMD_RESULT )
+
else()
ecbuild_critical("Could not find curl or wget. Error downloading ${_p_URL}")
endif()
+
endif()
if(CMD_RESULT)
diff --git a/cmake/ecbuild_echo_targets.cmake b/cmake/ecbuild_echo_targets.cmake
index 1406a1f..61250ee 100644
--- a/cmake/ecbuild_echo_targets.cmake
+++ b/cmake/ecbuild_echo_targets.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_enable_fortran.cmake b/cmake/ecbuild_enable_fortran.cmake
index c1c5503..9d86aa7 100644
--- a/cmake/ecbuild_enable_fortran.cmake
+++ b/cmake/ecbuild_enable_fortran.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -58,11 +58,19 @@ macro( ecbuild_enable_fortran )
endif()
if( CMAKE_Fortran_COMPILER_LOADED )
+
include(CheckFortranFunctionExists)
if( CMAKE_C_COMPILER_LOADED AND ENABLE_FORTRAN_C_INTERFACE )
include(FortranCInterface)
endif()
set( EC_HAVE_FORTRAN 1 )
+
+ # see issue ECBUILD-298
+ if( CMAKE_Fortran_COMPILER_ID MATCHES PGI )
+ unset( CMAKE_Fortran_COMPILE_OPTIONS_PIE )
+ unset( CMAKE_SHARED_LIBRARY_LINK_Fortran_FLAGS )
+ endif()
+
endif()
if( DEFINED _PAR_MODULE_DIRECTORY )
diff --git a/cmake/ecbuild_features.cmake b/cmake/ecbuild_features.cmake
index 6d20038..9406fd8 100644
--- a/cmake/ecbuild_features.cmake
+++ b/cmake/ecbuild_features.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -55,44 +55,3 @@ function( ecbuild_disable_feature _name )
set_property(GLOBAL PROPERTY DISABLED_FEATURES "${_disabled_features}" )
endfunction()
-
-# en/disable feature ${_name} and set its description and purpose
-function( ecbuild_set_feature _name )
-
- set(options ) # none
- set(oneValueArgs ENABLED )
- set(multiValueArgs ) # none
-
- cmake_parse_arguments( _PAR "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
-
- get_property( _feature_desc GLOBAL PROPERTY _CMAKE_${_name}_DESCRIPTION )
- get_property( _enabled_features GLOBAL PROPERTY ENABLED_FEATURES )
- get_property( _disabled_features GLOBAL PROPERTY DISABLED_FEATURES )
-
- if( DEFINED _PAR_ENABLED )
- if( _PAR_ENABLED )
- ecbuild_debug( "ecbuild_set_feature(${_name}): enabling feature" )
- ecbuild_enable_feature( ${_name} )
- else()
- ecbuild_debug( "ecbuild_set_feature(${_name}): disabling feature" )
- ecbuild_disable_feature( ${_name} )
- endif()
- endif()
-
- ecbuild_enabled_features( _enabled_features )
- list (FIND _enabled_features "${_name}" _index)
- if (${_index} GREATER -1)
- set( _feature_found 1 )
- endif()
-
- ecbuild_disabled_features( _disabled_features )
- list (FIND _disabled_features "${_name}" _index)
- if (${_index} GREATER -1)
- set( _feature_found 1 )
- endif()
-
- if( NOT _feature_found )
- ecbuild_warn( "Feature ${_name} has not yet been enabled or disabled" )
- endif()
-
-endfunction()
diff --git a/cmake/ecbuild_find_fortranlibs.cmake b/cmake/ecbuild_find_fortranlibs.cmake
index 279833f..905d020 100644
--- a/cmake/ecbuild_find_fortranlibs.cmake
+++ b/cmake/ecbuild_find_fortranlibs.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_find_lexyacc.cmake b/cmake/ecbuild_find_lexyacc.cmake
index 5c13269..3dc8b61 100644
--- a/cmake/ecbuild_find_lexyacc.cmake
+++ b/cmake/ecbuild_find_lexyacc.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_find_mpi.cmake b/cmake/ecbuild_find_mpi.cmake
index a0c6cfa..85ae5e1 100644
--- a/cmake/ecbuild_find_mpi.cmake
+++ b/cmake/ecbuild_find_mpi.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_find_omp.cmake b/cmake/ecbuild_find_omp.cmake
index 914da24..ea9da24 100644
--- a/cmake/ecbuild_find_omp.cmake
+++ b/cmake/ecbuild_find_omp.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_find_package.cmake b/cmake/ecbuild_find_package.cmake
index f7f1a9c..71be044 100644
--- a/cmake/ecbuild_find_package.cmake
+++ b/cmake/ecbuild_find_package.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -17,6 +17,11 @@
# ecbuild_find_package( NAME <name>
# [ VERSION <version> [ EXACT ] ]
# [ COMPONENTS <component1> [ <component2> ... ] ]
+# [ URL <url> ]
+# [ DESCRIPTION <description> ]
+# [ TYPE <type> ]
+# [ PURPOSE <purpose> ]
+# [ FAILURE_MSG <message> ]
# [ REQUIRED ]
# [ QUIET ] )
#
@@ -35,6 +40,23 @@
# EXACT : optional, requires VERSION
# require the exact version rather than a minimum version
#
+# URL : optional
+# homepage of the package (shown in summary and stored in the cache)
+#
+# DESCRIPTION : optional
+# literal string or name of CMake variable describing the package
+#
+# TYPE : optional, one of RUNTIME|OPTIONAL|RECOMMENDED|REQUIRED
+# type of dependency of the project on this package (defaults to OPTIONAL)
+#
+# PURPOSE : optional
+# literal string or name of CMake variable describing which functionality
+# this package enables in the project
+#
+# FAILURE_MSG : optional
+# literal string or name of CMake variable containing a message to be
+# appended to the failure message if the package is not found
+#
# REQUIRED : optional
# fail if package cannot be found
#
@@ -86,7 +108,7 @@
macro( ecbuild_find_package )
set( options REQUIRED QUIET EXACT )
- set( single_value_args NAME VERSION )
+ set( single_value_args NAME VERSION URL DESCRIPTION TYPE PURPOSE FAILURE_MSG )
set( multi_value_args COMPONENTS )
cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} )
@@ -103,6 +125,12 @@ macro( ecbuild_find_package )
ecbuild_critical("Call to ecbuild_find_package() requests EXACT but doesn't specify VERSION.")
endif()
+ # If the package is required, set TYPE to REQUIRED
+ # Due to shortcomings in CMake's argument parser, passing TYPE REQUIRED has no effect
+ if( _PAR_REQUIRED )
+ set( _PAR_TYPE REQUIRED )
+ endif()
+
# ecbuild_debug_var( _PAR_NAME )
string( TOUPPER ${_PAR_NAME} pkgUPPER )
@@ -191,10 +219,10 @@ macro( ecbuild_find_package )
if( NOT ${_PAR_NAME}_FOUND )
if( ${_PAR_NAME}_PATH )
- ecbuild_critical( "${_PAR_NAME}_PATH was provided by user but package ${_PAR_NAME} wasn't found" )
+ ecbuild_critical( "${_PAR_NAME}_PATH was provided by user but package ${_PAR_NAME} wasn't found at '${${_PAR_NAME}_PATH}'" )
endif()
if( ${pkgUPPER}_PATH )
- ecbuild_critical( "${pkgUPPER}_PATH was provided by user but package ${_PAR_NAME} wasn't found" )
+ ecbuild_critical( "${pkgUPPER}_PATH was provided by user but package ${_PAR_NAME} wasn't found at '${${pkgUPPER}_PATH}'" )
endif()
endif()
@@ -288,20 +316,8 @@ macro( ecbuild_find_package )
### final messages
- set( _failed_message
- "\n"
- " ${PROJECT_NAME} FAILED to find package ${_PAR_NAME}\n"
- "\n"
- " Provide location with \"-D${pkgUPPER}_PATH=/...\" or \"-D${_PAR_NAME}_DIR=/...\" \n"
- " You may also export environment variables ${pkgUPPER}_PATH or ${_PAR_NAME}_DIR\n"
- "\n"
- " Values (note CAPITALISATION):\n"
- " ${pkgUPPER}_PATH should contain the path to the install prefix (as in <install>/bin <install>/lib <install>/include)\n"
- " ${_PAR_NAME}_DIR should be a directory containing a <package>-config.cmake file (usually <install>/share/<package>/cmake)\n"
- "\n"
- )
-
if( ${_PAR_NAME}_FOUND OR ${pkgUPPER}_FOUND )
+
if( NOT _PAR_QUIET )
ecbuild_info( "[${_PAR_NAME}] (${${_PAR_NAME}_VERSION})" )
foreach( var in ITEMS INCLUDE_DIR INCLUDE_DIRS DEFINITIONS LIBRARY LIBRARIES )
@@ -312,14 +328,41 @@ macro( ecbuild_find_package )
endif()
endforeach()
endif()
+
+ if( DEFINED ${_PAR_DESCRIPTION} )
+ set( _PAR_DESCRIPTION ${${_PAR_DESCRIPTION}} )
+ endif()
+ if( DEFINED ${_PAR_PURPOSE} )
+ set( _PAR_PURPOSE ${${_PAR_PURPOSE}} )
+ endif()
+ set_package_properties( ${_PAR_NAME} PROPERTIES
+ URL "${_PAR_URL}"
+ DESCRIPTION "${_PAR_DESCRIPTION}"
+ TYPE "${_PAR_TYPE}"
+ PURPOSE "${_PAR_PURPOSE}" )
+
else()
+
+ if( DEFINED ${_PAR_FAILURE_MSG} )
+ set( _PAR_FAILURE_MSG ${${_PAR_FAILURE_MSG}} )
+ endif()
+ set( _failed_message
+ " ${PROJECT_NAME} FAILED to find package ${_PAR_NAME}\n"
+ " Provide location with \"-D${pkgUPPER}_PATH=/...\" or \"-D${_PAR_NAME}_DIR=/...\" \n"
+ " You may also export environment variables ${pkgUPPER}_PATH or ${_PAR_NAME}_DIR\n"
+ " Values (note CAPITALISATION):\n"
+ " ${pkgUPPER}_PATH should contain the path to the install prefix (as in <install>/bin <install>/lib <install>/include)\n"
+ " ${_PAR_NAME}_DIR should be a directory containing a <package>-config.cmake file (usually <install>/share/<package>/cmake)\n"
+ )
+
if( _PAR_REQUIRED )
- ecbuild_critical( ${_failed_message} " !! ${PROJECT_NAME} requires package ${_PAR_NAME} !!" )
+ ecbuild_critical( "${_failed_message}!! ${PROJECT_NAME} requires package ${_PAR_NAME} !!\n${_PAR_FAILURE_MSG}" )
else()
if( NOT _PAR_QUIET )
- ecbuild_warn( ${_failed_message} )
+ ecbuild_warn( "${_failed_message}\n${_PAR_FAILURE_MSG}" )
endif()
endif()
+
endif()
endmacro()
diff --git a/cmake/ecbuild_find_perl.cmake b/cmake/ecbuild_find_perl.cmake
index 97b22f8..b6c1825 100644
--- a/cmake/ecbuild_find_perl.cmake
+++ b/cmake/ecbuild_find_perl.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_find_python.cmake b/cmake/ecbuild_find_python.cmake
index d3cf377..0e9adaa 100644
--- a/cmake/ecbuild_find_python.cmake
+++ b/cmake/ecbuild_find_python.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -67,8 +67,10 @@ function( ecbuild_find_python )
ecbuild_critical("Unknown keywords given to ecbuild_find_python(): \"${_p_UNPARSED_ARGUMENTS}\"")
endif()
if( _p_REQUIRED )
+ ecbuild_debug( "ecbuild_find_python: Searching for Python interpreter (required) ..." )
set( _p_REQUIRED REQUIRED )
else()
+ ecbuild_debug( "ecbuild_find_python: Searching for Python interpreter ..." )
unset( _p_REQUIRED )
endif()
@@ -81,7 +83,7 @@ function( ecbuild_find_python )
# If no suitable version was found, search again with the version specified
if( PYTHONINTERP_FOUND AND _p_VERSION )
if( _p_VERSION VERSION_GREATER "${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}.${PYTHON_VERSION_PATCH}" )
- ecbuild_debug( "ecbuild_find_python: Found Python interpreter version ${PYTHON_VERSION_STRING} at ${PYTHON_EXECUTABLE}, however version ${_p_VERSION} is required. Searching again..." )
+ ecbuild_debug( "ecbuild_find_python: Found Python interpreter version '${PYTHON_VERSION_STRING}' at '${PYTHON_EXECUTABLE}', however version '${_p_VERSION}' is required. Searching again..." )
unset( PYTHONINTERP_FOUND )
unset( PYTHON_EXECUTABLE )
unset( PYTHON_EXECUTABLE CACHE )
@@ -93,10 +95,14 @@ function( ecbuild_find_python )
endif()
endif()
+ set_package_properties( PythonInterp PROPERTIES
+ URL http://python.org
+ DESCRIPTION "Python interpreter" )
+
set( __required_vars PYTHONINTERP_FOUND )
if( PYTHONINTERP_FOUND )
- ecbuild_debug( "ecbuild_find_python: Found Python interpreter version ${PYTHON_VERSION_STRING} at ${PYTHON_EXECUTABLE}" )
+ ecbuild_debug( "ecbuild_find_python: Found Python interpreter version '${PYTHON_VERSION_STRING}' at '${PYTHON_EXECUTABLE}'" )
# find where python site-packages are ...
@@ -104,10 +110,15 @@ function( ecbuild_find_python )
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
ecbuild_debug( "ecbuild_find_python: PYTHON_SITE_PACKAGES=${PYTHON_SITE_PACKAGES}" )
+ else()
+ ecbuild_debug( "ecbuild_find_python: could NOT find Python interpreter!" )
endif()
- if( PYTHONINTERP_FOUND AND NOT _p_NO_LIBS )
+ if( PYTHONINTERP_FOUND AND _p_NO_LIBS )
+ ecbuild_debug( "ecbuild_find_python: NOT searching for Python libraries" )
+ elseif( PYTHONINTERP_FOUND )
list( APPEND __required_vars PYTHONLIBS_FOUND PYTHON_LIBS_WORKING )
+ ecbuild_debug( "ecbuild_find_python: Searching for Python libraries ..." )
# find python config
@@ -124,7 +135,7 @@ function( ecbuild_find_python )
python-config )
endif()
- ecbuild_debug_var( PYTHON_CONFIG_EXECUTABLE )
+ ecbuild_debug( "ecbuild_find_python: found python-config at '${PYTHON_CONFIG_EXECUTABLE}'" )
# find python libs
@@ -132,33 +143,39 @@ function( ecbuild_find_python )
# that don't reliably report linking flags that will work.
if( PYTHON_CONFIG_EXECUTABLE AND NOT ( PYTHON_NO_CONFIG OR ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD" ) )
- ecbuild_debug( "ecbuild_find_python: Searching for Python include directories and libraries using ${PYTHON_CONFIG_EXECUTABLE}" )
+ ecbuild_debug( "ecbuild_find_python: Searching for Python include directories and libraries using '${PYTHON_CONFIG_EXECUTABLE}'" )
- if( NOT PYTHON_LIBRARY )
+ if( DEFINED PYTHON_LIBRARY )
+ ecbuild_debug( "ecbuild_find_python: PYTHON_LIBRARY already set to '${PYTHON_LIBRARY}'" )
+ else()
execute_process(COMMAND "${PYTHON_CONFIG_EXECUTABLE}" --prefix
OUTPUT_VARIABLE PYTHON_PREFIX
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET)
+ ecbuild_debug( "ecbuild_find_python: PYTHON_PREFIX=${PYTHON_PREFIX}" )
execute_process(COMMAND "${PYTHON_CONFIG_EXECUTABLE}" --ldflags
OUTPUT_VARIABLE PYTHON_LIBRARY
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET)
+ ecbuild_debug( "ecbuild_find_python: PYTHON_LIBRARY=${PYTHON_LIBRARY}" )
# Prepend -L and and set the RPATH to the lib directory under the
# Python install prefix unless it is a standard system prefix path
if( PYTHON_LIBRARY AND PYTHON_PREFIX AND NOT CMAKE_SYSTEM_PREFIX_PATH MATCHES ${PYTHON_PREFIX} )
+ ecbuild_debug( "ecbuild_find_python: Python libraries not in CMAKE_SYSTEM_PREFIX_PATH, prepending PYTHON_PREFIX '${PYTHON_PREFIX}' to PYTHON_LIBRARY" )
set( PYTHON_LIBRARY "-L${PYTHON_PREFIX}/lib -Wl,-rpath,${PYTHON_PREFIX}/lib ${PYTHON_LIBRARY}" )
endif()
-
- set( PYTHON_INCLUDE_DIR "${PYTHON_INCLUDE_DIR}" CACHE PATH
- "Path to where Python.h is found" FORCE )
endif()
- if(DEFINED PYTHON_INCLUDE_PATH AND NOT DEFINED PYTHON_INCLUDE_DIR)
+ if( DEFINED PYTHON_INCLUDE_DIR )
+ ecbuild_debug( "ecbuild_find_python: PYTHON_INCLUDE_DIR already set to '${PYTHON_INCLUDE_DIR}'" )
+ elseif(DEFINED PYTHON_INCLUDE_PATH AND NOT DEFINED PYTHON_INCLUDE_DIR)
+ ecbuild_debug( "ecbuild_find_python: PYTHON_INCLUDE_PATH already set to '${PYTHON_INCLUDE_PATH}'" )
+ ecbuild_deprecate( "ecbuild_find_python: PYTHON_INCLUDE_PATH is deprecated, use PYTHON_INCLUDE_DIR instead!" )
set( PYTHON_INCLUDE_DIR "${PYTHON_INCLUDE_PATH}" CACHE PATH
"Path to where Python.h is found" FORCE )
- elseif( NOT PYTHON_INCLUDE_DIR )
+ else()
execute_process(COMMAND "${PYTHON_CONFIG_EXECUTABLE}" --includes
OUTPUT_VARIABLE PYTHON_INCLUDE_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE
@@ -168,6 +185,7 @@ function( ecbuild_find_python )
string(REGEX REPLACE "[ ]-I" " " PYTHON_INCLUDE_DIR "${PYTHON_INCLUDE_DIR}")
separate_arguments(PYTHON_INCLUDE_DIR)
+ ecbuild_debug( "ecbuild_find_python: PYTHON_INCLUDE_DIR=${PYTHON_INCLUDE_DIR}" )
set( PYTHON_INCLUDE_DIR "${PYTHON_INCLUDE_DIR}" CACHE PATH
"Path to where Python.h is found" FORCE )
@@ -184,23 +202,34 @@ function( ecbuild_find_python )
find_package( PythonLibs "${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}.${PYTHON_VERSION_PATCH}" ${_p_REQUIRED} )
+ set_package_properties( PythonLibs PROPERTIES
+ URL http://python.org
+ DESCRIPTION "Python library and header" )
+
endif()
# Remove duplicate include directories
list(REMOVE_DUPLICATES PYTHON_INCLUDE_DIRS)
+ ecbuild_debug( "ecbuild_find_python: PYTHON_INCLUDE_DIRS=${PYTHON_INCLUDE_DIRS}" )
+ ecbuild_debug( "ecbuild_find_python: PYTHON_LIBRARIES=${PYTHON_LIBRARIES}" )
if( PYTHON_LIBRARIES AND PYTHON_INCLUDE_DIRS )
+ ecbuild_debug( "ecbuild_find_python: trying to link executable with Python libraries ..." )
# Test if we can link against the Python libraries and include Python.h
try_compile( PYTHON_LIBS_WORKING ${CMAKE_CURRENT_BINARY_DIR}
${__test_python}
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES=${PYTHON_INCLUDE_DIRS}"
LINK_LIBRARIES ${PYTHON_LIBRARIES}
OUTPUT_VARIABLE __try_compile_output )
- if( NOT PYTHON_LIBS_WORKING )
+ if( PYTHON_LIBS_WORKING )
+ ecbuild_debug( "ecbuild_find_python: trying to link executable with Python libraries successful" )
+ else()
ecbuild_debug( "ecbuild_find_python: trying to link executable with Python libraries failed\n${__try_compile_output}" )
endif()
+ else()
+ ecbuild_debug( "ecbuild_find_python: Python library and include diretory not found" )
endif()
endif()
diff --git a/cmake/ecbuild_generate_config_headers.cmake b/cmake/ecbuild_generate_config_headers.cmake
index 6bc8301..8f2d44e 100644
--- a/cmake/ecbuild_generate_config_headers.cmake
+++ b/cmake/ecbuild_generate_config_headers.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_generate_fortran_interfaces.cmake b/cmake/ecbuild_generate_fortran_interfaces.cmake
index 93c7414..a127315 100644
--- a/cmake/ecbuild_generate_fortran_interfaces.cmake
+++ b/cmake/ecbuild_generate_fortran_interfaces.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_generate_rpc.cmake b/cmake/ecbuild_generate_rpc.cmake
index f06624f..e475f19 100644
--- a/cmake/ecbuild_generate_rpc.cmake
+++ b/cmake/ecbuild_generate_rpc.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_generate_yy.cmake b/cmake/ecbuild_generate_yy.cmake
index 35088fb..ea7ec13 100644
--- a/cmake/ecbuild_generate_yy.cmake
+++ b/cmake/ecbuild_generate_yy.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_get_cxx11_flags.cmake b/cmake/ecbuild_get_cxx11_flags.cmake
index a97fe11..acb0b21 100644
--- a/cmake/ecbuild_get_cxx11_flags.cmake
+++ b/cmake/ecbuild_get_cxx11_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_get_date.cmake b/cmake/ecbuild_get_date.cmake
index 730ea54..0f94d7d 100644
--- a/cmake/ecbuild_get_date.cmake
+++ b/cmake/ecbuild_get_date.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_get_resources.cmake b/cmake/ecbuild_get_resources.cmake
index f531d82..d6c20e4 100644
--- a/cmake/ecbuild_get_resources.cmake
+++ b/cmake/ecbuild_get_resources.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_get_test_data.cmake b/cmake/ecbuild_get_test_data.cmake
index 42185f1..37ea904 100644
--- a/cmake/ecbuild_get_test_data.cmake
+++ b/cmake/ecbuild_get_test_data.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -19,6 +19,15 @@ function( _download_test_data _p_NAME _p_DIRNAME )
#set(ENV{http_proxy} "http://proxy.ecmwf.int:3333")
#endif()
+ # Do not retry downloads by default (ECBUILD-307)
+ if( NOT DEFINED ECBUILD_DOWNLOAD_RETRIES )
+ set( ECBUILD_DOWNLOAD_RETRIES 0 )
+ endif()
+ # Use default timeout of 30s if not specified (ECBUILD-307)
+ if( NOT DEFINED ECBUILD_DOWNLOAD_TIMEOUT )
+ set( ECBUILD_DOWNLOAD_TIMEOUT 30 )
+ endif()
+
find_program( CURL_PROGRAM curl )
mark_as_advanced(CURL_PROGRAM)
@@ -27,6 +36,8 @@ function( _download_test_data _p_NAME _p_DIRNAME )
add_custom_command( OUTPUT ${_p_NAME}
COMMENT "(curl) downloading http://download.ecmwf.org/test-data/${_p_DIRNAME}/${_p_NAME}"
COMMAND ${CURL_PROGRAM} --silent --show-error --fail --output ${_p_NAME}
+ --retry ${ECBUILD_DOWNLOAD_RETRIES}
+ --connect-timeout ${ECBUILD_DOWNLOAD_TIMEOUT}
http://download.ecmwf.org/test-data/${_p_DIRNAME}/${_p_NAME} )
else()
@@ -35,9 +46,13 @@ function( _download_test_data _p_NAME _p_DIRNAME )
if( WGET_PROGRAM )
+ # wget takes the total number of tries, curl the number or retries
+ math( EXPR ECBUILD_DOWNLOAD_RETRIES ${ECBUILD_DOWNLOAD_RETRIES} + 1 )
+
add_custom_command( OUTPUT ${_p_NAME}
COMMENT "(wget) downloading http://download.ecmwf.org/test-data/${_p_DIRNAME}/${_p_NAME}"
COMMAND ${WGET_PROGRAM} -nv -O ${_p_NAME}
+ -t ${ECBUILD_DOWNLOAD_RETRIES} -T ${ECBUILD_DOWNLOAD_TIMEOUT}
http://download.ecmwf.org/test-data/${_p_DIRNAME}/${_p_NAME} )
else()
@@ -105,6 +120,10 @@ endfunction()
# given as the ``MD5`` argument or downloaded from the server otherwise. Use
# the argument ``NOCHECK`` to disable this check.
#
+# The default timeout is 30 seconds, which can be overridden with
+# ``ECBUILD_DOWNLOAD_TIMEOUT``. Downloads are by default only tried once, use
+# ``ECBUILD_DOWNLOAD_RETRIES`` to set the number of retries.
+#
# Examples
# --------
#
diff --git a/cmake/ecbuild_git.cmake b/cmake/ecbuild_git.cmake
index 0a378a6..b2d38fa 100644
--- a/cmake/ecbuild_git.cmake
+++ b/cmake/ecbuild_git.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_install_project.cmake b/cmake/ecbuild_install_project.cmake
index 5e26bea..ddba836 100644
--- a/cmake/ecbuild_install_project.cmake
+++ b/cmake/ecbuild_install_project.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -70,6 +70,17 @@
#
##############################################################################
+function( ecbuild_set_if_not_defined VAR VALUE )
+
+ if(NOT DEFINED ${VAR})
+ set( ${VAR} "${VALUE}" PARENT_SCOPE )
+ # ecbuild_info("Variable not defined, setting ${VAR} => ${VALUE}")
+ # else()
+ # ecbuild_info("${VAR} == ${${VAR}}")
+ endif()
+
+endfunction()
+
macro( ecbuild_install_project )
set( options )
@@ -112,36 +123,34 @@ macro( ecbuild_install_project )
# name, version, etc ...
- set(CPACK_PACKAGE_NAME "${_PAR_NAME}")
- set(CPACK_PACKAGE_VERSION "${${PNAME}_VERSION_STR}")
-
- set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
+ ecbuild_set_if_not_defined(CPACK_PACKAGE_NAME "${_PAR_NAME}")
+ ecbuild_set_if_not_defined(CPACK_PACKAGE_VERSION "${${PNAME}_VERSION_STR}")
- set(CPACK_DEBIAN_PACKAGE_MAINTAINER "ECMWF") # required for DEB
+ ecbuild_set_if_not_defined(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
+ # set(CPACK_DEBIAN_PACKAGE_MAINTAINER "ECMWF") # required for DEB
# set(CPACK_ARCHIVE_COMPONENT_INSTALL "ON")
# set(CPACK_RPM_COMPONENT_INSTALL "ON")
- # set(CPACK_GENERATOR "TGZ;RPM;DEB")
- set(CPACK_GENERATOR "TGZ")
- set(CPACK_SOURCE_GENERATOR "TGZ")
- set(CPACK_PACKAGE_VENDOR "ECMWF")
+ ecbuild_set_if_not_defined(CPACK_SOURCE_GENERATOR "TGZ")
+ ecbuild_set_if_not_defined(CPACK_GENERATOR "TGZ")
+ ecbuild_set_if_not_defined(CPACK_PACKAGE_VENDOR "ECMWF")
# short description
if( _PAR_DESCRIPTION )
- set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${_PAR_DESCRIPTION}" )
+ ecbuild_set_if_not_defined(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${_PAR_DESCRIPTION}" )
else()
- set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${_PAR_NAME} misses a description" )
+ ecbuild_set_if_not_defined(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${_PAR_NAME} misses a description" )
endif()
# long description
if( EXISTS ${PROJECT_SOURCE_DIR}/INSTALL )
- set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/INSTALL")
+ ecbuild_set_if_not_defined(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/INSTALL")
endif()
if( EXISTS ${PROJECT_SOURCE_DIR}/LICENSE )
- set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
+ ecbuild_set_if_not_defined(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
endif()
# set(CPACK_PACKAGE_EXECUTABLES ${ECBUILD_ALL_EXES})
diff --git a/cmake/ecbuild_list_add_pattern.cmake b/cmake/ecbuild_list_add_pattern.cmake
index 0f68217..a0f9f34 100644
--- a/cmake/ecbuild_list_add_pattern.cmake
+++ b/cmake/ecbuild_list_add_pattern.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_list_exclude_pattern.cmake b/cmake/ecbuild_list_exclude_pattern.cmake
index 7e02f47..bfb6ee8 100644
--- a/cmake/ecbuild_list_exclude_pattern.cmake
+++ b/cmake/ecbuild_list_exclude_pattern.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_list_extra_search_paths.cmake b/cmake/ecbuild_list_extra_search_paths.cmake
index b81f062..1ba31bc 100644
--- a/cmake/ecbuild_list_extra_search_paths.cmake
+++ b/cmake/ecbuild_list_extra_search_paths.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_list_macros.cmake b/cmake/ecbuild_list_macros.cmake
index 176a161..232e5e8 100644
--- a/cmake/ecbuild_list_macros.cmake
+++ b/cmake/ecbuild_list_macros.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_log.cmake b/cmake/ecbuild_log.cmake
index 32a1398..ca058fe 100644
--- a/cmake/ecbuild_log.cmake
+++ b/cmake/ecbuild_log.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -27,9 +27,10 @@
# Furthermore there are auxilliary functions for outputting CMake variables,
# CMake lists and environment variables if the log level is ``DEBUG``:
#
-# :ecbuild_debug_var: logs given CMake variables if log level <= ``DEBUG``
-# :ecbuild_debug_list: logs given CMake lists if log level <= ``DEBUG``
-# :ecbuild_debug_env_var: logs given environment variables if log level <= ``DEBUG``
+# :ecbuild_debug_var: logs given CMake variables if log level <= ``DEBUG``
+# :ecbuild_debug_list: logs given CMake lists if log level <= ``DEBUG``
+# :ecbuild_debug_env_var: logs given environment variables if log level <= ``DEBUG``
+# :ecbuild_debug_property: logs given global CMake property if log level <= ``DEBUG``
#
# To log a message to the ecBuild log file only at a given log level, use ::
#
@@ -235,31 +236,14 @@ function( ecbuild_debug_env_var )
endfunction()
##############################################################################
-# macro for debugging a cmake variable
+# function for debugging a CMake global property
-macro( debug_var VAR )
-
- message( WARNING "DEPRECATED debug_var() -- ${VAR} [${${VAR}}]" )
-
-endmacro()
-
-##############################################################################
-# macro for debugging a cmake list
-
-macro( debug_list VAR )
-
- message( WARNING "DEPRECATED debug_list() -- ${VAR}:" )
- foreach( _elem ${${VAR}} )
- message( WARNING " ${_elem}" )
- endforeach()
-
-endmacro()
-
-##############################################################################
-# macro for debugging a environment variable within cmake
-
-macro( debug_env_var VAR )
-
- message( WARNING "DEPRECATED debug_env_var() -- ENV ${VAR} [$ENV{${VAR}}]" )
-
-endmacro()
+function( ecbuild_debug_property )
+ foreach( VAR ${ARGV} )
+ get_property( __prop GLOBAL PROPERTY ${VAR} )
+ ecbuild_log(DEBUG "PROPERTY ${VAR} : ${__prop}")
+ if( ECBUILD_LOG_LEVEL LESS 11)
+ message(STATUS "${Blue}DEBUG - PROPERTY ${VAR} [${__prop}]${ColourReset}")
+ endif()
+ endforeach()
+endfunction()
diff --git a/cmake/ecbuild_pkgconfig.cmake b/cmake/ecbuild_pkgconfig.cmake
index d839a86..ed1076d 100644
--- a/cmake/ecbuild_pkgconfig.cmake
+++ b/cmake/ecbuild_pkgconfig.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_policies.cmake b/cmake/ecbuild_policies.cmake
index 36ab7fe..df2b40f 100644
--- a/cmake/ecbuild_policies.cmake
+++ b/cmake/ecbuild_policies.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_print_summary.cmake b/cmake/ecbuild_print_summary.cmake
index 6fc70d0..c863e60 100644
--- a/cmake/ecbuild_print_summary.cmake
+++ b/cmake/ecbuild_print_summary.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -89,17 +89,23 @@ macro( ecbuild_print_summary )
ecbuild_info( "common definitions: ${defs}" )
- ecbuild_info( "---------------------------------------------------------" )
-
### FEATURE SUMMARY
- # ecbuild_debug_var( CMAKE_VERSION )
+ ecbuild_info( "---------------------------------------------------------" )
+ ecbuild_info( "Feature summary" )
+ ecbuild_info( "---------------------------------------------------------" )
+
if( ${CMAKE_VERSION} VERSION_LESS "2.8.6" )
- feature_summary( WHAT ALL )
+ set( __what ALL )
else()
- feature_summary( WHAT ALL INCLUDE_QUIET_PACKAGES )
+ set( __what ALL INCLUDE_QUIET_PACKAGES )
endif()
+ # Print feature summary
+ feature_summary( WHAT ${__what} )
+ # Write feature summary to ecbuild.log
+ feature_summary( WHAT ${__what} FILENAME ${ECBUILD_LOG_FILE} APPEND )
+
### WARNINGS
# issue warnings / errors in case there are unused project files
diff --git a/cmake/ecbuild_project_files.cmake b/cmake/ecbuild_project_files.cmake
index 3e4b3d2..12c07c2 100644
--- a/cmake/ecbuild_project_files.cmake
+++ b/cmake/ecbuild_project_files.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_remove_fortran_flags.cmake b/cmake/ecbuild_remove_fortran_flags.cmake
index 3a80316..2a41f04 100644
--- a/cmake/ecbuild_remove_fortran_flags.cmake
+++ b/cmake/ecbuild_remove_fortran_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_requires_macro_version.cmake b/cmake/ecbuild_requires_macro_version.cmake
index 1603446..8ff5617 100644
--- a/cmake/ecbuild_requires_macro_version.cmake
+++ b/cmake/ecbuild_requires_macro_version.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_separate_sources.cmake b/cmake/ecbuild_separate_sources.cmake
index 00722ae..69b6810 100644
--- a/cmake/ecbuild_separate_sources.cmake
+++ b/cmake/ecbuild_separate_sources.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -37,10 +37,11 @@
# :<target>_cxx_srcs: source files with extension .cc, .cxx, .cpp, .C
# :<target>_fortran_srcs: source files with extension .f, .F, .for, f77, .f90,
# .f95, .F77, .F90, .F95
+# :<target>_cuda_srcs: source files with extension .cu
#
##############################################################################
-macro( ecbuild_separate_sources )
+function( ecbuild_separate_sources )
set( options )
set( single_value_args TARGET )
@@ -83,11 +84,20 @@ macro( ecbuild_separate_sources )
list( APPEND ${_PAR_TARGET}_fortran_srcs ${src} )
endif()
endforeach()
- set_source_files_properties( ${${_PAR_TARGET}_fortran_srcs} PROPERTIES LANGUAGE Fortran )
-# ecbuild_debug_var( ${_PAR_TARGET}_h_srcs )
-# ecbuild_debug_var( ${_PAR_TARGET}_c_srcs )
-# ecbuild_debug_var( ${_PAR_TARGET}_cxx_srcs )
-# ecbuild_debug_var( ${_PAR_TARGET}_fortran_srcs )
+ foreach( src ${_PAR_SOURCES} )
+ if(${src} MATCHES "(\\.cu$)")
+ list( APPEND ${_PAR_TARGET}_cuda_srcs ${src} )
+ endif()
+ endforeach()
-endmacro( ecbuild_separate_sources )
+ set_source_files_properties( ${${_PAR_TARGET}_fortran_srcs} PROPERTIES LANGUAGE Fortran )
+
+ set( ${_PAR_TARGET}_h_srcs "${${_PAR_TARGET}_h_srcs}" PARENT_SCOPE )
+ set( ${_PAR_TARGET}_c_srcs "${${_PAR_TARGET}_c_srcs}" PARENT_SCOPE )
+ set( ${_PAR_TARGET}_cxx_srcs "${${_PAR_TARGET}_cxx_srcs}" PARENT_SCOPE )
+ set( ${_PAR_TARGET}_fortran_srcs "${${_PAR_TARGET}_fortran_srcs}" PARENT_SCOPE )
+ set( ${_PAR_TARGET}_cuda_srcs "${${_PAR_TARGET}_cuda_srcs}" PARENT_SCOPE )
+
+
+endfunction( ecbuild_separate_sources )
diff --git a/cmake/ecbuild_source_flags.cmake b/cmake/ecbuild_source_flags.cmake
index a281f1d..bd63258 100644
--- a/cmake/ecbuild_source_flags.cmake
+++ b/cmake/ecbuild_source_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_system.cmake b/cmake/ecbuild_system.cmake
index f02113e..10af0c8 100644
--- a/cmake/ecbuild_system.cmake
+++ b/cmake/ecbuild_system.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -62,6 +62,12 @@ if( PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME )
# Include log macros since these are used right away
include( ecbuild_log )
+ execute_process( COMMAND env OUTPUT_VARIABLE __env )
+ ecbuild_debug( "---------------------------------------------------------" )
+ ecbuild_debug( "Environment:" )
+ ecbuild_debug( "---------------------------------------------------------\n${__env}" )
+ ecbuild_debug( "---------------------------------------------------------" )
+
ecbuild_info( "ecbuild ${ecbuild_VERSION_STR}\t${ECBUILD_MACROS_DIR}" )
ecbuild_info( "cmake ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}\t${CMAKE_COMMAND}" )
@@ -78,7 +84,7 @@ if( PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME )
ecbuild_info( "cache ${ECBUILD_CACHE}" )
endif()
- message( STATUS "---------------------------------------------------------" )
+ ecbuild_info( "---------------------------------------------------------" )
# clear the build dir exported targets file (only on the top project)
@@ -250,7 +256,7 @@ if( PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME )
set( EC_BUILD_TIMESTAMP "${EC_BUILD_TIMESTAMP}" CACHE INTERNAL "Build timestamp" )
endif()
- message( STATUS "---------------------------------------------------------" )
+ ecbuild_info( "---------------------------------------------------------" )
else()
@@ -259,7 +265,7 @@ else()
# or
# set( ECBUILD_CONFIG "<subproject-config>.cmake" )
if( ECBUILD_CONFIG )
- message( STATUS "---------------------------------------------------------" )
+ ecbuild_info( "---------------------------------------------------------" )
ecbuild_info( "config ${ECBUILD_CONFIG}" )
include( ${ECBUILD_CONFIG} )
endif()
diff --git a/cmake/ecbuild_target_flags.cmake b/cmake/ecbuild_target_flags.cmake
index 4c589af..b6527d1 100644
--- a/cmake/ecbuild_target_flags.cmake
+++ b/cmake/ecbuild_target_flags.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_use_package.cmake b/cmake/ecbuild_use_package.cmake
index c88bca8..d54e459 100644
--- a/cmake/ecbuild_use_package.cmake
+++ b/cmake/ecbuild_use_package.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
@@ -16,6 +16,11 @@
#
# ecbuild_use_package( PROJECT <name>
# [ VERSION <version> [ EXACT ] ]
+# [ URL <url> ]
+# [ DESCRIPTION <description> ]
+# [ TYPE <type> ]
+# [ PURPOSE <purpose> ]
+# [ FAILURE_MSG <message> ]
# [ REQUIRED ]
# [ QUIET ] )
#
@@ -31,6 +36,21 @@
# EXACT : optional, requires VERSION
# require the exact version rather than a minimum version
#
+# URL : optional
+# homepage of the package (shown in summary and stored in the cache)
+#
+# DESCRIPTION : optional
+# string describing the package (shown in summary and stored in the cache)
+#
+# TYPE : optional, one of RUNTIME|OPTIONAL|RECOMMENDED|REQUIRED
+# type of dependency of the project on this package (defaults to OPTIONAL)
+#
+# PURPOSE : optional
+# string describing which functionality this package enables in the project
+#
+# FAILURE_MSG : optional
+# string to be appended to the failure message if the package is not found
+#
# REQUIRED : optional
# fail if package cannot be found
#
@@ -81,7 +101,7 @@
macro( ecbuild_use_package )
set( options REQUIRED QUIET EXACT )
- set( single_value_args PROJECT VERSION )
+ set( single_value_args PROJECT VERSION URL DESCRIPTION TYPE PURPOSE FAILURE_MSG )
set( multi_value_args )
cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} )
@@ -98,6 +118,12 @@ macro( ecbuild_use_package )
ecbuild_critical("Call to ecbuild_use_package() requests EXACT but doesn't specify VERSION.")
endif()
+ # If the package is required, set TYPE to REQUIRED
+ # Due to shortcomings in CMake's argument parser, passing TYPE REQUIRED has no effect
+ if( _p_REQUIRED )
+ set( _p_TYPE REQUIRED )
+ endif()
+
# try to find the package as a subproject and build it
string( TOUPPER ${_p_PROJECT} pkgUPPER )
@@ -252,7 +278,16 @@ macro( ecbuild_use_package )
# Case 4) is NOT FOUND so far, NOT as sub-project (now or before), and NOT as binary neither
# so try to find precompiled binaries or a build tree
- if( NOT ${pkgUPPER}_FOUND )
+ if( ${pkgUPPER}_FOUND )
+ # Only set package properties if ecbuild_find_package, which itself calls
+ # set_package_properties, is not subsequently called since doing so would
+ # duplicate the purpose
+ set_package_properties( ${_p_PROJECT} PROPERTIES
+ URL "${_p_URL}"
+ DESCRIPTION "${_p_DESCRIPTION}"
+ TYPE "${_p_TYPE}"
+ PURPOSE "${_p_PURPOSE}" )
+ else()
ecbuild_debug("ecbuild_use_package(${_p_PROJECT}): 4) project has NOT been added as a subproject and is NOT already FOUND")
@@ -266,6 +301,22 @@ macro( ecbuild_use_package )
if( _p_REQUIRED )
list( APPEND _opts REQUIRED )
endif()
+ if( _p_URL )
+ list( APPEND _opts URL ${_p_URL} )
+ endif()
+ if( _p_DESCRIPTION )
+ list( APPEND _opts DESCRIPTION "${_p_DESCRIPTION}" )
+ endif()
+ if( _p_TYPE )
+ list( APPEND _opts TYPE ${_p_TYPE} )
+ endif()
+ if( _p_PURPOSE )
+ list( APPEND _opts PURPOSE "${_p_PURPOSE}" )
+ endif()
+ if( _p_FAILURE_MSG )
+ ecbuild_debug_var( _p_FAILURE_MSG )
+ list( APPEND _opts FAILURE_MSG "${_p_FAILURE_MSG}" )
+ endif()
ecbuild_find_package( NAME ${_p_PROJECT} ${_opts} )
diff --git a/cmake/ecbuild_version.h.in b/cmake/ecbuild_version.h.in
index 70c5f0a..89b0e33 100644
--- a/cmake/ecbuild_version.h.in
+++ b/cmake/ecbuild_version.h.in
@@ -1,5 +1,5 @@
/*
- * (C) Copyright 1996-2016 ECMWF.
+ * (C) Copyright 1996-2017 ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/ecbuild_warn_unused_files.cmake b/cmake/ecbuild_warn_unused_files.cmake
index 314a006..7d330d7 100644
--- a/cmake/ecbuild_warn_unused_files.cmake
+++ b/cmake/ecbuild_warn_unused_files.cmake
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/gen_source_flags.py b/cmake/gen_source_flags.py
index b976d31..c08ad08 100644
--- a/cmake/gen_source_flags.py
+++ b/cmake/gen_source_flags.py
@@ -1,4 +1,4 @@
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/include/ecbuild/boost_test_framework.h b/cmake/include/ecbuild/boost_test_framework.h
index f593b70..ba48689 100644
--- a/cmake/include/ecbuild/boost_test_framework.h
+++ b/cmake/include/ecbuild/boost_test_framework.h
@@ -1,5 +1,5 @@
/*
- * (C) Copyright 1996-2016 ECMWF.
+ * (C) Copyright 1996-2017 ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/cmake/sg.pl b/cmake/sg.pl
index 6bce843..f8c8e31 100644
--- a/cmake/sg.pl
+++ b/cmake/sg.pl
@@ -1,7 +1,7 @@
#!/usr/bin/perl
#!/usr/local/share/perl56
-# (C) Copyright 1996-2016 ECMWF.
+# (C) Copyright 1996-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
diff --git a/share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake b/share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake
index c6947e8..e3ef29c 100644
--- a/share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake
+++ b/share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake
@@ -35,7 +35,15 @@ set( OMPSTUBS_Fortran_FLAGS "-hnoomp" )
# LINK FLAGS
####################################################################
-set( ECBUILD_C_LINK_FLAGS "-Wl,-Map,loadmap -Wl,--as-needed -Wl,--eh-frame-hdr -Ktrap=fp" )
-set( ECBUILD_CXX_LINK_FLAGS "-Wl,-Map,loadmap -Wl,--as-needed -Wl,--eh-frame-hdr -Ktrap=fp" )
-set( ECBUILD_Fortran_LINK_FLAGS "-Wl,-Map,loadmap -Wl,--as-needed -Wl,--eh-frame-hdr -Ktrap=fp" )
+set( ECBUILD_SHARED_LINKER_FLAGS "-Wl,--eh-frame-hdr -Ktrap=fp" )
+set( ECBUILD_MODULE_LINKER_FLAGS "-Wl,--eh-frame-hdr -Ktrap=fp -Wl,-Map,loadmap" )
+set( ECBUILD_EXE_LINKER_FLAGS "-Wl,--eh-frame-hdr -Ktrap=fp -Wl,-Map,loadmap -Wl,--as-needed" )
set( ECBUILD_CXX_IMPLICIT_LINK_LIBRARIES "$ENV{CC_X86_64}/lib/x86-64/libcray-c++-rts.so" CACHE STRING "" )
+
+####################################################################
+# LIBRARIES
+####################################################################
+
+# Don't search for LAPACK as it is provided by the cray-libsci module which is
+# loaded by default
+set( LAPACK_FOUND $ENV{CRAY_LIBSCI_PREFIX_DIR} )
diff --git a/share/ecbuild/toolchains/ecmwf-XC30-GNU.cmake b/share/ecbuild/toolchains/ecmwf-XC30-GNU.cmake
index 3ea294f..84dbd7b 100644
--- a/share/ecbuild/toolchains/ecmwf-XC30-GNU.cmake
+++ b/share/ecbuild/toolchains/ecmwf-XC30-GNU.cmake
@@ -39,6 +39,14 @@ set( ECBUILD_Fortran_FLAGS_DEBUG "-ffree-line-length-none -O0 -g -fcheck=bounds
# LINK FLAGS
####################################################################
-set( ECBUILD_C_LINK_FLAGS "-Wl,-Map,load.map -Wl,--as-needed -Wl,--eh-frame-hdr" )
-set( ECBUILD_CXX_LINK_FLAGS "-Wl,-Map,load.map -Wl,--as-needed -Wl,--eh-frame-hdr" )
-set( ECBUILD_Fortran_LINK_FLAGS "-Wl,-Map,load.map -Wl,--as-needed -Wl,--eh-frame-hdr" )
+set( ECBUILD_SHARED_LINKER_FLAGS "-Wl,--eh-frame-hdr" )
+set( ECBUILD_MODULE_LINKER_FLAGS "-Wl,--eh-frame-hdr -Wl,-Map,loadmap" )
+set( ECBUILD_EXE_LINKER_FLAGS "-Wl,--eh-frame-hdr -Wl,-Map,loadmap -Wl,--as-needed" )
+
+####################################################################
+# LIBRARIES
+####################################################################
+
+# Don't search for LAPACK as it is provided by the cray-libsci module which is
+# loaded by default
+set( LAPACK_FOUND $ENV{CRAY_LIBSCI_PREFIX_DIR} )
diff --git a/share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake b/share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake
index d5fdb32..a890886 100644
--- a/share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake
+++ b/share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake
@@ -60,6 +60,14 @@ set( ECBUILD_Fortran_FLAGS_DEBUG "-O0 -g -traceback -warn all -heap-arrays -fpe
# LINK FLAGS
####################################################################
-set( ECBUILD_C_LINK_FLAGS "-Wl,-Map,load.map -Wl,--as-needed -Wl,--eh-frame-hdr" )
-set( ECBUILD_CXX_LINK_FLAGS "-Wl,-Map,load.map -Wl,--as-needed -Wl,--eh-frame-hdr" )
-set( ECBUILD_Fortran_LINK_FLAGS "-Wl,-Map,load.map -Wl,--as-needed -Wl,--eh-frame-hdr" )
+set( ECBUILD_SHARED_LINKER_FLAGS "-Wl,--eh-frame-hdr" )
+set( ECBUILD_MODULE_LINKER_FLAGS "-Wl,--eh-frame-hdr -Wl,-Map,loadmap" )
+set( ECBUILD_EXE_LINKER_FLAGS "-Wl,--eh-frame-hdr -Wl,-Map,loadmap -Wl,--as-needed" )
+
+####################################################################
+# LIBRARIES
+####################################################################
+
+# Don't search for LAPACK as it is provided by the cray-libsci module which is
+# loaded by default
+set( LAPACK_FOUND $ENV{CRAY_LIBSCI_PREFIX_DIR} )
diff --git a/share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake b/share/ecbuild/toolchains/ichec-fionn-Intel.cmake
similarity index 81%
copy from share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake
copy to share/ecbuild/toolchains/ichec-fionn-Intel.cmake
index d5fdb32..184dfb5 100644
--- a/share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake
+++ b/share/ecbuild/toolchains/ichec-fionn-Intel.cmake
@@ -1,10 +1,6 @@
####################################################################
# ARCHITECTURE
####################################################################
-set( CMAKE_SIZEOF_VOID_P 8 )
-
-# Disable relative rpaths as aprun does not respect it
-set( ENABLE_RELATIVE_RPATHS OFF CACHE STRING "Disable relative rpaths" FORCE )
####################################################################
@@ -13,12 +9,9 @@ set( ENABLE_RELATIVE_RPATHS OFF CACHE STRING "Disable relative rpaths" FORCE )
include(CMakeForceCompiler)
-CMAKE_FORCE_C_COMPILER ( cc Intel )
-CMAKE_FORCE_CXX_COMPILER ( CC Intel )
-CMAKE_FORCE_Fortran_COMPILER ( ftn Intel )
-
-set( ECBUILD_FIND_MPI OFF )
-set( ECBUILD_TRUST_FLAGS ON )
+CMAKE_FORCE_C_COMPILER ( icc Intel )
+CMAKE_FORCE_CXX_COMPILER ( icpc Intel )
+CMAKE_FORCE_Fortran_COMPILER ( ifort Intel )
####################################################################
# OpenMP FLAGS
@@ -60,6 +53,15 @@ set( ECBUILD_Fortran_FLAGS_DEBUG "-O0 -g -traceback -warn all -heap-arrays -fpe
# LINK FLAGS
####################################################################
-set( ECBUILD_C_LINK_FLAGS "-Wl,-Map,load.map -Wl,--as-needed -Wl,--eh-frame-hdr" )
-set( ECBUILD_CXX_LINK_FLAGS "-Wl,-Map,load.map -Wl,--as-needed -Wl,--eh-frame-hdr" )
-set( ECBUILD_Fortran_LINK_FLAGS "-Wl,-Map,load.map -Wl,--as-needed -Wl,--eh-frame-hdr" )
+set( ECBUILD_C_LINK_FLAGS "-Wl,-Map,load.map -Wl,--as-needed" )
+set( ECBUILD_CXX_LINK_FLAGS "-Wl,-Map,load.map -Wl,--as-needed" )
+set( ECBUILD_Fortran_LINK_FLAGS "-Wl,-Map,load.map -Wl,--as-needed" )
+
+###################################################################
+#
+# Serial versions of these packages (need to specify intel_mpi versions? )
+###################################################################
+
+set( FFTW_PATH "/ichec/packages/fftw/intel/3.3.4")
+set( NETCDF_PATH "/ichec/packages/netcdf/intel/4.4.0")
+set( HDF5_PATH "/ichec/packages/hdf5/intel/1.8.16")
diff --git a/share/ecflow/etc/ecflowview_attribute_conf.json b/share/ecflow/etc/ecflowview_attribute_conf.json
index f82a84a..7bfc104 100644
--- a/share/ecflow/etc/ecflowview_attribute_conf.json
+++ b/share/ecflow/etc/ecflowview_attribute_conf.json
@@ -22,30 +22,30 @@
},
"repeat" : {
"label" : "Repeats"
+ },
+ "trigger" : {
+ "label" : "Triggers"
+ },
+ "limit" : {
+ "label" : "Limits"
+ },
+ "limiter" : {
+ "label" : "Limiters"
},
"time" : {
"label" : "Times"
},
"date" : {
"label" : "Dates"
- },
- "trigger" : {
- "label" : "Triggers"
+ },
+ "late" : {
+ "label" : "Late"
},
"var" : {
"label" : "Variables"
},
"genvar" : {
"label" : "Generated variables"
- },
- "late" : {
- "label" : "Late"
- },
- "limit" : {
- "label" : "Limits"
- },
- "limiter" : {
- "label" : "Limiters"
}
}
}
diff --git a/share/ecflow/etc/ecflowview_gui.json b/share/ecflow/etc/ecflowview_gui.json
index dfa7f02..532ad17 100644
--- a/share/ecflow/etc/ecflowview_gui.json
+++ b/share/ecflow/etc/ecflowview_gui.json
@@ -108,14 +108,22 @@
"label" : "Tree view",
"group" : {
+ "title" : "Style",
+ "prefix" : "view",
+
+ "line" : "tree.layoutStyle",
+ "line" : "common.node_style"
+ },
+
+ "group" : {
"title" : "Options",
"prefix" : "view",
- "line" : "common.node_style",
"line" : "tree.displayNodeType",
"line" : "tree.display_child_count",
"line" : "tree.indentation",
"line" : "tree.drawBranchLine",
+ "line" : "tree.branchLineColour",
"line" : "tree.background"
},
"group" : {
@@ -148,17 +156,37 @@
},
"tab" : {
+ "prefix" : "view.attribute",
"label" : "Attributes",
+ "adjustLineLabel" : "25",
"group" : {
- "title" : "Options",
+ "title" : "Events",
+ "prefix" : "view.attribute",
+ "line" : "eventFillColour"
+ },
+ "group" : {
+ "title" : "Meters",
"prefix" : "view.attribute",
-
- "line" : "eventFillColour",
"line" : "meterFillColour",
- "line" : "meterThresholdColour",
+ "line" : "meterThresholdColour"
+ },
+ "group" : {
+ "title" : "Limits",
+ "prefix" : "view.attribute",
+ "line" : "limitShape",
"line" : "limitFillColour",
- "line" : "limitExtraFillColour"
+ "line" : "limitExtraFillColour"
+ },
+ "group" : {
+ "title" : "Triggers",
+ "prefix" : "view.attribute",
+ "line" : "triggerBackground",
+ "line" : "triggerBorderColour",
+ "line" : "triggerFontColour",
+ "line" : "completeBackground",
+ "line" : "completeBorderColour",
+ "line" : "completeFontColour"
}
}
}
diff --git a/share/ecflow/etc/ecflowview_highlighter.json b/share/ecflow/etc/ecflowview_highlighter.json
index 0d81088..583a2a6 100644
--- a/share/ecflow/etc/ecflowview_highlighter.json
+++ b/share/ecflow/etc/ecflowview_highlighter.json
@@ -2,7 +2,7 @@
"info" : {
"main" : {
- "pattern" : "^\\s*(name|type|status|at|aborted reason)\\s+:",
+ "pattern" : "^\\s*(name|type|status|flags|at|aborted reason)\\s+:",
"colour" : "rgb(0,0,128)",
"bold" : "true"
},
diff --git a/share/ecflow/etc/ecflowview_menus.json b/share/ecflow/etc/ecflowview_menus.json
index c64cf11..35717a5 100644
--- a/share/ecflow/etc/ecflowview_menus.json
+++ b/share/ecflow/etc/ecflowview_menus.json
@@ -250,11 +250,11 @@
{
"menu" : "Node",
- "name" : "Cancel",
- "visible_for" : "suite and (oper or admin)",
+ "name" : "Remove",
+ "visible_for" : "(suite or family or task) and (oper or admin)",
"enabled_for" : "(not active) and (not submitted)",
"command" : "ecflow_client --delete=yes <full_name>",
- "question" : "Do you really want to cancel suite <full_name> ?",
+ "question" : "Do you really want to remove <full_name> ?",
"default_answer" : "No",
"status_tip" : "__cmd__"
},
@@ -481,6 +481,14 @@
{
"menu" : "Special",
+ "name" : "Clear late (=slow write) flag",
+ "visible_for" : "server",
+ "command" : "ecflow_client --alter clear_flag late /",
+ "status_tip" : "__cmd__"
+ },
+
+ {
+ "menu" : "Special",
"name" : "Clear killed flag",
"visible_for" : "(task or alias)",
"command" : "ecflow_client --alter clear_flag killed <full_name>",
diff --git a/share/ecflow/etc/ecflowview_notification_conf.json b/share/ecflow/etc/ecflowview_notification_conf.json
index 531724b..d40e3aa 100644
--- a/share/ecflow/etc/ecflowview_notification_conf.json
+++ b/share/ecflow/etc/ecflowview_notification_conf.json
@@ -65,11 +65,11 @@
"restarted": {
"fill_colour" : {
"label" : "Backgorund colour",
- "default": "rgb(64,224,208)"
+ "default": "rgb(248,160,71)"
},
"text_colour" : {
"label" : "Text colour",
- "default": "rgb(0,0,0)"
+ "default": "rgb(30,30,30)"
},
"count_fill_colour" : {
"label" : "Notification count background colour",
@@ -117,11 +117,11 @@
"late": {
"fill_colour" : {
"label" : "Backgorund colour",
- "default": "rgb(64,224,208)"
+ "default": "rgb(248,160,71)"
},
"text_colour" : {
"label" : "Text colour",
- "default": "rgb(0,0,0)"
+ "default": "rgb(30,30,30)"
},
"count_fill_colour" : {
"label" : "Notification count background colour",
@@ -168,11 +168,11 @@
"zombie": {
"fill_colour" : {
"label" : "Backgorund colour",
- "default": "rgb(64,224,208)"
+ "default": "rgb(248,160,71)"
},
"text_colour" : {
"label" : "Text colour",
- "default": "rgb(0,0,0)"
+ "default": "rgb(30,30,30)"
},
"count_fill_colour" : {
"label" : "Notification count background colour",
@@ -219,11 +219,11 @@
"alias": {
"fill_colour" : {
"label" : "Backgorund colour",
- "default": "rgb(64,224,208)"
+ "default": "rgb(248,160,71)"
},
"text_colour" : {
"label" : "Text colour",
- "default": "rgb(0,0,0)"
+ "default": "rgb(30,30,30)"
},
"count_fill_colour" : {
"label" : "Notification count background colour",
@@ -294,4 +294,4 @@
-}
\ No newline at end of file
+}
diff --git a/share/ecflow/etc/ecflowview_panels.json b/share/ecflow/etc/ecflowview_panels.json
index b40b715..100bdd5 100644
--- a/share/ecflow/etc/ecflowview_panels.json
+++ b/share/ecflow/etc/ecflowview_panels.json
@@ -11,7 +11,7 @@
"icon" : "overview.svg",
"dock_icon" : "overview.svg",
"show" : "toolbar",
- "tooltip" : "Open <b>info</b> tab in a new Info Panel dialog",
+ "button_tooltip" : "Open <b>info</b> tab in a new Info Panel dialog",
"visible_for" : "server or node"
},
@@ -21,7 +21,7 @@
"icon" : "manual.svg",
"dock_icon" : "manual_dock.svg",
"show" : "toolbar",
- "tooltip" : "Open <b>manual</b> tab in a new Info Panel dialog",
+ "button_tooltip" : "Open <b>manual</b> tab in a new Info Panel dialog",
"visible_for" : "node"
},
@@ -31,7 +31,7 @@
"icon" : "script.svg",
"dock_icon" : "script_dock.svg",
"show" : "toolbar",
- "tooltip" : "Open <b>script</b> tab in a new Info Panel dialog",
+ "button_tooltip" : "Open <b>script</b> tab in a new Info Panel dialog",
"visible_for" : "task or alias"
},
@@ -41,7 +41,7 @@
"icon" : "job.svg",
"dock_icon" : "job_dock.svg",
"show" : "toolbar",
- "tooltip" : "Open <b>job</b> tab in a new Info Panel dialog",
+ "button_tooltip" : "Open <b>job</b> tab in a new Info Panel dialog",
"visible_for" : "task or alias"
},
@@ -51,7 +51,7 @@
"icon" : "output.svg",
"dock_icon" : "output_dock.svg",
"show" : "toolbar",
- "tooltip" : "Open <b>output</b> tab in a new Info Panel dialog",
+ "button_tooltip" : "Open <b>output</b> tab in a new Info Panel dialog",
"visible_for" : "task or alias"
},
@@ -61,7 +61,7 @@
"icon" : "why.svg",
"dock_icon" : "why_dock.svg",
"show" : "toolbar",
- "tooltip" : "Open <b>why</b> tab in a new Info Panel dialog",
+ "button_tooltip" : "Open <b>why</b> tab in a new Info Panel dialog",
"visible_for" : "server or node"
},
@@ -70,7 +70,7 @@
"label" : "Triggers",
"icon" : "trigger.svg",
"show" : "toolbar",
- "tooltip" : "Open <b>triggers</b> tab in a new Info Panel dialog",
+ "button_tooltip" : "Open <b>triggers</b> tab in a new Info Panel dialog",
"visible_for" : "node"
},
@@ -87,7 +87,7 @@
"icon" : "variable.svg",
"dock_icon" : "variable_dock.svg",
"show" : "toolbar",
- "tooltip" : "Open <b>variables</b> tab in a new Info Panel dialog",
+ "button_tooltip" : "Open <b>variables</b> tab in a new Info Panel dialog",
"visible_for" : "server or node"
},
@@ -98,7 +98,7 @@
"icon" : "edit.svg",
"dock_icon" : "edit.svg",
"show" : "toolbar",
- "tooltip" : "Open <b>edit</b> tab in a new Info Panel dialog",
+ "button_tooltip" : "Open <b>edit</b> tab in a new Info Panel dialog",
"visible_for" : "task or alias"
} ,
@@ -108,7 +108,7 @@
"icon" : "server_log.svg",
"dock_icon" : "log.svg",
"show" : "toolbar",
- "tooltip" : "Open <b>server log</b> tab in a new Info Panel dialog",
+ "button_tooltip" : "Open <b>server log</b> tab in a new Info Panel dialog",
"visible_for" : "server"
},
@@ -118,7 +118,7 @@
"label" : "Node log",
"icon" : "node_log.svg",
"show" : "toolbar",
- "tooltip" : "Open <b>Node log</b> tab in a new Info Panel dialog",
+ "button_tooltip" : "Open <b>Node log</b> tab in a new Info Panel dialog",
"visible_for" : "server or node"
},
@@ -129,7 +129,7 @@
"icon" : "zombie.svg",
"dock_icon" : "zombie_dock.svg",
"show" : "toolbar",
- "tooltip" : "Open <b>zombies</b> tab in a new Info Panel dialog",
+ "button_tooltip" : "Open <b>zombies</b> tab in a new Info Panel dialog",
"visible_for" : "server"
},
diff --git a/share/ecflow/etc/ecflowview_view_conf.json b/share/ecflow/etc/ecflowview_view_conf.json
index 68ca257..7beb960 100644
--- a/share/ecflow/etc/ecflowview_view_conf.json
+++ b/share/ecflow/etc/ecflowview_view_conf.json
@@ -21,7 +21,12 @@
}
},
"tree": {
-
+ "layoutStyle" : {
+ "label" : "Tree layout style",
+ "default" : "standard",
+ "values" : "standard/compact",
+ "values_label" : "Standard/Compact"
+ },
"nodeFont" : {
"label" : "Nodes",
"default": "font(,)"
@@ -34,29 +39,37 @@
"display_child_count" : {
"label" : "Display number of children for servers/suites",
- "default": "true"
+ "default": "false"
},
"displayNodeType" : {
"label" : "Display node type",
- "default": "true"
+ "default": "false"
},
"background" : {
"label" : "Background colour",
- "default" : "rgb(250,250,250)"
+ "default" : "rgb(242,242,242)"
},
"indentation" : {
"label" : "Indentation",
"suffix" : "pixels",
"default" : "10",
"min" : "0",
- "max" : "100"
+ "max" : "100",
+ "disabledRule" : "layoutStyle=compact"
},
"drawBranchLine" : {
"label" : "Draw branch lines",
- "default": "false"
+ "default": "false",
+ "disabledRule" : "layoutStyle=compact"
},
+ "branchLineColour" : {
+ "label" : "Branch line colour",
+ "default": "rgb(137,137,137)",
+ "disabledRule" : "layoutStyle=standard"
+ },
+
"defaultAttributes" : {
"label" : "Default visible attributes",
"default" : "meter/event/repeat/trigger/label/time/date/limit/limiter/late",
@@ -103,22 +116,52 @@
"default" : "rgb(0,0,255)"
},
"meterFillColour" : {
- "label" : "Meter colour",
+ "label" : "Meter progress colour",
"default" : "rgb(0,0,255)"
},
"meterThresholdColour" : {
"label" : "Meter threshold colour",
"default" : "rgb(0,0,255)"
},
+ "limitShape" : {
+ "label" : "Limit shape",
+ "default" : "circle",
+ "values" : "rectangle/circle",
+ "values_label" : "rectangle/circle"
+ },
"limitFillColour" : {
- "label" : "Limit colour",
- "default" : "rgb(0,255,0)"
+ "label" : "Limit fill colour",
+ "default" : "rgb(11,234,11)"
},
"limitExtraFillColour" : {
"label" : "Limit exceed colour",
+ "default" : "rgb(254,3,0)"
+ },
+ "triggerBackground" : {
+ "label" : "Trigger background colour",
+ "default" : "rgb(230,230,230)"
+ },
+ "triggerBorderColour" : {
+ "label" : "Trigger border colour",
+ "default" : "rgb(150,150,150)"
+ },
+ "triggerFontColour" : {
+ "label" : "Trigger font colour",
+ "default" : "rgb(0,0,0)"
+ },
+ "completeBackground" : {
+ "label" : "Complete background colour",
+ "default" : "rgb(230,230,230)"
+ },
+ "completeBorderColour" : {
+ "label" : "Complete border colour",
+ "default" : "rgb(150,150,150)"
+ },
+ "completeFontColour" : {
+ "label" : "Complete font colour",
"default" : "rgb(0,0,255)"
- }
- },
+ }
+ },
"textEdit" : {
diff --git a/share/ecflow/etc/viewer.qss b/share/ecflow/etc/viewer.qss
index a648ded..f87815e 100644
--- a/share/ecflow/etc/viewer.qss
+++ b/share/ecflow/etc/viewer.qss
@@ -39,7 +39,7 @@ QToolButton#pathNameTb:hover{
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #deebf6, stop: 1 #bed8ee);
border: 1px solid rgb(160, 160, 160);
border-radius: 0px;
- padding: 0px;
+ padding: 0px;
}
QToolButton#pathIconTb{
@@ -94,17 +94,6 @@ QTabBar[notify="1"]::tab {
}
/*----------------------------
- Icon folder view
-------------------------------*/
-
-/* QGraphicsview cannot be set from qss, only its
-baseclass QFrame. So we need to set QFrame here! */
-QFrame[breadcrumbs="1"] {
- background: rgb(252, 252, 252);
- border: 0;
-}
-
-/*----------------------------
TreeNodeView
------------------------------*/
diff --git a/tools/ecf_cmd b/tools/ecf_cmd
index 1e9adc2..b5631ea 100755
--- a/tools/ecf_cmd
+++ b/tools/ecf_cmd
@@ -5,7 +5,7 @@
##.SECTION EMOS
##.DATE 2005-09-12
##.VERSION 1.0
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/tools/ecflow_load.sh b/tools/ecflow_load.sh
index b10342c..2364779 100755
--- a/tools/ecflow_load.sh
+++ b/tools/ecflow_load.sh
@@ -1,5 +1,5 @@
#!/bin/bash
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/tools/ecflow_logsvr.pl b/tools/ecflow_logsvr.pl
index 13a613a..f481b04 100755
Binary files a/tools/ecflow_logsvr.pl and b/tools/ecflow_logsvr.pl differ
diff --git a/tools/ecflow_logsvr.sh b/tools/ecflow_logsvr.sh
index 46ece15..a4048ae 100644
--- a/tools/ecflow_logsvr.sh
+++ b/tools/ecflow_logsvr.sh
@@ -1,5 +1,5 @@
#!/bin/ksh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/tools/ecflow_start.sh b/tools/ecflow_start.sh
index 281d72c..de70f03 100755
--- a/tools/ecflow_start.sh
+++ b/tools/ecflow_start.sh
@@ -8,7 +8,7 @@
##.AUTHOR Avi
## Revision : $Revision: #19 $
##
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/tools/ecflow_stop.sh b/tools/ecflow_stop.sh
index 5767de1..c1d1267 100755
--- a/tools/ecflow_stop.sh
+++ b/tools/ecflow_stop.sh
@@ -6,7 +6,7 @@
##.AUTHOR Avi
## Revision : $Revision: #10 $
##
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/tools/noconnect.sh b/tools/noconnect.sh
index c8ff878..e50e18b 100755
--- a/tools/noconnect.sh
+++ b/tools/noconnect.sh
@@ -7,7 +7,7 @@
##.AUTHOR
## Revision : $Revision: #7 $
##
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/Jamfile.jam b/view/Jamfile.jam
index 84946b5..033d0ad 100644
--- a/view/Jamfile.jam
+++ b/view/Jamfile.jam
@@ -1,4 +1,4 @@
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/ArrayP.h b/view/src/ArrayP.h
index ef47280..b7b444c 100644
--- a/view/src/ArrayP.h
+++ b/view/src/ArrayP.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/Hyper.c b/view/src/Hyper.c
index 9328fb7..2c38ec5 100644
--- a/view/src/Hyper.c
+++ b/view/src/Hyper.c
@@ -3,7 +3,7 @@
/* Author : B.Raoult */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
@@ -844,7 +844,7 @@ int n_args;
GetValues(swin);
{
- Position x_parent,y_parent; Position x,y;
+ Position x_parent=0,y_parent=0; Position x=0,y=0;
int min= 0, max= 80, value= 0, slider_size = 80, inc = 10, page_inc = 100;
int arg = atoi(args[0]);
/* SetArg(XmNminimum,&min);
diff --git a/view/src/Hyper.h b/view/src/Hyper.h
index 4973ea0..1005b33 100644
--- a/view/src/Hyper.h
+++ b/view/src/Hyper.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/HyperP.h b/view/src/HyperP.h
index 72666a7..b27b15e 100644
--- a/view/src/HyperP.h
+++ b/view/src/HyperP.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/SimpleBase.c b/view/src/SimpleBase.c
index e73b119..11dba25 100644
--- a/view/src/SimpleBase.c
+++ b/view/src/SimpleBase.c
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #10 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/SimpleBase.h b/view/src/SimpleBase.h
index a17ac82..a56ddb9 100644
--- a/view/src/SimpleBase.h
+++ b/view/src/SimpleBase.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/SimpleBaseP.h b/view/src/SimpleBaseP.h
index 3fe8f2f..d04d9fb 100644
--- a/view/src/SimpleBaseP.h
+++ b/view/src/SimpleBaseP.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/SimpleGraph.c b/view/src/SimpleGraph.c
index 1df3c72..aaa530b 100644
--- a/view/src/SimpleGraph.c
+++ b/view/src/SimpleGraph.c
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/SimpleGraph.h b/view/src/SimpleGraph.h
index 9f5a97f..3ee45e8 100644
--- a/view/src/SimpleGraph.h
+++ b/view/src/SimpleGraph.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/SimpleGraphP.h b/view/src/SimpleGraphP.h
index 1fe152a..6dc7877 100644
--- a/view/src/SimpleGraphP.h
+++ b/view/src/SimpleGraphP.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/SimpleTime.c b/view/src/SimpleTime.c
index 51047b8..14a428d 100644
--- a/view/src/SimpleTime.c
+++ b/view/src/SimpleTime.c
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
@@ -291,7 +291,6 @@ static void Initialize(SimpleTimeWidget request, SimpleTimeWidget new)
new->simpletime.arcs = 0;
time_out(new,0);
-
}
static void Destroy(SimpleTimeWidget w)
@@ -305,12 +304,11 @@ static Boolean SetValues(SimpleTimeWidget current,SimpleTimeWidget request,
SimpleTimeWidget new)
{
int redraw = FALSE;
-
/*
- * If the minimum spacing has changed, recalculate the
- * simpletime layout. new_layout() does a redraw, so we don't
- * need SetValues to do another one.
- */
+ * If the minimum spacing has changed, recalculate the
+ * simpletime layout. new_layout() does a redraw, so we don't
+ * need SetValues to do another one.
+ */
if (new->simpletime.v_min_space != current->simpletime.v_min_space ||
new->simpletime.second_per_pixel != current->simpletime.second_per_pixel )
@@ -345,9 +343,9 @@ static void line_in(SimpleTimeWidget w,int x1,int y1,int x2,int y2)
/*static void line_out(SimpleTimeWidget w,int x1,int y1,int x2,int y2)
{
- XDrawLine(XtDisplay(w), XtWindow(w), w->simpletime.gc,
- x1,y1,x2,y2);
- } */
+XDrawLine(XtDisplay(w), XtWindow(w), w->simpletime.gc,
+x1,y1,x2,y2);
+} */
static void Redisplay (SimpleTimeWidget w, XEvent *event, Region region)
{
@@ -728,11 +726,11 @@ void TimeShowTime(Widget _w,DateTime dt,XEvent* ev)
void TimeEventTime(Widget _w,XEvent* e,DateTime *dt)
{
- int x = e->xbutton.x;
- int d,t;
- time_of((SimpleTimeWidget)_w,x,&d,&t);
- dt->date = julian_to_date(d);
- dt->time = sec_to_time(t);
+ int x = e->xbutton.x;
+ int d,t;
+ time_of((SimpleTimeWidget)_w,x,&d,&t);
+ dt->date = julian_to_date(d);
+ dt->time = sec_to_time(t);
}
int TimeDiff(DateTime dt1,DateTime dt2)
@@ -752,16 +750,16 @@ int TimeDiff(DateTime dt1,DateTime dt2)
void *TimeFindByY(Widget _w,XEvent *ev)
{
- SimpleBaseWidget w = (SimpleBaseWidget)_w;
- int i;
- for(i = 0; i < w->simplebase.count;i++)
- {
- NodeStruct *n = w->simplebase.nodes + i;
- if(n->managed)
- if(
- /* ev->xbutton.x >= n->r.x && ev->xbutton.x <= n->r.x + n->r.width && */
- ev->xbutton.y >= n->r.y && ev->xbutton.y <= n->r.y + n->r.height)
- return n->user_data;
- }
- return NULL;
+ SimpleBaseWidget w = (SimpleBaseWidget)_w;
+ int i;
+ for(i = 0; i < w->simplebase.count;i++)
+ {
+ NodeStruct *n = w->simplebase.nodes + i;
+ if(n->managed)
+ if(
+ /* ev->xbutton.x >= n->r.x && ev->xbutton.x <= n->r.x + n->r.width && */
+ ev->xbutton.y >= n->r.y && ev->xbutton.y <= n->r.y + n->r.height)
+ return n->user_data;
+ }
+ return NULL;
}
diff --git a/view/src/SimpleTime.h b/view/src/SimpleTime.h
index 563877d..eaf11ee 100644
--- a/view/src/SimpleTime.h
+++ b/view/src/SimpleTime.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/SimpleTimeP.h b/view/src/SimpleTimeP.h
index d7b8851..0e66c88 100644
--- a/view/src/SimpleTimeP.h
+++ b/view/src/SimpleTimeP.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/SimpleTree.c b/view/src/SimpleTree.c
index 996ebcd..1ffdbf9 100644
--- a/view/src/SimpleTree.c
+++ b/view/src/SimpleTree.c
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/SimpleTree.h b/view/src/SimpleTree.h
index 18d1418..86db00a 100644
--- a/view/src/SimpleTree.h
+++ b/view/src/SimpleTree.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/SimpleTreeP.h b/view/src/SimpleTreeP.h
index 5f9ed68..74d53ea 100644
--- a/view/src/SimpleTreeP.h
+++ b/view/src/SimpleTreeP.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/Tab.c b/view/src/Tab.c
index 4c46871..cf8ec8d 100644
--- a/view/src/Tab.c
+++ b/view/src/Tab.c
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #6 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/Tab.h b/view/src/Tab.h
index 8c0dc63..dd41ae1 100644
--- a/view/src/Tab.h
+++ b/view/src/Tab.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/TabP.h b/view/src/TabP.h
index 5d4675a..f4542b5 100644
--- a/view/src/TabP.h
+++ b/view/src/TabP.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/aborted.cc b/view/src/aborted.cc
index 41b395a..008c97a 100644
--- a/view/src/aborted.cc
+++ b/view/src/aborted.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/aborted.h b/view/src/aborted.h
index 6de57dd..7d53efc 100644
--- a/view/src/aborted.h
+++ b/view/src/aborted.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/alerts.cc b/view/src/alerts.cc
index 4532af3..4474465 100644
--- a/view/src/alerts.cc
+++ b/view/src/alerts.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/alias.cc b/view/src/alias.cc
index c37977a..b346a80 100644
--- a/view/src/alias.cc
+++ b/view/src/alias.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/arch.h b/view/src/arch.h
index 4a02730..3ba612b 100644
--- a/view/src/arch.h
+++ b/view/src/arch.h
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/array.cc b/view/src/array.cc
index cae135c..c82318f 100644
--- a/view/src/array.cc
+++ b/view/src/array.cc
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/array.h b/view/src/array.h
index 8349766..7ad3721 100644
--- a/view/src/array.h
+++ b/view/src/array.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/ask.cc b/view/src/ask.cc
index efcf733..85f0acd 100644
--- a/view/src/ask.cc
+++ b/view/src/ask.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/ask.h b/view/src/ask.h
index 711207d..b1e72ba 100644
--- a/view/src/ask.h
+++ b/view/src/ask.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/autoAlarm.h b/view/src/autoAlarm.h
index 0c0668a..248149b 100644
--- a/view/src/autoAlarm.h
+++ b/view/src/autoAlarm.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/auto_alarm.cc b/view/src/auto_alarm.cc
index 5531165..40736d0 100644
--- a/view/src/auto_alarm.cc
+++ b/view/src/auto_alarm.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/auto_alarm.h b/view/src/auto_alarm.h
index 5ab2927..5d042f3 100644
--- a/view/src/auto_alarm.h
+++ b/view/src/auto_alarm.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/base.cc b/view/src/base.cc
index 34c50a2..5b6ea96 100644
--- a/view/src/base.cc
+++ b/view/src/base.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/base.h b/view/src/base.h
index 7ca8602..332076b 100644
--- a/view/src/base.h
+++ b/view/src/base.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/bool.h b/view/src/bool.h
index 5ae2d35..df5caaa 100644
--- a/view/src/bool.h
+++ b/view/src/bool.h
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/choice.h b/view/src/choice.h
index 5a97307..668e41b 100644
--- a/view/src/choice.h
+++ b/view/src/choice.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/collector.cc b/view/src/collector.cc
index cb93d1d..dc3be63 100644
--- a/view/src/collector.cc
+++ b/view/src/collector.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #13 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/collector.h b/view/src/collector.h
index 18de3e9..ec0ede8 100644
--- a/view/src/collector.h
+++ b/view/src/collector.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/colors_prefs.cc b/view/src/colors_prefs.cc
index 37f40c4..43ed994 100644
--- a/view/src/colors_prefs.cc
+++ b/view/src/colors_prefs.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/colors_prefs.h b/view/src/colors_prefs.h
index e71706e..0707014 100644
--- a/view/src/colors_prefs.h
+++ b/view/src/colors_prefs.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/configurable.cc b/view/src/configurable.cc
index e30cd89..37dd92a 100644
--- a/view/src/configurable.cc
+++ b/view/src/configurable.cc
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/configurable.h b/view/src/configurable.h
index 353af50..fcf3078 100644
--- a/view/src/configurable.h
+++ b/view/src/configurable.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/configurator.h b/view/src/configurator.h
index 99be923..90f1e9e 100644
--- a/view/src/configurator.h
+++ b/view/src/configurator.h
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/confirm.cc b/view/src/confirm.cc
index c9bd479..96b19eb 100644
--- a/view/src/confirm.cc
+++ b/view/src/confirm.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/confirm.h b/view/src/confirm.h
index 12ee595..b7172f2 100644
--- a/view/src/confirm.h
+++ b/view/src/confirm.h
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/counted.cc b/view/src/counted.cc
index 848f1f0..b8882c0 100644
--- a/view/src/counted.cc
+++ b/view/src/counted.cc
@@ -7,7 +7,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/counted.h b/view/src/counted.h
index 6f0ef34..f4fa6cb 100644
--- a/view/src/counted.h
+++ b/view/src/counted.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/date.cc b/view/src/date.cc
index e8c9c03..72591fb 100644
--- a/view/src/date.cc
+++ b/view/src/date.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/date.h b/view/src/date.h
index 0da7ef7..147c170 100644
--- a/view/src/date.h
+++ b/view/src/date.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #10 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/depend.cc b/view/src/depend.cc
index 789f0ef..007dea3 100644
--- a/view/src/depend.cc
+++ b/view/src/depend.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/depend.h b/view/src/depend.h
index bd19a15..5f1e23e 100644
--- a/view/src/depend.h
+++ b/view/src/depend.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/dialog.cc b/view/src/dialog.cc
index 4970526..d9d6d4d 100644
--- a/view/src/dialog.cc
+++ b/view/src/dialog.cc
@@ -11,7 +11,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/dialog.h b/view/src/dialog.h
index 698096b..81c3211 100644
--- a/view/src/dialog.h
+++ b/view/src/dialog.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/directory.cc b/view/src/directory.cc
index d8fb243..c170add 100644
--- a/view/src/directory.cc
+++ b/view/src/directory.cc
@@ -7,7 +7,7 @@
// Author :
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/directory.h b/view/src/directory.h
index d334f2b..7315b30 100644
--- a/view/src/directory.h
+++ b/view/src/directory.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/doer.sh b/view/src/doer.sh
index b9decee..3e5fd55 100644
--- a/view/src/doer.sh
+++ b/view/src/doer.sh
@@ -4,7 +4,7 @@
# Author :
# Revision : $Revision: #3 $
#
-# Copyright 2009-2016 ECMWF.
+# Copyright 2009-2017 ECMWF.
# This software is licensed under the terms of the Apache Licence version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/dummy_node.cc b/view/src/dummy_node.cc
index 2e06c0f..a16881b 100644
--- a/view/src/dummy_node.cc
+++ b/view/src/dummy_node.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #15 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/dummy_node.h b/view/src/dummy_node.h
index 9551b88..5c46f3c 100644
--- a/view/src/dummy_node.h
+++ b/view/src/dummy_node.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/ecf_node.cc b/view/src/ecf_node.cc
index e5c9b93..8bcbf25 100644
--- a/view/src/ecf_node.cc
+++ b/view/src/ecf_node.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #114 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -341,7 +341,6 @@ void ecf_concrete_node<Alias>::make_subtree()
template<>
void ecf_concrete_node<Node>::make_subtree()
{
-
if (!owner_) return;
Node* n = owner_;
@@ -683,7 +682,8 @@ int redraw_kids( node* node_, const std::vector<ecf::Aspect::Type>& aspect )
break;
case ecf::Aspect::REPEAT:
kind = NODE_REPEAT;
- // node_->update(-1, -1, -1); node_->redraw(); break;
+ // node_->update(-1, -1, -1); node_->redraw();
+ break;
case ecf::Aspect::STATE:
node_->update(-1, -1, -1);
node_->redraw();
@@ -788,7 +788,6 @@ void ecf_concrete_node<Suite>::update( const Node* n, const std::vector<ecf::Asp
const_cast<Node*>(n)->set_graphic_ptr(xnode()); /* ??? */
if (is_reset(aspect)) {
-
Updating::set_full_redraw();
return;
}
diff --git a/view/src/ecf_node.h b/view/src/ecf_node.h
index b3b74eb..b178ec9 100644
--- a/view/src/ecf_node.h
+++ b/view/src/ecf_node.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #65 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -422,6 +422,12 @@ public:
return typeid(owner_).name();
}
+ virtual void update_start(const Node*, const std::vector<ecf::Aspect::Type>&)
+ {
+ }
+ virtual void update_start(const Defs*, const std::vector<ecf::Aspect::Type>&)
+ {
+ }
virtual void update( const Node* n, const std::vector<ecf::Aspect::Type>& asp )
{
if (!owner_) return;
diff --git a/view/src/ecflow.cc b/view/src/ecflow.cc
index 0f777cb..7474140 100644
--- a/view/src/ecflow.cc
+++ b/view/src/ecflow.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #13 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/ecflow.h b/view/src/ecflow.h
index 85048ea..25d8fd6 100644
--- a/view/src/ecflow.h
+++ b/view/src/ecflow.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #19 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/ecflowview.cc b/view/src/ecflowview.cc
index 550e5a6..b06c5c0 100644
--- a/view/src/ecflowview.cc
+++ b/view/src/ecflowview.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #30 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/ecflowview.h b/view/src/ecflowview.h
index ff9fc6f..8095424 100644
--- a/view/src/ecflowview.h
+++ b/view/src/ecflowview.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #13 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/ecflowview.menu b/view/src/ecflowview.menu
index d15a2f7..b8f44a8 100644
--- a/view/src/ecflowview.menu
+++ b/view/src/ecflowview.menu
@@ -4,7 +4,7 @@
! Author :
! Revision : $Revision: #26 $
!
-! Copyright 2009-2016 ECMWF.
+! Copyright 2009-2017 ECMWF.
! This software is licensed under the terms of the Apache Licence version 2.0
! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
! In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/ecflowview.menu.h b/view/src/ecflowview.menu.h
index 724359b..cd90179 100644
--- a/view/src/ecflowview.menu.h
+++ b/view/src/ecflowview.menu.h
@@ -4,7 +4,7 @@
(char*) " ! Author : ",
(char*) " ! Revision : $Revision: #26 $ ",
(char*) " ! ",
-(char*) " ! Copyright 2009-2016 ECMWF. ",
+(char*) " ! Copyright 2009-2017 ECMWF. ",
(char*) " ! This software is licensed under the terms of the Apache Licence version 2.0 ",
(char*) " ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. ",
(char*) " ! In applying this licence, ECMWF does not waive the privileges and immunities ",
diff --git a/view/src/edit.cc b/view/src/edit.cc
index b5947a0..efcb844 100644
--- a/view/src/edit.cc
+++ b/view/src/edit.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #13 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -45,9 +45,9 @@ edit::edit(panel_window& w):
tmp_(0), kStart(0x0), kEnd(0x0)
{
if (kStart==NULL)
- kStart=(char*)calloc(1024, sizeof(char*));
+ kStart=(char*)calloc(1024, sizeof(char));
if (kEnd==NULL)
- kEnd=(char*)calloc(1024, sizeof(char*));
+ kEnd=(char*)calloc(1024, sizeof(char));
}
edit::~edit()
diff --git a/view/src/edit.h b/view/src/edit.h
index 3af1699..d41dea9 100644
--- a/view/src/edit.h
+++ b/view/src/edit.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/edit_label.cc b/view/src/edit_label.cc
index 28c7e73..382cf7f 100644
--- a/view/src/edit_label.cc
+++ b/view/src/edit_label.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/edit_label.h b/view/src/edit_label.h
index 90eb7d6..12e57a9 100644
--- a/view/src/edit_label.h
+++ b/view/src/edit_label.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/edit_limit.cc b/view/src/edit_limit.cc
index c2def92..e8870a0 100644
--- a/view/src/edit_limit.cc
+++ b/view/src/edit_limit.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/edit_limit.h b/view/src/edit_limit.h
index 9b2fc17..8f06548 100644
--- a/view/src/edit_limit.h
+++ b/view/src/edit_limit.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/edit_meter.cc b/view/src/edit_meter.cc
index e32845f..146867e 100644
--- a/view/src/edit_meter.cc
+++ b/view/src/edit_meter.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/edit_meter.h b/view/src/edit_meter.h
index 9c32685..fbae2ec 100644
--- a/view/src/edit_meter.h
+++ b/view/src/edit_meter.h
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/edit_repeat.cc b/view/src/edit_repeat.cc
index 8e465c0..9b31128 100644
--- a/view/src/edit_repeat.cc
+++ b/view/src/edit_repeat.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/edit_repeat.h b/view/src/edit_repeat.h
index f133ce2..f3b957e 100644
--- a/view/src/edit_repeat.h
+++ b/view/src/edit_repeat.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/edit_variable.cc b/view/src/edit_variable.cc
index 703907a..418540d 100644
--- a/view/src/edit_variable.cc
+++ b/view/src/edit_variable.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/edit_variable.h b/view/src/edit_variable.h
index e8ea86f..f8c8f1f 100644
--- a/view/src/edit_variable.h
+++ b/view/src/edit_variable.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/editor.cc b/view/src/editor.cc
index e1dc765..f2c8f8e 100644
--- a/view/src/editor.cc
+++ b/view/src/editor.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/editor.h b/view/src/editor.h
index 4d2e6ac..7d744ac 100644
--- a/view/src/editor.h
+++ b/view/src/editor.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/error.cc b/view/src/error.cc
index e7274f8..756475d 100644
--- a/view/src/error.cc
+++ b/view/src/error.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/error.h b/view/src/error.h
index 625f5a9..ab1750d 100644
--- a/view/src/error.h
+++ b/view/src/error.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/eval.h b/view/src/eval.h
index 6d89459..344ea6a 100644
--- a/view/src/eval.h
+++ b/view/src/eval.h
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/event_node.cc b/view/src/event_node.cc
index 3684f05..7b915d0 100644
--- a/view/src/event_node.cc
+++ b/view/src/event_node.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/event_node.h b/view/src/event_node.h
index f7db7b7..8cb0902 100644
--- a/view/src/event_node.h
+++ b/view/src/event_node.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #10 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/events.h b/view/src/events.h
index e722840..a254ce3 100644
--- a/view/src/events.h
+++ b/view/src/events.h
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/extent.h b/view/src/extent.h
index 1c40c47..eee3bbc 100644
--- a/view/src/extent.h
+++ b/view/src/extent.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/external.cc b/view/src/external.cc
index 79ec14b..451b51d 100644
--- a/view/src/external.cc
+++ b/view/src/external.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/external.h b/view/src/external.h
index fdc705c..ae4ff15 100644
--- a/view/src/external.h
+++ b/view/src/external.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/find.cc b/view/src/find.cc
index 9f70aa5..dc0e2b8 100644
--- a/view/src/find.cc
+++ b/view/src/find.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/find.h b/view/src/find.h
index e39bf39..a13bee1 100644
--- a/view/src/find.h
+++ b/view/src/find.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/flags.cc b/view/src/flags.cc
index 9418082..e72756d 100644
--- a/view/src/flags.cc
+++ b/view/src/flags.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/flags.h b/view/src/flags.h
index 8d19890..69c48dc 100644
--- a/view/src/flags.h
+++ b/view/src/flags.h
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/fonts_prefs.cc b/view/src/fonts_prefs.cc
index 2ee4b04..1d9553e 100644
--- a/view/src/fonts_prefs.cc
+++ b/view/src/fonts_prefs.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/fonts_prefs.h b/view/src/fonts_prefs.h
index b2ff4a8..c6dbc6a 100644
--- a/view/src/fonts_prefs.h
+++ b/view/src/fonts_prefs.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/fsb.cc b/view/src/fsb.cc
index 79f3edd..b1d11d6 100644
--- a/view/src/fsb.cc
+++ b/view/src/fsb.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/fsb.h b/view/src/fsb.h
index 52c613b..e1805c3 100644
--- a/view/src/fsb.h
+++ b/view/src/fsb.h
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/gen_translator.h b/view/src/gen_translator.h
index ba2174c..69cf84d 100644
--- a/view/src/gen_translator.h
+++ b/view/src/gen_translator.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/globals.cc b/view/src/globals.cc
index 26f9541..709dc70 100644
--- a/view/src/globals.cc
+++ b/view/src/globals.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/globals.h b/view/src/globals.h
index ee4cbd3..564bcb3 100644
--- a/view/src/globals.h
+++ b/view/src/globals.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/graph_layout.cc b/view/src/graph_layout.cc
index 51d4f1e..f86f5d3 100644
--- a/view/src/graph_layout.cc
+++ b/view/src/graph_layout.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/graph_layout.h b/view/src/graph_layout.h
index b27d306..69d4a9f 100644
--- a/view/src/graph_layout.h
+++ b/view/src/graph_layout.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/gui.cc b/view/src/gui.cc
index 645e171..ffcc3df 100644
--- a/view/src/gui.cc
+++ b/view/src/gui.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/gui.h b/view/src/gui.h
index 27dc8cf..f7b9c86 100644
--- a/view/src/gui.h
+++ b/view/src/gui.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/history.cc b/view/src/history.cc
index 699888d..503cde3 100644
--- a/view/src/history.cc
+++ b/view/src/history.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/history.h b/view/src/history.h
index 69eaec8..3504dcd 100644
--- a/view/src/history.h
+++ b/view/src/history.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/host.cc b/view/src/host.cc
index 6fb3d9f..335e0de 100644
--- a/view/src/host.cc
+++ b/view/src/host.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #122 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/host.h b/view/src/host.h
index 7be224c..3059ac7 100644
--- a/view/src/host.h
+++ b/view/src/host.h
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #33 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/host_prefs.cc b/view/src/host_prefs.cc
index 273753a..7aa5d0a 100644
--- a/view/src/host_prefs.cc
+++ b/view/src/host_prefs.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/host_prefs.h b/view/src/host_prefs.h
index 8990c8a..341724b 100644
--- a/view/src/host_prefs.h
+++ b/view/src/host_prefs.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/html_lister.cc b/view/src/html_lister.cc
index 1f57a37..d64ff8b 100644
--- a/view/src/html_lister.cc
+++ b/view/src/html_lister.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/html_lister.h b/view/src/html_lister.h
index 53b48fc..0a13bd1 100644
--- a/view/src/html_lister.h
+++ b/view/src/html_lister.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/http.cc b/view/src/http.cc
index a8efeb3..ecbf97b 100644
--- a/view/src/http.cc
+++ b/view/src/http.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/http.h b/view/src/http.h
index 926d447..8d26b42 100644
--- a/view/src/http.h
+++ b/view/src/http.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/hyper_lister.cc b/view/src/hyper_lister.cc
index a2b3456..f37ddba 100644
--- a/view/src/hyper_lister.cc
+++ b/view/src/hyper_lister.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/hyper_lister.h b/view/src/hyper_lister.h
index 4a16ea1..73d4546 100644
--- a/view/src/hyper_lister.h
+++ b/view/src/hyper_lister.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/icon_Josstatus3.cc b/view/src/icon_Josstatus3.cc
index b028cdc..14f10a1 100644
--- a/view/src/icon_Josstatus3.cc
+++ b/view/src/icon_Josstatus3.cc
@@ -4,7 +4,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/icon_W.cc b/view/src/icon_W.cc
index cb55b79..d0a59b4 100644
--- a/view/src/icon_W.cc
+++ b/view/src/icon_W.cc
@@ -4,7 +4,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/info.cc b/view/src/info.cc
index ab6340f..a46114c 100644
--- a/view/src/info.cc
+++ b/view/src/info.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/info.h b/view/src/info.h
index 89aac31..ca6d062 100644
--- a/view/src/info.h
+++ b/view/src/info.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/init.cc b/view/src/init.cc
index c320362..b8450eb 100644
--- a/view/src/init.cc
+++ b/view/src/init.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/init.h b/view/src/init.h
index 55274c5..ed0bb98 100644
--- a/view/src/init.h
+++ b/view/src/init.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/inlimit_node.cc b/view/src/inlimit_node.cc
index f004916..dfcf3a3 100644
--- a/view/src/inlimit_node.cc
+++ b/view/src/inlimit_node.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/inlimit_node.h b/view/src/inlimit_node.h
index e2dd2ef..da40725 100644
--- a/view/src/inlimit_node.h
+++ b/view/src/inlimit_node.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #10 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/input.cc b/view/src/input.cc
index af1084c..ad99d11 100644
--- a/view/src/input.cc
+++ b/view/src/input.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/input.h b/view/src/input.h
index 07b31d8..136f04e 100644
--- a/view/src/input.h
+++ b/view/src/input.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/interface.cc b/view/src/interface.cc
index d4679c6..8820338 100644
--- a/view/src/interface.cc
+++ b/view/src/interface.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/interface.h b/view/src/interface.h
index b0c28d6..65fd788 100644
--- a/view/src/interface.h
+++ b/view/src/interface.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/job.cc b/view/src/job.cc
index ad0f26b..9d8bf1c 100644
--- a/view/src/job.cc
+++ b/view/src/job.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/job.h b/view/src/job.h
index 8500a4f..8dff6ac 100644
--- a/view/src/job.h
+++ b/view/src/job.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/jobcheck_panel.cc b/view/src/jobcheck_panel.cc
index 3dd0068..9093e7e 100644
--- a/view/src/jobcheck_panel.cc
+++ b/view/src/jobcheck_panel.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/jobcheck_panel.h b/view/src/jobcheck_panel.h
index 7fe9f8b..bf085f0 100644
--- a/view/src/jobcheck_panel.h
+++ b/view/src/jobcheck_panel.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/jobstatus.cc b/view/src/jobstatus.cc
index 7d7756c..e348dc0 100644
--- a/view/src/jobstatus.cc
+++ b/view/src/jobstatus.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #13 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/jobstatus.h b/view/src/jobstatus.h
index 5a04d01..11e7ec7 100644
--- a/view/src/jobstatus.h
+++ b/view/src/jobstatus.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/label.cc b/view/src/label.cc
index 01bba05..33bd47a 100644
--- a/view/src/label.cc
+++ b/view/src/label.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #15 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/label_node.h b/view/src/label_node.h
index 26e1b4d..19b7840 100644
--- a/view/src/label_node.h
+++ b/view/src/label_node.h
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/late.cc b/view/src/late.cc
index fff896e..42ed3c4 100644
--- a/view/src/late.cc
+++ b/view/src/late.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/late.h b/view/src/late.h
index 6704466..6731d9a 100644
--- a/view/src/late.h
+++ b/view/src/late.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/late_node.cc b/view/src/late_node.cc
index 85ab116..b8fc3ae 100644
--- a/view/src/late_node.cc
+++ b/view/src/late_node.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/late_node.h b/view/src/late_node.h
index b38cd82..8bef1fd 100644
--- a/view/src/late_node.h
+++ b/view/src/late_node.h
@@ -6,7 +6,7 @@
/* Author : */
/* Revision : $Revision: #11 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/layout.cc b/view/src/layout.cc
index eaac0c1..c918314 100644
--- a/view/src/layout.cc
+++ b/view/src/layout.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/layout.h b/view/src/layout.h
index f35394b..0682310 100644
--- a/view/src/layout.h
+++ b/view/src/layout.h
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/lexyacc.h b/view/src/lexyacc.h
index 1bdc9aa..b39829a 100644
--- a/view/src/lexyacc.h
+++ b/view/src/lexyacc.h
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Apply.cc b/view/src/libicon/icon_Apply.cc
index 267a187..6478c9f 100644
--- a/view/src/libicon/icon_Apply.cc
+++ b/view/src/libicon/icon_Apply.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Apply.xpm b/view/src/libicon/icon_Apply.xpm
index 9b5d0b3..948ad8e 100644
--- a/view/src/libicon/icon_Apply.xpm
+++ b/view/src/libicon/icon_Apply.xpm
@@ -28,7 +28,7 @@ static char * Apply_xpm[] = {
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Chat.cc b/view/src/libicon/icon_Chat.cc
index 865b707..edb33d9 100644
--- a/view/src/libicon/icon_Chat.cc
+++ b/view/src/libicon/icon_Chat.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #8 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Chat.xpm b/view/src/libicon/icon_Chat.xpm
index 1e5faf1..2baddcf 100644
--- a/view/src/libicon/icon_Chat.xpm
+++ b/view/src/libicon/icon_Chat.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Check.cc b/view/src/libicon/icon_Check.cc
index deeafac..ed1f4c3 100644
--- a/view/src/libicon/icon_Check.cc
+++ b/view/src/libicon/icon_Check.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Check.xpm b/view/src/libicon/icon_Check.xpm
index 2b5a338..fea37a7 100644
--- a/view/src/libicon/icon_Check.xpm
+++ b/view/src/libicon/icon_Check.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Edit.cc b/view/src/libicon/icon_Edit.cc
index 90b80c9..5aa5200 100644
--- a/view/src/libicon/icon_Edit.cc
+++ b/view/src/libicon/icon_Edit.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #8 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Edit.xpm b/view/src/libicon/icon_Edit.xpm
index 63cc675..68c24fe 100644
--- a/view/src/libicon/icon_Edit.xpm
+++ b/view/src/libicon/icon_Edit.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Info.cc b/view/src/libicon/icon_Info.cc
index 7753be9..b4e667a 100644
--- a/view/src/libicon/icon_Info.cc
+++ b/view/src/libicon/icon_Info.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #8 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Info.xpm b/view/src/libicon/icon_Info.xpm
index 48dd952..6ffe23d 100644
--- a/view/src/libicon/icon_Info.xpm
+++ b/view/src/libicon/icon_Info.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Jobstatus.cc b/view/src/libicon/icon_Jobstatus.cc
index c15f9ff..85f2c43 100644
--- a/view/src/libicon/icon_Jobstatus.cc
+++ b/view/src/libicon/icon_Jobstatus.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Jobstatus.xpm b/view/src/libicon/icon_Jobstatus.xpm
index 11c9b21..1833fac 100644
--- a/view/src/libicon/icon_Jobstatus.xpm
+++ b/view/src/libicon/icon_Jobstatus.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Josstatus3.xpm b/view/src/libicon/icon_Josstatus3.xpm
index 11c9b21..1833fac 100644
--- a/view/src/libicon/icon_Josstatus3.xpm
+++ b/view/src/libicon/icon_Josstatus3.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Load.cc b/view/src/libicon/icon_Load.cc
index 9f8116d..fef08bc 100644
--- a/view/src/libicon/icon_Load.cc
+++ b/view/src/libicon/icon_Load.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Load.xpm b/view/src/libicon/icon_Load.xpm
index 1cc18d0..ee40d33 100644
--- a/view/src/libicon/icon_Load.xpm
+++ b/view/src/libicon/icon_Load.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Manual.cc b/view/src/libicon/icon_Manual.cc
index e996106..3c91415 100644
--- a/view/src/libicon/icon_Manual.cc
+++ b/view/src/libicon/icon_Manual.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Manual.xpm b/view/src/libicon/icon_Manual.xpm
index 4843186..a016149 100644
--- a/view/src/libicon/icon_Manual.xpm
+++ b/view/src/libicon/icon_Manual.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Merge.cc b/view/src/libicon/icon_Merge.cc
index c76dd77..7228c16 100644
--- a/view/src/libicon/icon_Merge.cc
+++ b/view/src/libicon/icon_Merge.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Merge.xpm b/view/src/libicon/icon_Merge.xpm
index 6a70f54..d9941a3 100644
--- a/view/src/libicon/icon_Merge.xpm
+++ b/view/src/libicon/icon_Merge.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Messages.cc b/view/src/libicon/icon_Messages.cc
index b4088f2..55746e9 100644
--- a/view/src/libicon/icon_Messages.cc
+++ b/view/src/libicon/icon_Messages.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #8 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Messages.xpm b/view/src/libicon/icon_Messages.xpm
index 4e78af4..a2874f9 100644
--- a/view/src/libicon/icon_Messages.xpm
+++ b/view/src/libicon/icon_Messages.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Output.cc b/view/src/libicon/icon_Output.cc
index 84a7af9..e250923 100644
--- a/view/src/libicon/icon_Output.cc
+++ b/view/src/libicon/icon_Output.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #8 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Output.xpm b/view/src/libicon/icon_Output.xpm
index 29c8a32..c241bc4 100644
--- a/view/src/libicon/icon_Output.xpm
+++ b/view/src/libicon/icon_Output.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_QuickFind.cc b/view/src/libicon/icon_QuickFind.cc
index 7d7c56d..bb8d65f 100644
--- a/view/src/libicon/icon_QuickFind.cc
+++ b/view/src/libicon/icon_QuickFind.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_QuickFind.xpm b/view/src/libicon/icon_QuickFind.xpm
index ea5dd97..0dbb684 100644
--- a/view/src/libicon/icon_QuickFind.xpm
+++ b/view/src/libicon/icon_QuickFind.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Script.cc b/view/src/libicon/icon_Script.cc
index 3a709eb..7fe70f2 100644
--- a/view/src/libicon/icon_Script.cc
+++ b/view/src/libicon/icon_Script.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #8 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Script.xpm b/view/src/libicon/icon_Script.xpm
index fd05d03..323232e 100644
--- a/view/src/libicon/icon_Script.xpm
+++ b/view/src/libicon/icon_Script.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Search.cc b/view/src/libicon/icon_Search.cc
index f11b6b4..c9df909 100644
--- a/view/src/libicon/icon_Search.cc
+++ b/view/src/libicon/icon_Search.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #8 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Search.xpm b/view/src/libicon/icon_Search.xpm
index f66adbb..e0565ab 100644
--- a/view/src/libicon/icon_Search.xpm
+++ b/view/src/libicon/icon_Search.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Status.cc b/view/src/libicon/icon_Status.cc
index cf07d7b..1211244 100644
--- a/view/src/libicon/icon_Status.cc
+++ b/view/src/libicon/icon_Status.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Status.xpm b/view/src/libicon/icon_Status.xpm
index 94c9861..334a140 100644
--- a/view/src/libicon/icon_Status.xpm
+++ b/view/src/libicon/icon_Status.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Submit.cc b/view/src/libicon/icon_Submit.cc
index 1e326bc..70f15bf 100644
--- a/view/src/libicon/icon_Submit.cc
+++ b/view/src/libicon/icon_Submit.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Submit.xpm b/view/src/libicon/icon_Submit.xpm
index c6511a6..6da0f84 100644
--- a/view/src/libicon/icon_Submit.xpm
+++ b/view/src/libicon/icon_Submit.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Time_line.cc b/view/src/libicon/icon_Time_line.cc
index 194bb36..8bd0aaf 100644
--- a/view/src/libicon/icon_Time_line.cc
+++ b/view/src/libicon/icon_Time_line.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #8 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Time_line.xpm b/view/src/libicon/icon_Time_line.xpm
index 96683ae..61f1ff9 100644
--- a/view/src/libicon/icon_Time_line.xpm
+++ b/view/src/libicon/icon_Time_line.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Triggers.cc b/view/src/libicon/icon_Triggers.cc
index 3d78b60..8c459a5 100644
--- a/view/src/libicon/icon_Triggers.cc
+++ b/view/src/libicon/icon_Triggers.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Triggers.xpm b/view/src/libicon/icon_Triggers.xpm
index 3fafcc6..132bda8 100644
--- a/view/src/libicon/icon_Triggers.xpm
+++ b/view/src/libicon/icon_Triggers.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Update.cc b/view/src/libicon/icon_Update.cc
index 355218b..3b5086f 100644
--- a/view/src/libicon/icon_Update.cc
+++ b/view/src/libicon/icon_Update.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Update.xpm b/view/src/libicon/icon_Update.xpm
index 94c9861..334a140 100644
--- a/view/src/libicon/icon_Update.xpm
+++ b/view/src/libicon/icon_Update.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Use_external_editor.cc b/view/src/libicon/icon_Use_external_editor.cc
index d37407b..f8eb134 100644
--- a/view/src/libicon/icon_Use_external_editor.cc
+++ b/view/src/libicon/icon_Use_external_editor.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #8 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Use_external_editor.xpm b/view/src/libicon/icon_Use_external_editor.xpm
index f3c2610..89e45e2 100644
--- a/view/src/libicon/icon_Use_external_editor.xpm
+++ b/view/src/libicon/icon_Use_external_editor.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Use_external_viewer.cc b/view/src/libicon/icon_Use_external_viewer.cc
index e74b602..8260d69 100644
--- a/view/src/libicon/icon_Use_external_viewer.cc
+++ b/view/src/libicon/icon_Use_external_viewer.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #8 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Use_external_viewer.xpm b/view/src/libicon/icon_Use_external_viewer.xpm
index d7c9b78..a616f3a 100644
--- a/view/src/libicon/icon_Use_external_viewer.xpm
+++ b/view/src/libicon/icon_Use_external_viewer.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Variables.cc b/view/src/libicon/icon_Variables.cc
index 0f551e2..ae6163d 100644
--- a/view/src/libicon/icon_Variables.cc
+++ b/view/src/libicon/icon_Variables.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Variables.xpm b/view/src/libicon/icon_Variables.xpm
index c268de2..a86942d 100644
--- a/view/src/libicon/icon_Variables.xpm
+++ b/view/src/libicon/icon_Variables.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_W.xpm b/view/src/libicon/icon_W.xpm
index cf11d9a..fc1822f 100644
--- a/view/src/libicon/icon_W.xpm
+++ b/view/src/libicon/icon_W.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Why_.cc b/view/src/libicon/icon_Why_.cc
index f4931a5..23c5c77 100644
--- a/view/src/libicon/icon_Why_.cc
+++ b/view/src/libicon/icon_Why_.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #5 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_Z.cc b/view/src/libicon/icon_Z.cc
index fd0e768..d15c0e7 100644
--- a/view/src/libicon/icon_Z.cc
+++ b/view/src/libicon/icon_Z.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_calendar.cc b/view/src/libicon/icon_calendar.cc
index 8918e13..b51fc10 100644
--- a/view/src/libicon/icon_calendar.cc
+++ b/view/src/libicon/icon_calendar.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_calendar.xpm b/view/src/libicon/icon_calendar.xpm
index 442dc5b..3caf66e 100644
--- a/view/src/libicon/icon_calendar.xpm
+++ b/view/src/libicon/icon_calendar.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_clock.cc b/view/src/libicon/icon_clock.cc
index a718c50..9f80116 100644
--- a/view/src/libicon/icon_clock.cc
+++ b/view/src/libicon/icon_clock.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_clock.xpm b/view/src/libicon/icon_clock.xpm
index e241a4c..f973711 100644
--- a/view/src/libicon/icon_clock.xpm
+++ b/view/src/libicon/icon_clock.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_clock_free.cc b/view/src/libicon/icon_clock_free.cc
index 3a71a73..627980c 100644
--- a/view/src/libicon/icon_clock_free.cc
+++ b/view/src/libicon/icon_clock_free.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_complete.cc b/view/src/libicon/icon_complete.cc
index a1a82e6..737eb71 100644
--- a/view/src/libicon/icon_complete.cc
+++ b/view/src/libicon/icon_complete.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_complete.xpm b/view/src/libicon/icon_complete.xpm
index d018e59..4f4eb97 100644
--- a/view/src/libicon/icon_complete.xpm
+++ b/view/src/libicon/icon_complete.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_defstatus.cc b/view/src/libicon/icon_defstatus.cc
index 4f6745a..bfe6fda 100644
--- a/view/src/libicon/icon_defstatus.cc
+++ b/view/src/libicon/icon_defstatus.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_defstatus.xpm b/view/src/libicon/icon_defstatus.xpm
index b60f4bb..a8d8c4b 100644
--- a/view/src/libicon/icon_defstatus.xpm
+++ b/view/src/libicon/icon_defstatus.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_folded.cc b/view/src/libicon/icon_folded.cc
index b44518b..72c87a9 100644
--- a/view/src/libicon/icon_folded.cc
+++ b/view/src/libicon/icon_folded.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_folded.xpm b/view/src/libicon/icon_folded.xpm
index 918b774..d3d3f0b 100644
--- a/view/src/libicon/icon_folded.xpm
+++ b/view/src/libicon/icon_folded.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_late.cc b/view/src/libicon/icon_late.cc
index 7b11ba2..b36b362 100644
--- a/view/src/libicon/icon_late.cc
+++ b/view/src/libicon/icon_late.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_late.xpm b/view/src/libicon/icon_late.xpm
index d513a46..d34f7e6 100644
--- a/view/src/libicon/icon_late.xpm
+++ b/view/src/libicon/icon_late.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_limit0.cc b/view/src/libicon/icon_limit0.cc
index 3e9f594..ae5d1e0 100644
--- a/view/src/libicon/icon_limit0.cc
+++ b/view/src/libicon/icon_limit0.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_limit0.xpm b/view/src/libicon/icon_limit0.xpm
index 401fae9..98da8c8 100644
--- a/view/src/libicon/icon_limit0.xpm
+++ b/view/src/libicon/icon_limit0.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_limit1.cc b/view/src/libicon/icon_limit1.cc
index 8f3d1ff..a071acc 100644
--- a/view/src/libicon/icon_limit1.cc
+++ b/view/src/libicon/icon_limit1.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_limit1.xpm b/view/src/libicon/icon_limit1.xpm
index 754086d..37478ca 100644
--- a/view/src/libicon/icon_limit1.xpm
+++ b/view/src/libicon/icon_limit1.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_limit2.cc b/view/src/libicon/icon_limit2.cc
index 84d819e..d3ecf10 100644
--- a/view/src/libicon/icon_limit2.cc
+++ b/view/src/libicon/icon_limit2.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_limit2.xpm b/view/src/libicon/icon_limit2.xpm
index 4caced4..c5d9ba4 100644
--- a/view/src/libicon/icon_limit2.xpm
+++ b/view/src/libicon/icon_limit2.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_locked.cc b/view/src/libicon/icon_locked.cc
index cd7c444..081348f 100644
--- a/view/src/libicon/icon_locked.cc
+++ b/view/src/libicon/icon_locked.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_locked.xpm b/view/src/libicon/icon_locked.xpm
index ad020c9..3a8b540 100644
--- a/view/src/libicon/icon_locked.xpm
+++ b/view/src/libicon/icon_locked.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_memo.cc b/view/src/libicon/icon_memo.cc
index 462b19c..1ffa3f9 100644
--- a/view/src/libicon/icon_memo.cc
+++ b/view/src/libicon/icon_memo.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_memo.xpm b/view/src/libicon/icon_memo.xpm
index 9436e05..57a250f 100644
--- a/view/src/libicon/icon_memo.xpm
+++ b/view/src/libicon/icon_memo.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_message.cc b/view/src/libicon/icon_message.cc
index c822c93..02618da 100644
--- a/view/src/libicon/icon_message.cc
+++ b/view/src/libicon/icon_message.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_message.xpm b/view/src/libicon/icon_message.xpm
index 6ef47b3..b63e17b 100644
--- a/view/src/libicon/icon_message.xpm
+++ b/view/src/libicon/icon_message.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_migrated.cc b/view/src/libicon/icon_migrated.cc
index 7d7dccb..f1aea26 100644
--- a/view/src/libicon/icon_migrated.cc
+++ b/view/src/libicon/icon_migrated.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_migrated.xpm b/view/src/libicon/icon_migrated.xpm
index 8c67491..22f3252 100644
--- a/view/src/libicon/icon_migrated.xpm
+++ b/view/src/libicon/icon_migrated.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_noway.cc b/view/src/libicon/icon_noway.cc
index b3473ee..ee3d89b 100644
--- a/view/src/libicon/icon_noway.cc
+++ b/view/src/libicon/icon_noway.cc
@@ -3,7 +3,7 @@
// Author :
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_noway.xpm b/view/src/libicon/icon_noway.xpm
index caa8a74..8903966 100644
--- a/view/src/libicon/icon_noway.xpm
+++ b/view/src/libicon/icon_noway.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_rerun.cc b/view/src/libicon/icon_rerun.cc
index 3055fd4..9c29b72 100644
--- a/view/src/libicon/icon_rerun.cc
+++ b/view/src/libicon/icon_rerun.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #1 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/libicon/icon_rerun.xpm b/view/src/libicon/icon_rerun.xpm
index 73d4f81..cc664fc 100644
--- a/view/src/libicon/icon_rerun.xpm
+++ b/view/src/libicon/icon_rerun.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_waiting.cc b/view/src/libicon/icon_waiting.cc
index 1810277..c34aa47 100644
--- a/view/src/libicon/icon_waiting.cc
+++ b/view/src/libicon/icon_waiting.cc
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libicon/icon_waiting.xpm b/view/src/libicon/icon_waiting.xpm
index d214afb..c32ec16 100644
--- a/view/src/libicon/icon_waiting.xpm
+++ b/view/src/libicon/icon_waiting.xpm
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libui/uiask.cc b/view/src/libui/uiask.cc
index 724e57f..56b5539 100644
--- a/view/src/libui/uiask.cc
+++ b/view/src/libui/uiask.cc
@@ -63,7 +63,6 @@ void ask_shell_c::create (Widget parent, char *widget_name)
XtAddCallback (form_, XmNhelpCallback,&ask_shell_c:: helpCB, (XtPointer) this);
children[ac++] = value_;
XtManageChildren(children, ac);
- ac = 0;
}
void ask_shell_c::helpCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uicollector.cc b/view/src/libui/uicollector.cc
index 1a8e299..f3972b6 100644
--- a/view/src/libui/uicollector.cc
+++ b/view/src/libui/uicollector.cc
@@ -151,7 +151,6 @@ void collector_shell_c::create (Widget parent, char *widget_name)
children[ac++] = command_;
children[ac++] = menuBar1;
XtManageChildren(children, ac);
- ac = 0;
}
void collector_shell_c::stopCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uicolors.cc b/view/src/libui/uicolors.cc
index 3e40d69..c78e76e 100644
--- a/view/src/libui/uicolors.cc
+++ b/view/src/libui/uicolors.cc
@@ -478,7 +478,6 @@ void colors_form_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = form_;
XtManageChildren(children, ac);
- ac = 0;
}
void colors_form_c::useCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uiconfirm.cc b/view/src/libui/uiconfirm.cc
index 54eeed5..2840a91 100644
--- a/view/src/libui/uiconfirm.cc
+++ b/view/src/libui/uiconfirm.cc
@@ -55,7 +55,6 @@ void confirm_shell_c::create (Widget parent, char *widget_name)
XmMessageBoxGetChild ( form_, XmDIALOG_OK_BUTTON );
XtSetArg(al[ac], XmNsensitive, FALSE); ac++;
XtSetValues ( button21,al, ac );
- ac = 0;
XtAddCallback (form_, XmNhelpCallback,&confirm_shell_c:: helpCB, (XtPointer) this);
XtAddCallback (form_, XmNcancelCallback,&confirm_shell_c:: cancelCB, (XtPointer) this);
XtAddCallback (form_, XmNokCallback,&confirm_shell_c:: okCB, (XtPointer) this);
diff --git a/view/src/libui/uidepend.cc b/view/src/libui/uidepend.cc
index dec4d78..fb4c0a5 100644
--- a/view/src/libui/uidepend.cc
+++ b/view/src/libui/uidepend.cc
@@ -93,7 +93,6 @@ void depend_shell_c::create (Widget parent, char *widget_name)
XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
XtSetArg(al[ac], XmNrightOffset, 4); ac++;
XtSetValues ( button_close,al, ac );
- ac = 0;
XmScrolledWindowSetAreas(scrolledWin1, scrollbar1, scrollbar2, hyper_ );
XtAddCallback (button_close, XmNactivateCallback,&depend_shell_c:: closeCB, (XtPointer) this);
diff --git a/view/src/libui/uiedit.cc b/view/src/libui/uiedit.cc
index 9604ff5..c972465 100644
--- a/view/src/libui/uiedit.cc
+++ b/view/src/libui/uiedit.cc
@@ -125,7 +125,6 @@ void edit_form_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = form1;
XtManageChildren(children, ac);
- ac = 0;
}
void edit_form_c::searchCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uiedit_label.cc b/view/src/libui/uiedit_label.cc
index 434ab60..a5e6dcc 100644
--- a/view/src/libui/uiedit_label.cc
+++ b/view/src/libui/uiedit_label.cc
@@ -124,7 +124,6 @@ void edit_label_form_c::create (Widget parent, char *widget_name)
children[ac++] = tools_;
children[ac++] = form1;
XtManageChildren(children, ac);
- ac = 0;
}
void edit_label_form_c::changedCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uiedit_limit.cc b/view/src/libui/uiedit_limit.cc
index 85be999..d8e8ffb 100644
--- a/view/src/libui/uiedit_limit.cc
+++ b/view/src/libui/uiedit_limit.cc
@@ -110,7 +110,6 @@ void edit_limit_form_c::create (Widget parent, char *widget_name)
children[ac++] = tools_;
children[ac++] = rowcol2;
XtManageChildren(children, ac);
- ac = 0;
}
void edit_limit_form_c::browseCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uiedit_meter.cc b/view/src/libui/uiedit_meter.cc
index 73175c1..864a776 100644
--- a/view/src/libui/uiedit_meter.cc
+++ b/view/src/libui/uiedit_meter.cc
@@ -100,7 +100,6 @@ void edit_meter_form_c::create (Widget parent, char *widget_name)
children[ac++] = rowcol1;
children[ac++] = tools_;
XtManageChildren(children, ac);
- ac = 0;
}
void edit_meter_form_c::changedCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uiedit_repeat.cc b/view/src/libui/uiedit_repeat.cc
index 775ef1a..5c22c42 100644
--- a/view/src/libui/uiedit_repeat.cc
+++ b/view/src/libui/uiedit_repeat.cc
@@ -109,7 +109,6 @@ void edit_repeat_form_c::create (Widget parent, char *widget_name)
children[ac++] = tools_;
children[ac++] = form1;
XtManageChildren(children, ac);
- ac = 0;
}
void edit_repeat_form_c::applyCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uiedit_variable.cc b/view/src/libui/uiedit_variable.cc
index 1941488..5ae6187 100644
--- a/view/src/libui/uiedit_variable.cc
+++ b/view/src/libui/uiedit_variable.cc
@@ -93,7 +93,6 @@ void edit_variable_form_c::create (Widget parent, char *widget_name)
children[ac++] = tools_;
children[ac++] = form1;
XtManageChildren(children, ac);
- ac = 0;
}
void edit_variable_form_c::changedCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uifind.cc b/view/src/libui/uifind.cc
index 28bfa6c..0fd808d 100644
--- a/view/src/libui/uifind.cc
+++ b/view/src/libui/uifind.cc
@@ -200,7 +200,6 @@ void find_shell_c::create (Widget parent, char *widget_name)
children[ac++] = menuBar1;
children[ac++] = drawingArea1;
XtManageChildren(children, ac);
- ac = 0;
}
void find_shell_c::entryCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uifonts.cc b/view/src/libui/uifonts.cc
index 74f0783..ae67897 100644
--- a/view/src/libui/uifonts.cc
+++ b/view/src/libui/uifonts.cc
@@ -404,7 +404,6 @@ void fonts_form_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = form_;
XtManageChildren(children, ac);
- ac = 0;
}
void fonts_form_c::useCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uifsb.cc b/view/src/libui/uifsb.cc
index a1b5812..35db7e8 100644
--- a/view/src/libui/uifsb.cc
+++ b/view/src/libui/uifsb.cc
@@ -57,7 +57,6 @@ void fsb_shell_c::create (Widget parent, char *widget_name)
children[ac++] = button42; /* 20150819 */
children[ac++] = button44; /* 20150819 */
XtManageChildren(children, ac);
- ac = 0;
}
void fsb_shell_c::helpCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uihistory.cc b/view/src/libui/uihistory.cc
index 3ca68e0..7b143e9 100644
--- a/view/src/libui/uihistory.cc
+++ b/view/src/libui/uihistory.cc
@@ -49,7 +49,6 @@ void history_form_c::create (Widget parent, char *widget_name)
XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
XtSetValues ( scrolledList9,al, ac );
- ac = 0;
XtAddCallback (list_, XmNbrowseSelectionCallback,&history_form_c:: browseCB, (XtPointer) this);
XtManageChild(list_);
}
diff --git a/view/src/libui/uiinfo.cc b/view/src/libui/uiinfo.cc
index 70b5e92..d64b471 100644
--- a/view/src/libui/uiinfo.cc
+++ b/view/src/libui/uiinfo.cc
@@ -70,7 +70,6 @@ void info_form_c::create (Widget parent, char *widget_name)
XmScrolledWindowSetAreas(scrolledWin1, scrollbar25, scrollbar26, text_ );
children[ac++] = scrolledWin1;
XtManageChildren(children, ac);
- ac = 0;
}
void info_form_c::hyperCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uijob.cc b/view/src/libui/uijob.cc
index aa547f1..5e1d97b 100644
--- a/view/src/libui/uijob.cc
+++ b/view/src/libui/uijob.cc
@@ -103,7 +103,6 @@ void job_form_c::create (Widget parent, char *widget_name)
children[ac++] = name_;
children[ac++] = tools_;
XtManageChildren(children, ac);
- ac = 0;
}
void job_form_c::searchCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uijobcheck.cc b/view/src/libui/uijobcheck.cc
index b30e80a..2538f8e 100644
--- a/view/src/libui/uijobcheck.cc
+++ b/view/src/libui/uijobcheck.cc
@@ -89,7 +89,6 @@ void jobcheck_form_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = tools_;
XtManageChildren(children, ac);
- ac = 0;
}
void jobcheck_form_c::refreshCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uijobstatus.cc b/view/src/libui/uijobstatus.cc
index caf947d..da96425 100644
--- a/view/src/libui/uijobstatus.cc
+++ b/view/src/libui/uijobstatus.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #1 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -127,7 +127,6 @@ void jobstatus_form_c::create (Widget parent, char *widget_name)
children[ac++] = name_;
children[ac++] = tools_;
XtManageChildren(children, ac);
- ac = 0;
}
void jobstatus_form_c::searchCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uijobstatus.h b/view/src/libui/uijobstatus.h
index d2e93b8..43d902c 100644
--- a/view/src/libui/uijobstatus.h
+++ b/view/src/libui/uijobstatus.h
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libui/uimail.cc b/view/src/libui/uimail.cc
index a6014e1..38af502 100644
--- a/view/src/libui/uimail.cc
+++ b/view/src/libui/uimail.cc
@@ -119,7 +119,6 @@ void mail_shell_c::create (Widget parent, char *widget_name)
children[ac++] = menuBar1;
children[ac++] = input_;
XtManageChildren(children, ac);
- ac = 0;
}
void mail_shell_c::closeCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uimanual.cc b/view/src/libui/uimanual.cc
index 4eda464..8b2529a 100644
--- a/view/src/libui/uimanual.cc
+++ b/view/src/libui/uimanual.cc
@@ -85,7 +85,6 @@ void manual_form_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = tools_;
XtManageChildren(children, ac);
- ac = 0;
}
void manual_form_c::externalCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uimenu.cc b/view/src/libui/uimenu.cc
index 8a22a4a..30e0a1f 100644
--- a/view/src/libui/uimenu.cc
+++ b/view/src/libui/uimenu.cc
@@ -188,7 +188,6 @@ void menu_form_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = form_;
XtManageChildren(children, ac);
- ac = 0;
}
void menu_form_c::updateCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uimessages.cc b/view/src/libui/uimessages.cc
index 2730c73..e4eb8c1 100644
--- a/view/src/libui/uimessages.cc
+++ b/view/src/libui/uimessages.cc
@@ -86,7 +86,6 @@ void messages_form_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = tools_;
XtManageChildren(children, ac);
- ac = 0;
}
void messages_form_c::searchCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uinode_alert.cc b/view/src/libui/uinode_alert.cc
index d763160..eacd833 100644
--- a/view/src/libui/uinode_alert.cc
+++ b/view/src/libui/uinode_alert.cc
@@ -135,7 +135,6 @@ void node_alert_shell_c::create (Widget parent, char *widget_name)
children[ac++] = drawingArea1;
children[ac++] = label_;
XtManageChildren(children, ac);
- ac = 0;
}
void node_alert_shell_c::collectCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uioption.cc b/view/src/libui/uioption.cc
index 1751c02..ce1b3ad 100644
--- a/view/src/libui/uioption.cc
+++ b/view/src/libui/uioption.cc
@@ -223,7 +223,6 @@ void option_form_c::create (Widget parent, char *widget_name)
jobfile_length = XmCreateTextField ( form21, "jobfile_length", al, ac );
XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
label21 = XmCreateLabel ( form21, "lines", al, ac );
- ac = 0;
/* */
ac = 0;
@@ -1005,7 +1004,6 @@ void option_form_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = form_;
XtManageChildren(children, ac);
- ac = 0;
}
void option_form_c::useCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uioutput.cc b/view/src/libui/uioutput.cc
index 021a98d..c3cb64d 100644
--- a/view/src/libui/uioutput.cc
+++ b/view/src/libui/uioutput.cc
@@ -137,7 +137,6 @@ void output_form_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = form1;
XtManageChildren(children, ac);
- ac = 0;
}
void output_form_c::searchCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uipanel.cc b/view/src/libui/uipanel.cc
index 3cf1d24..8f1906b 100644
--- a/view/src/libui/uipanel.cc
+++ b/view/src/libui/uipanel.cc
@@ -146,7 +146,6 @@ void panel_top_c::create (Widget parent, char *widget_name)
children[ac++] = tab_;
children[ac++] = menubar_;
XtManageChildren(children, ac);
- ac = 0;
XtManageChild ( form_);
}
diff --git a/view/src/libui/uipasswd.cc b/view/src/libui/uipasswd.cc
index 4ec03dc..e937cdd 100644
--- a/view/src/libui/uipasswd.cc
+++ b/view/src/libui/uipasswd.cc
@@ -106,7 +106,6 @@ void passwd_shell_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = form1;
XtManageChildren(children, ac);
- ac = 0;
}
void passwd_shell_c::modifyCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uipref.cc b/view/src/libui/uipref.cc
index 5b69e71..7449a57 100644
--- a/view/src/libui/uipref.cc
+++ b/view/src/libui/uipref.cc
@@ -88,7 +88,6 @@ void pref_shell_c::create (Widget parent, char *widget_name)
children[ac++] = tab_;
children[ac++] = menuBar1;
XtManageChildren(children, ac);
- ac = 0;
}
void pref_shell_c::mapCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uiscript.cc b/view/src/libui/uiscript.cc
index ee29d6e..15981d8 100644
--- a/view/src/libui/uiscript.cc
+++ b/view/src/libui/uiscript.cc
@@ -109,7 +109,6 @@ void script_form_c::create (Widget parent, char *widget_name)
children[ac++] = name_;
children[ac++] = tools_;
XtManageChildren(children, ac);
- ac = 0;
}
void script_form_c::externalCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uisearch.cc b/view/src/libui/uisearch.cc
index 80996a9..820a30e 100644
--- a/view/src/libui/uisearch.cc
+++ b/view/src/libui/uisearch.cc
@@ -495,7 +495,6 @@ void search_shell_c::create (Widget parent, char *widget_name)
children[ac++] = drawingArea2;
children[ac++] = form1;
XtManageChildren(children, ac);
- ac = 0;
}
void search_shell_c::specialCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uiservers.cc b/view/src/libui/uiservers.cc
index 9901c7c..727cc65 100644
--- a/view/src/libui/uiservers.cc
+++ b/view/src/libui/uiservers.cc
@@ -184,7 +184,6 @@ void servers_form_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = form_;
XtManageChildren(children, ac);
- ac = 0;
}
void servers_form_c::updateCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uisuites.cc b/view/src/libui/uisuites.cc
index 43cf501..857468c 100644
--- a/view/src/libui/uisuites.cc
+++ b/view/src/libui/uisuites.cc
@@ -104,7 +104,6 @@ void suites_form_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = form2;
XtManageChildren(children, ac);
- ac = 0;
}
void suites_form_c::tellCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uitimetable.cc b/view/src/libui/uitimetable.cc
index 1f94e5a..6898d14 100644
--- a/view/src/libui/uitimetable.cc
+++ b/view/src/libui/uitimetable.cc
@@ -292,7 +292,6 @@ void timetable_form_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = form2;
XtManageChildren(children, ac);
- ac = 0;
}
void timetable_form_c::optionsCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uitip.cc b/view/src/libui/uitip.cc
index f2858d8..9683149 100644
--- a/view/src/libui/uitip.cc
+++ b/view/src/libui/uitip.cc
@@ -65,7 +65,6 @@ void tip_shell_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = label_;
XtManageChildren(children, ac);
- ac = 0;
XtManageChild ( form_);
}
diff --git a/view/src/libui/uitop.cc b/view/src/libui/uitop.cc
index 216214c..65005f9 100644
--- a/view/src/libui/uitop.cc
+++ b/view/src/libui/uitop.cc
@@ -934,7 +934,6 @@ XtSetArg(al[ac],XmNmnemonic,'m'); ac++; /* mnemonic */
children[ac++] = menu_bar;
children[ac++] = separator5;
XtManageChildren(children, ac);
- ac = 0;
XtManageChild ( form_);
}
diff --git a/view/src/libui/uitree.cc b/view/src/libui/uitree.cc
index 744428e..06e83ea 100644
--- a/view/src/libui/uitree.cc
+++ b/view/src/libui/uitree.cc
@@ -103,7 +103,6 @@ void tree_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = why_label_;
XtManageChildren(children, ac);
- ac = 0;
}
void tree_c::hideOtherCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uitriggers.cc b/view/src/libui/uitriggers.cc
index 56da2d2..275f5d0 100644
--- a/view/src/libui/uitriggers.cc
+++ b/view/src/libui/uitriggers.cc
@@ -129,7 +129,6 @@ void triggers_menu_c::create (Widget parent, char *widget_name)
ac = 0;
XtSetArg(al[ac], XmNsubMenuId, menu2); ac++;
XtSetValues ( triggers_menu, al, ac );
- ac = 0;
}
void triggers_menu_c::reachCB( Widget widget, XtPointer client_data, XtPointer call_data )
@@ -269,7 +268,6 @@ void triggers_form_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = form2;
XtManageChildren(children, ac);
- ac = 0;
}
void triggers_form_c::linkCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uiuser.cc b/view/src/libui/uiuser.cc
index 0c14724..5513966 100644
--- a/view/src/libui/uiuser.cc
+++ b/view/src/libui/uiuser.cc
@@ -90,7 +90,6 @@ void user_form_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = form_;
XtManageChildren(children, ac);
- ac = 0;
}
void user_form_c::useCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uiusers.cc b/view/src/libui/uiusers.cc
index d0cb222..cc6609a 100644
--- a/view/src/libui/uiusers.cc
+++ b/view/src/libui/uiusers.cc
@@ -65,7 +65,6 @@ void users_form_c::create (Widget parent, char *widget_name)
XtManageChild(list_);
children[ac++] = form2;
XtManageChildren(children, ac);
- ac = 0;
}
void users_form_c::sendCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uivariables.cc b/view/src/libui/uivariables.cc
index 9c90972..0ee0556 100644
--- a/view/src/libui/uivariables.cc
+++ b/view/src/libui/uivariables.cc
@@ -175,7 +175,6 @@ void variables_form_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = form1;
XtManageChildren(children, ac);
- ac = 0;
}
void variables_form_c::valueCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uiwhy.cc b/view/src/libui/uiwhy.cc
index eb1693f..c7b3076 100644
--- a/view/src/libui/uiwhy.cc
+++ b/view/src/libui/uiwhy.cc
@@ -70,7 +70,6 @@ void why_form_c::create (Widget parent, char *widget_name)
XmScrolledWindowSetAreas(scrolledWin1, scrollbar25, scrollbar26, text_ );
children[ac++] = scrolledWin1;
XtManageChildren(children, ac);
- ac = 0;
}
void why_form_c::hyperCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libui/uizombies.cc b/view/src/libui/uizombies.cc
index 5d3eea8..171c14b 100644
--- a/view/src/libui/uizombies.cc
+++ b/view/src/libui/uizombies.cc
@@ -102,7 +102,6 @@ void zombies_form_c::create (Widget parent, char *widget_name)
ac = 0;
children[ac++] = form2;
XtManageChildren(children, ac);
- ac = 0;
}
void zombies_form_c::browseCB( Widget widget, XtPointer client_data, XtPointer call_data )
diff --git a/view/src/libxec/xec_Cursor.c b/view/src/libxec/xec_Cursor.c
index 0bb3194..44b305d 100644
--- a/view/src/libxec/xec_Cursor.c
+++ b/view/src/libxec/xec_Cursor.c
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libxec/xec_Label.c b/view/src/libxec/xec_Label.c
index fcdb765..ecc812e 100644
--- a/view/src/libxec/xec_Label.c
+++ b/view/src/libxec/xec_Label.c
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libxec/xec_List.c b/view/src/libxec/xec_List.c
index c8ac6b2..7f4bd12 100644
--- a/view/src/libxec/xec_List.c
+++ b/view/src/libxec/xec_List.c
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #2 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libxec/xec_Regexp.c b/view/src/libxec/xec_Regexp.c
index 7ae794b..54b3a17 100644
--- a/view/src/libxec/xec_Regexp.c
+++ b/view/src/libxec/xec_Regexp.c
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libxec/xec_Strings.c b/view/src/libxec/xec_Strings.c
index 4817918..667948e 100644
--- a/view/src/libxec/xec_Strings.c
+++ b/view/src/libxec/xec_Strings.c
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libxec/xec_Text.c b/view/src/libxec/xec_Text.c
index 6bc3ced..95ec72e 100644
--- a/view/src/libxec/xec_Text.c
+++ b/view/src/libxec/xec_Text.c
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #2 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libxec/xec_Toggle.c b/view/src/libxec/xec_Toggle.c
index 86f1c1d..10aaca9 100644
--- a/view/src/libxec/xec_Toggle.c
+++ b/view/src/libxec/xec_Toggle.c
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/libxec/xec_Widget.c b/view/src/libxec/xec_Widget.c
index 8af1279..26bd416 100644
--- a/view/src/libxec/xec_Widget.c
+++ b/view/src/libxec/xec_Widget.c
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #1 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/limit_node.cc b/view/src/limit_node.cc
index 1ff5e4b..4cb8681 100644
--- a/view/src/limit_node.cc
+++ b/view/src/limit_node.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #15 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/limit_node.h b/view/src/limit_node.h
index 7a2c30e..2330143 100644
--- a/view/src/limit_node.h
+++ b/view/src/limit_node.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/line.c b/view/src/line.c
index 17f2309..4b1f38b 100644
--- a/view/src/line.c
+++ b/view/src/line.c
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/lister.cc b/view/src/lister.cc
index d9c1850..b58b90a 100644
--- a/view/src/lister.cc
+++ b/view/src/lister.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/lister.h b/view/src/lister.h
index 77357fd..52f8cb0 100644
--- a/view/src/lister.h
+++ b/view/src/lister.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/log_event.cc b/view/src/log_event.cc
index 85e3404..a595549 100644
--- a/view/src/log_event.cc
+++ b/view/src/log_event.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #10 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -27,9 +27,15 @@ const int boxSize = 3;
namespace status {
const char *status_name[10]= {
- (char*)"unknown", (char*)"suspended", (char*)"complete", (char*)"queued",
- (char*)"submitted", (char*)"active", (char*)"aborted", (char*)"shutdown",
- (char*)"halted" , NULL };
+ (char*)"unknown",
+ (char*)"suspended",
+ (char*)"complete",
+ (char*)"queued",
+ (char*)"submitted",
+ (char*)"active",
+ (char*)"aborted",
+ (char*)"shutdown",
+ (char*)"halted", NULL };
}
static event_sorter* sorter = 0;
@@ -184,7 +190,7 @@ void log_event::size(Widget,XRectangle* r)
void log_event::draw(Widget w,XRectangle* r)
{
- GC gc = gui::blackGC();
+ GC gc = gui::blackGC();
XFillRectangles(XtDisplay(w), XtWindow(w), gc, r, 1); // was comment
XDrawLine(XtDisplay(w), XtWindow(w), gc,
r->x,
@@ -210,8 +216,9 @@ class status_event : public log_event {
virtual int status() { return status_; }
public:
- status_event(node* n,const DateTime& time,int status):
- log_event(n,time), status_(status) {}
+ status_event(node* n,const DateTime& time,int status)
+ : log_event(n,time), status_(status)
+ {}
};
char* status_event::text(char* buf)
@@ -241,12 +248,12 @@ char* event_event::text(char* buf)
//===========================================
void event_event::draw(Widget w,XRectangle* r)
{
- if(set_)
- XFillRectangles(XtDisplay(w),XtWindow(w),
- gui::blueGC(),r,1);
- else
- XDrawRectangles(XtDisplay(w),XtWindow(w),
- gui::blueGC(),r,1);
+ if(set_)
+ XFillRectangles(XtDisplay(w),XtWindow(w),
+ gui::blueGC(),r,1);
+ else
+ XDrawRectangles(XtDisplay(w),XtWindow(w),
+ gui::blueGC(),r,1);
}
//===========================================
diff --git a/view/src/log_event.h b/view/src/log_event.h
index f92c122..be6799f 100644
--- a/view/src/log_event.h
+++ b/view/src/log_event.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/log_file.h b/view/src/log_file.h
index 3dc31da..5f92006 100644
--- a/view/src/log_file.h
+++ b/view/src/log_file.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/logsvr.cc b/view/src/logsvr.cc
index 2daed8d..0a5d4c9 100644
--- a/view/src/logsvr.cc
+++ b/view/src/logsvr.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/logsvr.h b/view/src/logsvr.h
index 406c4b5..d276175 100644
--- a/view/src/logsvr.h
+++ b/view/src/logsvr.h
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/mail.cc b/view/src/mail.cc
index a3f3b12..dbf6616 100644
--- a/view/src/mail.cc
+++ b/view/src/mail.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/mail.h b/view/src/mail.h
index 04599ff..1d8b995 100644
--- a/view/src/mail.h
+++ b/view/src/mail.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/manual.cc b/view/src/manual.cc
index 9c5d0c7..d743dcb 100644
--- a/view/src/manual.cc
+++ b/view/src/manual.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/manual.h b/view/src/manual.h
index 2aace95..a46b0ad 100644
--- a/view/src/manual.h
+++ b/view/src/manual.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/menu2c.sh b/view/src/menu2c.sh
index 845807a..2c2249c 100644
--- a/view/src/menu2c.sh
+++ b/view/src/menu2c.sh
@@ -1,6 +1,6 @@
#!/bin/ksh
-## Copyright 2009-2016 ECMWF.
+## Copyright 2009-2017 ECMWF.
## This software is licensed under the terms of the Apache Licence version 2.0
## which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
## In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/menu_prefs.cc b/view/src/menu_prefs.cc
index 8cf059f..4f7326f 100644
--- a/view/src/menu_prefs.cc
+++ b/view/src/menu_prefs.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/menu_prefs.h b/view/src/menu_prefs.h
index cab89ca..5afa743 100644
--- a/view/src/menu_prefs.h
+++ b/view/src/menu_prefs.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/menul.c b/view/src/menul.c
index 48e39c9..2f99efd 100644
--- a/view/src/menul.c
+++ b/view/src/menul.c
@@ -1174,7 +1174,7 @@ char *yytext_ptr;
/* Author : */
/* Revision : $Revision: #11 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/menul.l b/view/src/menul.l
index 8496450..b0d2c40 100644
--- a/view/src/menul.l
+++ b/view/src/menul.l
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #11 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/menus.cc b/view/src/menus.cc
index f073f27..a8242e4 100644
--- a/view/src/menus.cc
+++ b/view/src/menus.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #17 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/menus.h b/view/src/menus.h
index 79a1d59..25341fb 100644
--- a/view/src/menus.h
+++ b/view/src/menus.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/menuy.y b/view/src/menuy.y
index 45438e0..384f852 100644
--- a/view/src/menuy.y
+++ b/view/src/menuy.y
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #17 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/messages.cc b/view/src/messages.cc
index 34da635..37eb28d 100644
--- a/view/src/messages.cc
+++ b/view/src/messages.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/messages.h b/view/src/messages.h
index e7e7a5b..5b7e83a 100644
--- a/view/src/messages.h
+++ b/view/src/messages.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/meter_node.cc b/view/src/meter_node.cc
index 5cabf0f..e26ce16 100644
--- a/view/src/meter_node.cc
+++ b/view/src/meter_node.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #22 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/meter_node.h b/view/src/meter_node.h
index f5a4cf9..d07792c 100644
--- a/view/src/meter_node.h
+++ b/view/src/meter_node.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/node.cc b/view/src/node.cc
index 319bdd4..8f9aeda 100644
--- a/view/src/node.cc
+++ b/view/src/node.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #49 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/node.h b/view/src/node.h
index eb45cec..fd6b3bf 100644
--- a/view/src/node.h
+++ b/view/src/node.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #33 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/node_alert.cc b/view/src/node_alert.cc
index 7cf821f..c0d4096 100644
--- a/view/src/node_alert.cc
+++ b/view/src/node_alert.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/node_alert.h b/view/src/node_alert.h
index c7120a8..58a9365 100644
--- a/view/src/node_alert.h
+++ b/view/src/node_alert.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/node_editor.cc b/view/src/node_editor.cc
index 98d72dd..3550473 100644
--- a/view/src/node_editor.cc
+++ b/view/src/node_editor.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/node_editor.h b/view/src/node_editor.h
index 1042677..fcdabe9 100644
--- a/view/src/node_editor.h
+++ b/view/src/node_editor.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/node_list.cc b/view/src/node_list.cc
index 20233e2..79e464c 100644
--- a/view/src/node_list.cc
+++ b/view/src/node_list.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/node_list.h b/view/src/node_list.h
index 6fdc410..5aefbde 100644
--- a/view/src/node_list.h
+++ b/view/src/node_list.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/node_lister.h b/view/src/node_lister.h
index 5d3a577..0dd14a1 100644
--- a/view/src/node_lister.h
+++ b/view/src/node_lister.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/node_window.cc b/view/src/node_window.cc
index b85fdf7..c40f556 100644
--- a/view/src/node_window.cc
+++ b/view/src/node_window.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/node_window.h b/view/src/node_window.h
index ad25574..d9b1d5d 100644
--- a/view/src/node_window.h
+++ b/view/src/node_window.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/not_enqueued.cc b/view/src/not_enqueued.cc
index dbab254..7c1e1ea 100644
--- a/view/src/not_enqueued.cc
+++ b/view/src/not_enqueued.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/not_enqueued.h b/view/src/not_enqueued.h
index 881efec..63d4bda 100644
--- a/view/src/not_enqueued.h
+++ b/view/src/not_enqueued.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/observable.cc b/view/src/observable.cc
index 4daf853..e292e0d 100644
--- a/view/src/observable.cc
+++ b/view/src/observable.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/observable.h b/view/src/observable.h
index bdb0393..836a1b2 100644
--- a/view/src/observable.h
+++ b/view/src/observable.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/observer.cc b/view/src/observer.cc
index 43ea1cf..6f9c444 100644
--- a/view/src/observer.cc
+++ b/view/src/observer.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/observer.h b/view/src/observer.h
index 8980464..afb9dda 100644
--- a/view/src/observer.h
+++ b/view/src/observer.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/opener.h b/view/src/opener.h
index 2984bea..80082ad 100644
--- a/view/src/opener.h
+++ b/view/src/opener.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/option.cc b/view/src/option.cc
index f2f16c3..ea994f4 100644
--- a/view/src/option.cc
+++ b/view/src/option.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/option.h b/view/src/option.h
index 9ca2cc9..282d57a 100644
--- a/view/src/option.h
+++ b/view/src/option.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/option_panel.cc b/view/src/option_panel.cc
index a1cf117..5dc1487 100644
--- a/view/src/option_panel.cc
+++ b/view/src/option_panel.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/option_panel.h b/view/src/option_panel.h
index 9829533..6dfe817 100644
--- a/view/src/option_panel.h
+++ b/view/src/option_panel.h
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/output.cc b/view/src/output.cc
index c3f97e7..36da782 100644
--- a/view/src/output.cc
+++ b/view/src/output.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #18 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/output.h b/view/src/output.h
index f041211..fcbf48f 100644
--- a/view/src/output.h
+++ b/view/src/output.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/panel.cc b/view/src/panel.cc
index 340f2f3..60f1b7f 100644
--- a/view/src/panel.cc
+++ b/view/src/panel.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/panel.h b/view/src/panel.h
index 2b140cb..abb3549 100644
--- a/view/src/panel.h
+++ b/view/src/panel.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/panel_factories.h b/view/src/panel_factories.h
index d53b0c6..2e9bbd4 100644
--- a/view/src/panel_factories.h
+++ b/view/src/panel_factories.h
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/panel_window.cc b/view/src/panel_window.cc
index 508fd55..4e000f1 100644
--- a/view/src/panel_window.cc
+++ b/view/src/panel_window.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/panel_window.h b/view/src/panel_window.h
index 8f240ca..2630b9a 100644
--- a/view/src/panel_window.h
+++ b/view/src/panel_window.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/parser.cc b/view/src/parser.cc
index d4f0484..8f085a5 100644
--- a/view/src/parser.cc
+++ b/view/src/parser.cc
@@ -35,7 +35,7 @@ inline const char* gettxt(const char* a,const char* b) { return b; }
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/parser.h b/view/src/parser.h
index fabe619..dafc4ac 100644
--- a/view/src/parser.h
+++ b/view/src/parser.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/passwrd.cc b/view/src/passwrd.cc
index 72a9f91..9eb6e8b 100644
--- a/view/src/passwrd.cc
+++ b/view/src/passwrd.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/passwrd.h b/view/src/passwrd.h
index 028776f..70a23e9 100644
--- a/view/src/passwrd.h
+++ b/view/src/passwrd.h
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/persist.cc b/view/src/persist.cc
index 519fabe..15c8955 100644
--- a/view/src/persist.cc
+++ b/view/src/persist.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/persist.h b/view/src/persist.h
index daafc59..b6d71ab 100644
--- a/view/src/persist.h
+++ b/view/src/persist.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/pixmap.cc b/view/src/pixmap.cc
index 620b92a..59f84df 100644
--- a/view/src/pixmap.cc
+++ b/view/src/pixmap.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/pixmap.h b/view/src/pixmap.h
index 5b5c025..2ca1421 100644
--- a/view/src/pixmap.h
+++ b/view/src/pixmap.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/pref_editor.cc b/view/src/pref_editor.cc
index b401d13..87db3f5 100644
--- a/view/src/pref_editor.cc
+++ b/view/src/pref_editor.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/pref_editor.h b/view/src/pref_editor.h
index c09d2aa..4931f99 100644
--- a/view/src/pref_editor.h
+++ b/view/src/pref_editor.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/pref_window.cc b/view/src/pref_window.cc
index fe6863e..95adf73 100644
--- a/view/src/pref_window.cc
+++ b/view/src/pref_window.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/pref_window.h b/view/src/pref_window.h
index fd3eba3..c83fd3b 100644
--- a/view/src/pref_window.h
+++ b/view/src/pref_window.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/prefs.cc b/view/src/prefs.cc
index e4a81c1..3cc0ade 100644
--- a/view/src/prefs.cc
+++ b/view/src/prefs.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/prefs.h b/view/src/prefs.h
index 22f30cc..4ce65ce 100644
--- a/view/src/prefs.h
+++ b/view/src/prefs.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/re.h b/view/src/re.h
index 422ff6b..82c8208 100644
--- a/view/src/re.h
+++ b/view/src/re.h
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/reach.cc b/view/src/reach.cc
index 914e1a8..8fcf802 100644
--- a/view/src/reach.cc
+++ b/view/src/reach.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/reach.h b/view/src/reach.h
index 4c2ed66..8492a70 100644
--- a/view/src/reach.h
+++ b/view/src/reach.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/relation.cc b/view/src/relation.cc
index 9feb005..b59d3c7 100644
--- a/view/src/relation.cc
+++ b/view/src/relation.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/relation.h b/view/src/relation.h
index f2fd4bb..55cdd4a 100644
--- a/view/src/relation.h
+++ b/view/src/relation.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/repeat.h b/view/src/repeat.h
index 81101c2..10a8f35 100644
--- a/view/src/repeat.h
+++ b/view/src/repeat.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #23 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/repeat_node.cc b/view/src/repeat_node.cc
index 91f968d..c471869 100644
--- a/view/src/repeat_node.cc
+++ b/view/src/repeat_node.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #36 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/repeat_node.h b/view/src/repeat_node.h
index 768e89b..1bdc8b9 100644
--- a/view/src/repeat_node.h
+++ b/view/src/repeat_node.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #18 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/resource.cc b/view/src/resource.cc
index 0e824af..78ac124 100644
--- a/view/src/resource.cc
+++ b/view/src/resource.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/resource.h b/view/src/resource.h
index e06b5c5..12f7cb6 100644
--- a/view/src/resource.h
+++ b/view/src/resource.h
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/restart.cc b/view/src/restart.cc
index 022f4a5..460bd15 100644
--- a/view/src/restart.cc
+++ b/view/src/restart.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/restart.h b/view/src/restart.h
index c1edb3a..a61659e 100644
--- a/view/src/restart.h
+++ b/view/src/restart.h
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/result.cc b/view/src/result.cc
index 13c3e5c..f9b14cc 100644
--- a/view/src/result.cc
+++ b/view/src/result.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/result.h b/view/src/result.h
index cdc8815..29c3787 100644
--- a/view/src/result.h
+++ b/view/src/result.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/runnable.cc b/view/src/runnable.cc
index 42e5043..5e2efd5 100644
--- a/view/src/runnable.cc
+++ b/view/src/runnable.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/runnable.h b/view/src/runnable.h
index d885eb4..bba6cb3 100644
--- a/view/src/runnable.h
+++ b/view/src/runnable.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/script_panel.cc b/view/src/script_panel.cc
index d8eebeb..68cfe3f 100644
--- a/view/src/script_panel.cc
+++ b/view/src/script_panel.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/script_panel.h b/view/src/script_panel.h
index 95b1530..123abf1 100644
--- a/view/src/script_panel.h
+++ b/view/src/script_panel.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/scripting.cc b/view/src/scripting.cc
index 8525ea0..2bfbdc8 100644
--- a/view/src/scripting.cc
+++ b/view/src/scripting.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/scripting.h b/view/src/scripting.h
index 2202730..ff8826e 100644
--- a/view/src/scripting.h
+++ b/view/src/scripting.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/search.cc b/view/src/search.cc
index ef60341..1c9ceeb 100644
--- a/view/src/search.cc
+++ b/view/src/search.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/search.h b/view/src/search.h
index f0db39e..f07f18d 100644
--- a/view/src/search.h
+++ b/view/src/search.h
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/searchable.cc b/view/src/searchable.cc
index e603844..a6a8a90 100644
--- a/view/src/searchable.cc
+++ b/view/src/searchable.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/searchable.h b/view/src/searchable.h
index e034280..8ff1ccb 100644
--- a/view/src/searchable.h
+++ b/view/src/searchable.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/selection.cc b/view/src/selection.cc
index c8f1601..1c3739b 100644
--- a/view/src/selection.cc
+++ b/view/src/selection.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/selection.h b/view/src/selection.h
index 18a03b8..e885a4d 100644
--- a/view/src/selection.h
+++ b/view/src/selection.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/server.cc b/view/src/server.cc
index 5ae4810..4616895 100644
--- a/view/src/server.cc
+++ b/view/src/server.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/server.h b/view/src/server.h
index b3180c3..a813f88 100644
--- a/view/src/server.h
+++ b/view/src/server.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/servers_prefs.cc b/view/src/servers_prefs.cc
index c09cd0d..c984fce 100644
--- a/view/src/servers_prefs.cc
+++ b/view/src/servers_prefs.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/servers_prefs.h b/view/src/servers_prefs.h
index 1821c26..a831e52 100644
--- a/view/src/servers_prefs.h
+++ b/view/src/servers_prefs.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/show.cc b/view/src/show.cc
index 6079731..9f8b743 100644
--- a/view/src/show.cc
+++ b/view/src/show.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/show.h b/view/src/show.h
index 3d17c0b..8308a2e 100644
--- a/view/src/show.h
+++ b/view/src/show.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/simple_node.cc b/view/src/simple_node.cc
index 27ce6b1..53cb032 100644
--- a/view/src/simple_node.cc
+++ b/view/src/simple_node.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #53 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -598,6 +598,7 @@ public:
virtual void visitEventState(AstEventState*);
virtual void visitNode(AstNode*);
virtual void visitVariable(AstVariable*);
+ virtual void visitFlag(AstFlag*);
private:
std::set<node*>& theSet_;
@@ -630,6 +631,7 @@ void AstCollateXNodesVisitor::visitVariable(AstVariable* astVar)
int type;
node* run;
for (run = xnode->kids(); 0 != run; run = run->next()) {
+ //std::cout << "run->name() " << run->name() << "\n";
if (run->name() == astVar->name()) {
type = run->type();
if (type == NODE_EVENT
@@ -642,6 +644,26 @@ void AstCollateXNodesVisitor::visitVariable(AstVariable* astVar)
}
}
+void AstCollateXNodesVisitor::visitFlag(AstFlag* astVar)
+{
+ Node* referencedNode = astVar->referencedNode();
+ if (referencedNode) {
+ simple_node* xnode = (simple_node*) referencedNode->graphic_ptr();
+ if (0 == xnode) return;
+
+ int type;
+ node* run;
+ for (run = xnode->kids(); 0 != run; run = run->next()) {
+ if (run->name() == astVar->name()) {
+ type = run->type();
+ if (type == NODE_LATE ) {
+ theSet_.insert(run);
+ }
+ }
+ }
+ }
+}
+
void simple_node::triggers(trigger_lister& tlr)
{
if(tlr.self()) {
diff --git a/view/src/simple_node.h b/view/src/simple_node.h
index 6de3fd9..9c647c7 100644
--- a/view/src/simple_node.h
+++ b/view/src/simple_node.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #18 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/singleton.h b/view/src/singleton.h
index a7b0cf8..59791ba 100644
--- a/view/src/singleton.h
+++ b/view/src/singleton.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/str.cc b/view/src/str.cc
index 8bae69c..86c6558 100644
--- a/view/src/str.cc
+++ b/view/src/str.cc
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/str.h b/view/src/str.h
index cc522ee..2ee0c3a 100644
--- a/view/src/str.h
+++ b/view/src/str.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/substitute.cc b/view/src/substitute.cc
index 040a234..1c4246c 100644
--- a/view/src/substitute.cc
+++ b/view/src/substitute.cc
@@ -11,7 +11,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/substitute.h b/view/src/substitute.h
index 129deba..41ca0ea 100644
--- a/view/src/substitute.h
+++ b/view/src/substitute.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/suites_panel.cc b/view/src/suites_panel.cc
index 690f169..e59639c 100644
--- a/view/src/suites_panel.cc
+++ b/view/src/suites_panel.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/suites_panel.h b/view/src/suites_panel.h
index 987a539..f31c25a 100644
--- a/view/src/suites_panel.h
+++ b/view/src/suites_panel.h
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/super_node.cc b/view/src/super_node.cc
index 34f060f..d6a8505 100644
--- a/view/src/super_node.cc
+++ b/view/src/super_node.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/super_node.h b/view/src/super_node.h
index 1e77c6c..269a931 100644
--- a/view/src/super_node.h
+++ b/view/src/super_node.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #12 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/task_node.cc b/view/src/task_node.cc
index 58df68b..0392544 100644
--- a/view/src/task_node.cc
+++ b/view/src/task_node.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #15 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/task_node.h b/view/src/task_node.h
index 5b43c4d..d27b9ab 100644
--- a/view/src/task_node.h
+++ b/view/src/task_node.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/text_layout.cc b/view/src/text_layout.cc
index a9efa47..278da20 100644
--- a/view/src/text_layout.cc
+++ b/view/src/text_layout.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/text_layout.h b/view/src/text_layout.h
index c5b9386..2d76e5c 100644
--- a/view/src/text_layout.h
+++ b/view/src/text_layout.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/text_lister.h b/view/src/text_lister.h
index 411de3f..f1622b6 100644
--- a/view/src/text_lister.h
+++ b/view/src/text_lister.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/text_window.cc b/view/src/text_window.cc
index 7430a71..eddfe44 100644
--- a/view/src/text_window.cc
+++ b/view/src/text_window.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/text_window.h b/view/src/text_window.h
index 732e83d..29c5ced 100644
--- a/view/src/text_window.h
+++ b/view/src/text_window.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/time.cc b/view/src/time.cc
index 81c40dd..1dc9bcc 100644
--- a/view/src/time.cc
+++ b/view/src/time.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #14 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/time_node.h b/view/src/time_node.h
index 332d865..7e1d0dc 100644
--- a/view/src/time_node.h
+++ b/view/src/time_node.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #10 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/timeout.cc b/view/src/timeout.cc
index e46c731..e51e2bd 100644
--- a/view/src/timeout.cc
+++ b/view/src/timeout.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/timeout.h b/view/src/timeout.h
index d36418d..dc1e220 100644
--- a/view/src/timeout.h
+++ b/view/src/timeout.h
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/timetable_panel.cc b/view/src/timetable_panel.cc
index 475ef2d..ad110ea 100644
--- a/view/src/timetable_panel.cc
+++ b/view/src/timetable_panel.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #7 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -125,65 +125,63 @@ public:
virtual bool change_fold() { return false; }
};
-timetable_node::timetable_node(Widget w,timetable_panel& o,log_event* e):
- xnode(e->get_node()), owner_(o), event_(e)
+timetable_node::timetable_node(Widget w,timetable_panel& o,log_event* e)
+ : xnode(e->get_node()), owner_(o), event_(e)
{
- event_->attach();
+ event_->attach();
}
timetable_node::~timetable_node()
{
- event_->detach();
+ event_->detach();
}
//====================================================================
class time_event_node : public timetable_node {
protected:
-
- void draw(Widget w,XRectangle* r) { event_->draw(w,r); }
- void size(Widget w,XRectangle* r) { event_->size(w,r); }
-
+ void draw(Widget w,XRectangle* r) { event_->draw(w,r); }
+ void size(Widget w,XRectangle* r) { event_->size(w,r); }
+
public:
- time_event_node(Widget w,timetable_panel&,log_event*);
- ~time_event_node() {}
+ time_event_node(Widget w,timetable_panel&,log_event*);
+ ~time_event_node() {}
};
-time_event_node::time_event_node(Widget w,timetable_panel& o,log_event* e):
- timetable_node(w,o,e)
+time_event_node::time_event_node(Widget w,timetable_panel& o,log_event* e)
+ : timetable_node(w,o,e)
{
- TimeSetTime(w,getBox(w),e->time());
+ TimeSetTime(w,getBox(w),e->time());
}
//====================================================================
class time_name_node : public timetable_node {
- bool fold_;
- void draw(Widget w,XRectangle* r);
- void size(Widget w,XRectangle* r);
+ bool fold_;
+ void draw(Widget w,XRectangle* r);
+ void size(Widget w,XRectangle* r);
public:
- time_name_node(Widget w,timetable_panel&,log_event*);
- ~time_name_node() {}
- virtual char* text(char* b) {
- strcpy(b,node_->full_name().c_str());return b; }
- virtual bool is_name() { return true; }
- virtual bool change_fold() { fold_ = !fold_; redraw(); return fold_; }
+ time_name_node(Widget w,timetable_panel&,log_event*);
+ ~time_name_node() {}
+ virtual char* text(char* b) {
+ strcpy(b,node_->full_name().c_str());return b; }
+ virtual bool is_name() { return true; }
+ virtual bool change_fold() { fold_ = !fold_; redraw(); return fold_; }
};
-time_name_node::time_name_node(Widget w,timetable_panel& o,log_event* e):
- timetable_node(w,o,e),
- fold_(false)
+time_name_node::time_name_node(Widget w,timetable_panel& o,log_event* e)
+ : timetable_node(w,o,e)
+ , fold_(false)
{
- node_ = e->owner();
- getBox(w);
+ node_ = e->owner();
+ getBox(w);
}
void time_name_node::draw(Widget w,XRectangle* r)
{
xmstring s(node_->full_name().c_str(),fold_?"bold":"normal");
-
- XmFontList f = gui::tinyfont();
- XmStringDraw(XtDisplay(w),XtWindow(w),
+ XmFontList f = gui::tinyfont();
+ XmStringDraw(XtDisplay(w),XtWindow(w),
f,
s,
gui::blackGC(),
@@ -298,7 +296,6 @@ void timetable_panel::next(log_event* n)
t->visibility(true);
nodes_.add(t);
-
}
Boolean timetable_panel::enabled(node& n)
@@ -601,12 +598,10 @@ timetable_node* timetable_panel::main(timetable_node* t)
void timetable_panel::range(timetable_node* z,DateTime& dt1,DateTime& dt2)
{
-
dt1 = dt2 = z->event()->time();
if(z->is_name())
{
-
node *m = z->get_node();
for(int i = 0; i < nodes_.count(); i++)
@@ -617,16 +612,12 @@ void timetable_panel::range(timetable_node* z,DateTime& dt1,DateTime& dt2)
if(t > dt2) dt2 = t;
}
}
-
}
void timetable_panel::raw_click3(XEvent* e,xnode* x)
{
char buf[1024];
-
-
timetable_node* z = (timetable_node*)x;
-
xmstring s("-");
static xmstring cr("\n");
@@ -634,7 +625,6 @@ void timetable_panel::raw_click3(XEvent* e,xnode* x)
XtManageChild(set_to_);
XtManageChild(set_from_);
-
if(z) {
z->text(buf);
diff --git a/view/src/timetable_panel.h b/view/src/timetable_panel.h
index 1609ff2..db15b69 100644
--- a/view/src/timetable_panel.h
+++ b/view/src/timetable_panel.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/tip.cc b/view/src/tip.cc
index 81dbaec..8986ad5 100644
--- a/view/src/tip.cc
+++ b/view/src/tip.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #9 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/tip.h b/view/src/tip.h
index 3deaf0c..bd193e0 100644
--- a/view/src/tip.h
+++ b/view/src/tip.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/tmp_file.cc b/view/src/tmp_file.cc
index 73c3ac6..69026dd 100644
--- a/view/src/tmp_file.cc
+++ b/view/src/tmp_file.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/tmp_file.h b/view/src/tmp_file.h
index b27ed80..1af6b8a 100644
--- a/view/src/tmp_file.h
+++ b/view/src/tmp_file.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/tmpnam.c b/view/src/tmpnam.c
index ea026b1..0084299 100644
--- a/view/src/tmpnam.c
+++ b/view/src/tmpnam.c
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/to_check.h b/view/src/to_check.h
index 8ed81b3..75aca31 100644
--- a/view/src/to_check.h
+++ b/view/src/to_check.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/top.cc b/view/src/top.cc
index 2a438be..b905aac 100644
--- a/view/src/top.cc
+++ b/view/src/top.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #20 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/top.h b/view/src/top.h
index 508a4d0..6fb8ff6 100644
--- a/view/src/top.h
+++ b/view/src/top.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/translator.cc b/view/src/translator.cc
index 9b2c94a..7f635a2 100644
--- a/view/src/translator.cc
+++ b/view/src/translator.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/translator.h b/view/src/translator.h
index ef99722..44b9163 100644
--- a/view/src/translator.h
+++ b/view/src/translator.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/tree.cc b/view/src/tree.cc
index 2610483..71e6293 100644
--- a/view/src/tree.cc
+++ b/view/src/tree.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/tree.h b/view/src/tree.h
index e620252..7bdc36d 100644
--- a/view/src/tree.h
+++ b/view/src/tree.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #8 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/trigger_lister.h b/view/src/trigger_lister.h
index 0e0b3bf..879b51d 100644
--- a/view/src/trigger_lister.h
+++ b/view/src/trigger_lister.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/trigger_node.cc b/view/src/trigger_node.cc
index 2dd6628..b7f084b 100644
--- a/view/src/trigger_node.cc
+++ b/view/src/trigger_node.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #17 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
@@ -67,7 +67,7 @@ void trigger_node::info(std::ostream& f)
{
const AstTop *ast = get();
if (ast) {
- std::string str = ast->expression(true);
+ std::string str = ast->why_expression();
f << str << "\n";
}
}
diff --git a/view/src/trigger_node.h b/view/src/trigger_node.h
index aebb6b7..6f1e51b 100644
--- a/view/src/trigger_node.h
+++ b/view/src/trigger_node.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #13 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/trigger_panel.cc b/view/src/trigger_panel.cc
index bf3a6e0..bc4fe5f 100644
--- a/view/src/trigger_panel.cc
+++ b/view/src/trigger_panel.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/trigger_panel.h b/view/src/trigger_panel.h
index 373ceb9..26490cf 100644
--- a/view/src/trigger_panel.h
+++ b/view/src/trigger_panel.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/url.cc b/view/src/url.cc
index 5dbcd59..b40a3c0 100644
--- a/view/src/url.cc
+++ b/view/src/url.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/url.h b/view/src/url.h
index 16033f2..23eae7c 100644
--- a/view/src/url.h
+++ b/view/src/url.h
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/user_prefs.cc b/view/src/user_prefs.cc
index 6cf50df..5a39265 100644
--- a/view/src/user_prefs.cc
+++ b/view/src/user_prefs.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/user_prefs.h b/view/src/user_prefs.h
index 05cb435..652b6bd 100644
--- a/view/src/user_prefs.h
+++ b/view/src/user_prefs.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/users.cc b/view/src/users.cc
index 9db9917..c552741 100644
--- a/view/src/users.cc
+++ b/view/src/users.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/users.h b/view/src/users.h
index 70ff9c3..348ebaa 100644
--- a/view/src/users.h
+++ b/view/src/users.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/variable_node.cc b/view/src/variable_node.cc
index 599a9f6..1b35566 100644
--- a/view/src/variable_node.cc
+++ b/view/src/variable_node.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #17 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/variable_node.h b/view/src/variable_node.h
index 6ecce29..4743331 100644
--- a/view/src/variable_node.h
+++ b/view/src/variable_node.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #12 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/variables.cc b/view/src/variables.cc
index 37e6f82..775f78c 100644
--- a/view/src/variables.cc
+++ b/view/src/variables.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #19 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/variables.h b/view/src/variables.h
index 74e2bf9..9441637 100644
--- a/view/src/variables.h
+++ b/view/src/variables.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/viewer.cc b/view/src/viewer.cc
index c8c9b39..c22a90f 100644
--- a/view/src/viewer.cc
+++ b/view/src/viewer.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/viewer.h b/view/src/viewer.h
index d679803..fece62d 100644
--- a/view/src/viewer.h
+++ b/view/src/viewer.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/why.cc b/view/src/why.cc
index 5eb575f..f834dfe 100644
--- a/view/src/why.cc
+++ b/view/src/why.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/why.h b/view/src/why.h
index aca79df..5655bda 100644
--- a/view/src/why.h
+++ b/view/src/why.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/window.cc b/view/src/window.cc
index 48214be..83e112b 100644
--- a/view/src/window.cc
+++ b/view/src/window.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/window.h b/view/src/window.h
index 71b6be4..10a8f33 100644
--- a/view/src/window.h
+++ b/view/src/window.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/x.c b/view/src/x.c
index c254be0..4723d79 100644
--- a/view/src/x.c
+++ b/view/src/x.c
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/xcdp.menu b/view/src/xcdp.menu
index bf508f5..8742ae6 100644
--- a/view/src/xcdp.menu
+++ b/view/src/xcdp.menu
@@ -3,7 +3,7 @@
! Author :
! Revision : $Revision: #17 $
!
-! Copyright 2009-2016 ECMWF.
+! Copyright 2009-2017 ECMWF.
! This software is licensed under the terms of the Apache Licence version 2.0
! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
! In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/xcdp.menu.h b/view/src/xcdp.menu.h
index f0bcb33..fdb5d42 100644
--- a/view/src/xcdp.menu.h
+++ b/view/src/xcdp.menu.h
@@ -3,7 +3,7 @@
(char*) " ! Author : ",
(char*) " ! Revision : $Revision: #17 $ ",
(char*) " ! ",
-(char*) " ! Copyright 2009-2016 ECMWF. ",
+(char*) " ! Copyright 2009-2017 ECMWF. ",
(char*) " ! This software is licensed under the terms of the Apache Licence version 2.0 ",
(char*) " ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. ",
(char*) " ! In applying this licence, ECMWF does not waive the privileges and immunities ",
diff --git a/view/src/xdclass.h b/view/src/xdclass.h
index 4d64515..00eea48 100644
--- a/view/src/xdclass.h
+++ b/view/src/xdclass.h
@@ -5,7 +5,7 @@
/* Author : */
/* Revision : $Revision: #4 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/xdxmdialog.cc b/view/src/xdxmdialog.cc
index 8efa339..221c614 100644
--- a/view/src/xdxmdialog.cc
+++ b/view/src/xdxmdialog.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/xdxtclass.cc b/view/src/xdxtclass.cc
index 9eb6f6b..dd7b009 100644
--- a/view/src/xdxtclass.cc
+++ b/view/src/xdxtclass.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/xec.h b/view/src/xec.h
index f7f09ad..8a64996 100644
--- a/view/src/xec.h
+++ b/view/src/xec.h
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/xecp.h b/view/src/xecp.h
index f676e51..5935f49 100644
--- a/view/src/xecp.h
+++ b/view/src/xecp.h
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #3 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/xmstring.cc b/view/src/xmstring.cc
index 561d6c5..c9f35d5 100644
--- a/view/src/xmstring.cc
+++ b/view/src/xmstring.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/xmstring.h b/view/src/xmstring.h
index f73f727..1370327 100644
--- a/view/src/xmstring.h
+++ b/view/src/xmstring.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/xnode.cc b/view/src/xnode.cc
index fb4d63f..3ef58db 100644
--- a/view/src/xnode.cc
+++ b/view/src/xnode.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/xnode.h b/view/src/xnode.h
index e5da6a5..13264ab 100644
--- a/view/src/xnode.h
+++ b/view/src/xnode.h
@@ -5,7 +5,7 @@
// Author :
// Revision : $Revision: #6 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/xresources.h b/view/src/xresources.h
index 8314957..7e7cc06 100644
--- a/view/src/xresources.h
+++ b/view/src/xresources.h
@@ -3,7 +3,7 @@
/* Author : */
/* Revision : $Revision: #18 $ */
/* */
-/* Copyright 2009-2016 ECMWF. */
+/* Copyright 2009-2017 ECMWF. */
/* This software is licensed under the terms of the Apache Licence version 2.0 */
/* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. */
/* In applying this licence, ECMWF does not waive the privileges and immunities */
diff --git a/view/src/zombie.h b/view/src/zombie.h
index dbd14df..a17a963 100644
--- a/view/src/zombie.h
+++ b/view/src/zombie.h
@@ -6,7 +6,7 @@
// Author :
// Revision : $Revision: #3 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/zombies_panel.cc b/view/src/zombies_panel.cc
index 1dbe347..f8629da 100644
--- a/view/src/zombies_panel.cc
+++ b/view/src/zombies_panel.cc
@@ -3,7 +3,7 @@
// Author :
// Revision : $Revision: #11 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/src/zombies_panel.h b/view/src/zombies_panel.h
index 0b1adf8..c2f75b7 100644
--- a/view/src/zombies_panel.h
+++ b/view/src/zombies_panel.h
@@ -14,7 +14,7 @@
// Author :
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/test/TestRunner.cpp b/view/test/TestRunner.cpp
index d25157c..8e73cea 100644
--- a/view/test/TestRunner.cpp
+++ b/view/test/TestRunner.cpp
@@ -4,7 +4,7 @@
// Author : Avi
// Revision : $Revision: #4 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/test/TestView.cpp b/view/test/TestView.cpp
index 3e563ac..2dae854 100644
--- a/view/test/TestView.cpp
+++ b/view/test/TestView.cpp
@@ -3,7 +3,7 @@
// Author : Avi
// Revision : $Revision: #5 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
diff --git a/view/test/ViewTestFixture.hpp b/view/test/ViewTestFixture.hpp
index eff7cf8..532918c 100644
--- a/view/test/ViewTestFixture.hpp
+++ b/view/test/ViewTestFixture.hpp
@@ -5,7 +5,7 @@
// Author : Avi
// Revision : $Revision: #13 $
//
-// Copyright 2009-2016 ECMWF.
+// Copyright 2009-2017 ECMWF.
// This software is licensed under the terms of the Apache Licence version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/ecflow.git
More information about the debian-science-commits
mailing list