Browse Source

Merge branch 'candidate-5.2.4' into candidate-5.4.0

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 10 years ago
parent
commit
a7d9759a73

+ 37 - 10
docs/ECLLanguageReference/ECLR_mods/RecordStructure.xml

@@ -82,7 +82,7 @@
           <emphasis>#OPTION(maxLength,####)</emphasis> to change the default).
           The maximum record size should be set as conservatively as possible,
           and is better set on a per-field basis (see the <emphasis
-          role="bold">Field Modifiers</emphasis>section below).</entry>
+          role="bold">Field Modifiers </emphasis>section below).</entry>
         </row>
 
         <row>
@@ -598,11 +598,11 @@ END;</programlisting>
             XPATH(</emphasis>'<emphasis>tag</emphasis>'<emphasis role="bold">)
             }</emphasis></entry>
 
-            <entry>Specifies the XML <emphasis>tag</emphasis> that contains
-            the data, in a RECORD structure that defines XML data. This
-            overrides the default <emphasis>tag</emphasis> name (the lowercase
-            field <emphasis>identifier</emphasis>). See the <emphasis
-            role="bold">XPATH Support</emphasis> section below for
+            <entry>Specifies the XML or JSON <emphasis>tag</emphasis> that
+            contains the data, in a RECORD structure that defines XML or JSON
+            data. This overrides the default <emphasis>tag</emphasis> name
+            (the lowercase field <emphasis>identifier</emphasis>). See the
+            <emphasis role="bold">XPATH Support</emphasis> section below for
             details.</entry>
           </row>
 
@@ -739,7 +739,7 @@ END;</programlisting>
     multiple times, you must use the ordinal operation (for example,
     /foo[1]/bar) to explicit select the first occurrence.</para>
 
-    <para>For XML DATASET reading and processing results of the
+    <para>For XML or JSON DATASETs reading and processing results of the
     SOAPCALL<indexterm>
         <primary>SOAPCALL</primary>
       </indexterm> function, the following XPATH syntax is specifically
@@ -819,12 +819,12 @@ SET OF STRING Npeople{xpath('Name')};
 SET OF STRING Xpeople{xpath('/Name/@id')};
     //matches: &lt;Name id='Kevin'/&gt;&lt;Name id='Richard'/&gt;</programlisting>
 
-    <para>For writing XML files using OUTPUT, the rules are similar with the
-    following exceptions:</para>
+    <para>For writing XML or JSON files using OUTPUT, the rules are similar
+    with the following exceptions:</para>
 
     <itemizedlist>
       <listitem>
-        <para>For scalar fields, simple tag names and XML attributes are
+        <para>For scalar fields, simple tag names and XML/JSON attributes are
         supported.</para>
       </listitem>
 
@@ -1017,6 +1017,33 @@ OUTPUT(ds,,'~RTTEST::XMLtest2',
      &lt;/RECORDS&gt;
  */</programlisting>
 
+    <para>XPATH can also be used to define a JSON file</para>
+
+    <programlisting>/* a JSON  file called "MyBooks.json" contains this data:
+[
+  {
+    "id" : "978-0641723445",
+    "name" : "The Lightning Thief",
+    "author" : "Rick Riordan"
+  }
+,
+  {
+    "id" : "978-1423103349",
+    "name" : "The Sea of Monsters",
+    "author" : "Rick Riordan"
+  }
+]
+*/
+
+BookRec := RECORD
+  STRING ID {XPATH('id')}; //data from id tag -- renames field to uppercase
+  STRING title {XPATH('name')}; //data from name tag, renaming the field
+  STRING author; //data from author tag, tag name is lowercase and matches field name  
+END;
+
+books := DATASET('~jd::mybooks.json',BookRec,JSON('/'));
+OUTPUT(books);</programlisting>
+
     <para>See Also: <link linkend="DATASET">DATASET</link>, <link
     linkend="DICTIONARY">DICTIONARY</link>, <link
     linkend="INDEX_record_structure">INDEX</link>, <link

+ 122 - 2
docs/ECLLanguageReference/ECLR_mods/Recrd-DATASET.xml

@@ -96,7 +96,7 @@
 
           <entry>One of the following keywords, optionally followed by
           relevant options for that specific type of file: THOR /FLAT, CSV,
-          XML, PIPE. Each of these is discussed in its own section,
+          XML, JSON, PIPE. Each of these is discussed in its own section,
           below.</entry>
         </row>
 
@@ -302,7 +302,7 @@
 
   <para>The first two forms are alternatives to each other and either may be
   used with any of the <emphasis>filetypes</emphasis> described below
-  (<emphasis role="bold">THOR/FLAT, CSV, XML, PIPE</emphasis>).</para>
+  (<emphasis role="bold">THOR/FLAT, CSV, XML, JSON, PIPE</emphasis>).</para>
 
   <para>The third form defines the result of an OUTPUT with the NAMED option
   within the same workunit or the workunit specified by the
@@ -819,6 +819,126 @@ END;
 books := DATASET('MyFile',rform,XML('library/book'));</programlisting>
   </sect2>
 
+  <sect2 id="JSON_Files">
+    <title>JSON Files</title>
+
+    <para><emphasis> attr</emphasis><emphasis role="bold"> :=
+    DATASET(</emphasis><emphasis> file, struct, </emphasis><emphasis
+    role="bold">JSON<indexterm>
+        <primary>JSON</primary>
+      </indexterm>( </emphasis><emphasis>xpath</emphasis><emphasis
+    role="bold"> [, NOROOT<indexterm>
+        <primary>NOROOT</primary>
+      </indexterm> ] ) [,ENCRYPT<indexterm>
+        <primary>ENCRYPT</primary>
+      </indexterm>(</emphasis><emphasis>key</emphasis><emphasis role="bold">)
+    ]);</emphasis></para>
+
+    <informaltable colsep="1" frame="all" rowsep="1">
+      <tgroup cols="2">
+        <colspec align="left" colwidth="122.40pt" />
+
+        <colspec />
+
+        <tbody>
+          <row>
+            <entry><emphasis role="bold">JSON</emphasis></entry>
+
+            <entry>Specifies the <emphasis>file</emphasis> is a JSON
+            file.</entry>
+          </row>
+
+          <row>
+            <entry><emphasis>xpath</emphasis></entry>
+
+            <entry>A string constant containing the full XPATH to the tag that
+            delimits the records in the <emphasis>file</emphasis>.</entry>
+          </row>
+
+          <row>
+            <entry><emphasis role="bold">NOROOT</emphasis></entry>
+
+            <entry>Specifies the <emphasis>file</emphasis> is a JSON file with
+            no root level markup, only a collection of objects.</entry>
+          </row>
+
+          <row>
+            <entry><emphasis role="bold"><emphasis
+            role="bold">ENCRYPT</emphasis></emphasis></entry>
+
+            <entry>Optional. Specifies the <emphasis>file</emphasis> was
+            created by OUTPUT with the ENCRYPT option.</entry>
+          </row>
+
+          <row>
+            <entry><emphasis>key</emphasis></entry>
+
+            <entry>A string constant containing the encryption key used to
+            create the file.</entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </informaltable>
+
+    <para>This form is used to read a JSON file. The
+    <emphasis>xpath</emphasis> parameter defines the path used to locate
+    records within the JSON content using a subset of standard XPATH
+    (<emphasis role="underline">www.w3.org/TR/xpath</emphasis>) syntax (see
+    the <emphasis role="bold">XPATH Support</emphasis> section under the
+    RECORD structure discussion for a description of the supported
+    subset).</para>
+
+    <para>The key to getting individual field values from the JSON lies in the
+    RECORD structure<indexterm>
+        <primary>RECORD structure</primary>
+      </indexterm> field definitions. If the field name exactly matches a
+    lower case JSON tag containing the data, then nothing special is required.
+    Otherwise, <emphasis>{xpath(xpathtag)} </emphasis>appended to the field
+    name (where the <emphasis>xpathtag</emphasis> is a string constant
+    containing standard XPATH syntax) is required to extract the data. An
+    XPATH consisting of empty quotes ('') indicates the field receives the
+    entire record. An absolute XPATH is used to access properties of child
+    elements. Because JSON is case sensitive, and ECL identifiers are case
+    insensitive, xpaths need to be specified if the tag contains any upper
+    case characters.</para>
+
+    <para><emphasis role="bold">NOTE:</emphasis> JSON reading and parsing can
+    consume a large amount of memory, depending on the usage. In particular,
+    if the specified xpath matches a very large amount of data, then a large
+    data structure will be provided to the transform. Therefore, the more you
+    match, the more resources you consume per match. For example, if you have
+    a very large document and you match an element near the root that
+    virtually encompasses the whole thing, then the whole thing will be
+    constructed as a referenceable structure that the ECL can get at.</para>
+
+    <para><emphasis role="bold">Example:</emphasis></para>
+
+    <programlisting>/* a JSON  file called "MyBooks.json" contains this data:
+[
+  {
+    "id" : "978-0641723445",
+    "name" : "The Lightning Thief",
+    "author" : "Rick Riordan"
+  }
+,
+  {
+    "id" : "978-1423103349",
+    "name" : "The Sea of Monsters",
+    "author" : "Rick Riordan"
+  }
+]
+*/
+
+BookRec := RECORD
+  STRING ID {XPATH('id')}; //data from id tag -- renames field to uppercase
+  STRING title {XPATH('name')}; //data from name tag, renaming the field
+  STRING author; //data from author tag -- tag name is lowercase and matches field name  
+END;
+
+books := DATASET('~jd::mybooks.json',BookRec,JSON('/'));
+OUTPUT(books);</programlisting>
+  </sect2>
+
   <sect2 id="PIPE_Files">
     <title>PIPE Files<indexterm>
         <primary>PIPE Files</primary>

+ 2 - 3
ecl/eclcc/eclcc.cpp

@@ -436,11 +436,10 @@ static int doMain(int argc, const char *argv[])
     if (!processor.parseCommandLineOptions(argc, argv))
         return 1;
 
-    if (processor.printKeywordsToXml())
-        return 0;
-
     try
     {
+        if (processor.printKeywordsToXml())
+            return 0;
         if (!processor.processFiles())
             return 2;
     }

+ 3 - 1
ecl/eclcc/reservedwords.cpp

@@ -575,8 +575,10 @@ void printKeywordsToXml()
      buffer.append("</xml>\n");
 
      Owned<IFile> treeFile = createIFile("ECLKeywords.xml");
+     assertex(treeFile);
      Owned<IFileIO> io = treeFile->open(IFOcreaterw);
+     assertex(io);
      Owned<IIOStream> out = createIOStream(io);
-
+     assertex(out);
      out->write(buffer.length(), buffer.str());
 }

+ 38 - 3
esp/src/eclwatch/WUDetailsWidget.js

@@ -54,6 +54,7 @@ define([
     "dijit/form/Button",
     "dijit/form/DropDownButton",
     "dijit/form/ValidationTextBox",
+    "dijit/form/Select",
     "dijit/Toolbar",
     "dijit/ToolbarSeparator",
     "dijit/TooltipDialog",
@@ -114,6 +115,8 @@ define([
             this.zapDescription = registry.byId(this.id + "ZapDescription");
             this.warnHistory = registry.byId(this.id + "WarnHistory");
             this.warnTimings = registry.byId(this.id + "WarnTimings");
+            this.clusters = registry.byId(this.id + "Clusters");
+            this.allowedClusters = registry.byId(this.id + "AllowedClusters");
 
             this.infoGridWidget = registry.byId(this.id + "InfoContainer");
             this.zapDialog = registry.byId(this.id + "ZapDialog");
@@ -141,10 +144,12 @@ define([
             var protectedCheckbox = registry.byId(this.id + "Protected");
             var context = this;
             this.wu.update({
-                Scope: dom.byId(context.id + "Scope").value,
-                Description: dom.byId(context.id + "Description").value,
+                State: dom.byId(this.id + "State").innerHTML,
                 Jobname: dom.byId(context.id + "Jobname").value,
-                Protected: protectedCheckbox.get("value")
+                Description: dom.byId(context.id + "Description").value,
+                Protected: protectedCheckbox.get("value"),
+                Scope: dom.byId(context.id + "Scope").value,
+                ClusterSelection: this.allowedClusters.get("value")
             }, null);
         },
         _onRestore: function (event) {
@@ -236,6 +241,7 @@ define([
                 this.wu.refresh();
             }
             this.infoGridWidget.init(params);
+            this.checkIfClustersAllowed();
         },
 
         initTab: function () {
@@ -320,6 +326,35 @@ define([
             return text;
         },
 
+        checkIfClustersAllowed: function () {
+            var context = this;
+            WsWorkunits.WUInfo({
+                request: {
+                    Wuid: this.wu.Wuid
+                }
+            }).then(function (response) {
+                if (lang.exists("WUInfoResponse.Workunit.AllowedClusters.AllowedCluster", response)) {
+                    var targetData = response.WUInfoResponse.Workunit.AllowedClusters.AllowedCluster;
+                    if (targetData.length >= 1) {
+                        context.allowedClusters.options.push({
+                            label: "&nbsp;",
+                            value: ""
+                        });
+                        for (var i = 0; i < targetData.length; ++i) {
+                            context.allowedClusters.options.push({
+                                label: targetData[i],
+                                value: targetData[i]
+                            });
+                        }
+                        context.allowedClusters.set("value", "")
+                        domClass.add(context.id + "Cluster", "hidden");
+                    } else {
+                        domClass.add(context.id + "AllowedClusters", "hidden");
+                    }
+                }
+            });
+        },
+
         updateInput: function (name, oldValue, newValue) {
             var registryNode = registry.byId(this.id + name);
             if (registryNode) {

+ 48 - 1
esp/src/eclwatch/nls/bs/hpcc.js

@@ -33,6 +33,7 @@
     ArchivedOnly: "Samo Arhiviran",
     ArchivedWarning: "Upozorenje: koristite kratak vremenski period. Ako koristite duži vremenski period, pretraživanje radnih jedinica može trajati duže od dozviljenog vremena za pretraživanje .",
     AutoRefresh: "Osvježi",
+    Back: "Nazad",
     BannerColor: "Boja Reklamnog Bloka",
     BannerMessage: "Poruka za Reklamni Blok",
     BannerScroll: "Kretanje Reklamnog Bloka",
@@ -59,11 +60,14 @@
     Command: "Komanda",
     Comment: "Komentar",
     Completed: "Kompletiran",
+    ComplexityWarning: "Više od praga {threshold} aktivnosti ({activityCount}) - zaustavite prikaz podataka?",
     Component: "Komponenta",
     Compress: "Sabijte",
     Compressed: "Komprimirani",
+    CompressedFileSize: "Komprimirana Veličina Datoteke",
     Configuration: "Konfiguracija",
     ConfirmPassword: "Potvrdite Lozinku",
+    ConfirmRemoval: "Jeste li sigurni da to želite učiniti?",
     Content: "Sadržaj",
     Contents: "Sadržaji",
     ContentType: "Vrsta Sadržaja",
@@ -78,12 +82,14 @@
     Debug: "Otklonite Neispravnosti",
     DEF: "DEF",
     Delete: "Obrišite",
+    Deleted: "Izbrisan",
     DeleteSelectedFiles: "Obrišite Odabrane Datoteke?",
     DeleteSelectedGroups: "Obrišite odabranu(e) grupu(e)?",
     DeleteSelectedPermissions: "Obrišite Odabrane Dozvole Za Pristup",
     DeleteSelectedQueries: "Obrišite Odabrane Zahtjeve?",
     DeleteSelectedUsers: "Obrišite Odabrane Korisnike?",
     DeleteSelectedWorkunits: "Obrišite Odabrane Radne Jedinice?",
+    DeleteSuperfile2: "Izbrišite Super Datoteku",
     DeleteSuperfile: "Obrišite Superdatoteke?",
     DeleteThisPackage: "Obrišite ovaj paket?",
     Delimited: "Razgraničen",
@@ -92,17 +98,20 @@
     DenyRead: "<center>Zabranite<br>Čitanje</center>",
     DenyWrite: "<center>Zabranite<br>Pisanje</center>",
     Depth: "Dubina",
+    DepthTooltip: "'Najveća Dubina Podgrafa",
     Deschedule: "Izbacite Is Reda Za Izvršavanje",
     DescheduleSelectedWorkunits: "Izbacite Odabrane Radne Jedinice Is Reda Za Izvršavanje?",
     Description: "Opis",
     Despray: "Ponovo Objedinite Datoteku",
     Details: "Detalji",
     DFUServerName: "Ime DFU Servera",
+    DFUWorkunit: "DFU RadnaJedinica",
     Directory: "Direktorij",
     DisableScopeScanConfirm: "Da li ste sigurni da želite da onemogućite skaniranje opsega? Promjene će biti prihvaćene poslije restarta DALIja",
     DisableScopeScans: "Onemogućite Skaniranje Opsega",
     DiskUsage: "Iskorištenost Diska",
     Distance: "Razdaljina",
+    DistanceTooltip: "Maksimalna Veličina Podgrafa Za Izabranu Aktivnost",
     Dll: "Dll",
     DOT: "DOT",
     DOTAttributes: "DOT Atributi",
@@ -112,6 +121,7 @@
     Duration: "Trajanje",
     EBCDIC: "EBCDIC",
     ECL: "ECL",
+    ECLWorkunit: "ECL RadnaJedinica",
     Edges: "Ivice",
     Edit: "Editujte",
     EditDOT: "Editujte DOT",
@@ -159,11 +169,16 @@
     Find: "Nađite",
     FindNext: "Nađite Slijedeći",
     FindPrevious: "Nađite Prethodni",
+    Finished: "Završen",
     FirstName: "Ime",
+    FirstNRows: "Prvih N Redova",
     Fixed: "Fiksni",
+    Folder: "Fascikla",
     Format: "Format",
+    Forward: "Naprijed",
     FromDate: "Od Datuma",
     FromSizes: "Od Veličine",
+    FromTime: "Od Vremena",
     FullName: "Ime i Prezime",
     Graph: "Graf",
     Graphs: "Grafikoni",
@@ -206,6 +221,8 @@
     LargestSize: "Najveća veličina",
     LastName: "Prezime",
     LastNDays: "Poslijednjih N Dana",
+    LastNHours: "Posljednjih N Sati",
+    LastNRows: "Posljednjih N Redova",
     LDAPWarning: "<b>Greška LDAP Servica:</b>  'Previše korisnika' - Molimo koristite filter.",
     LegacyForm: "Stari Prevaziđeni Formular",
     LibrariesUsed: "Biblioteke u Korištenju",
@@ -220,6 +237,7 @@
     LoadPackageContentHere: "(Dobavite ovamo sadržaj paketa)",
     LoadPackageFromFile: "Dobavite Paket iz Datoteke",
     Local: "Lokalni",
+    Log: "Dnevnik (Log)",
     LogFile: "Datoteka Aktivnosti",
     LoggedInAs: "Prijavljen kao",
     LogicalFile: "Logička Datoteka",
@@ -228,9 +246,12 @@
     LogicalFilesOnly: "Samo Logičke Datoteke",
     LogicalFileType: "Tip Logičke Datoteke",
     LogicalName: "Ime Logičke Datoteke",
+    Logs: "Dnevnici",
     log_analysis_1: "log_analysis_1*",
     Low: "Nizak",
     ManualCopy: "Pritisnite Ctrl+C",
+    ManualOverviewSelection: "Nophodno Je Odabrati Pregled",
+    ManualTreeSelection: "Nophodno Je Odabrati Drvo",
     Mappings: "Mapiranja",
     Mask: "Maska",
     Max: "Maksimum",
@@ -249,6 +270,7 @@
     MonitorShotLimit: "Nadgledajte Shot Limit",
     MonitorSub: "Nadgledajte Sub",
     Month: "Mjesec",
+    More: "Nastavite",
     MustContainUppercaseAndSymbol: "Mora uključiti veliko slovo i simbol",
     NA: "N/A",
     Name: "Ime",
@@ -304,10 +326,12 @@
     PasswordExpired: "Vaša lozinka je istekla I mora biti promijenjena",
     PasswordExpirePostfix: "dan(a). Želite li je sada promijeniti?",
     PasswordExpirePrefix: "Vaša lozinka će isteći za",
+    PasswordOpenZAP: "Unesite Lozinku Za ZAP (opcionalno)",
     PasswordsDoNotMatch: "Pogrešna Lozinka.",
     Path: "Put",
     PathMask: "Maska za Put",
     Pause: "Pauza",
+    PauseNow: "Zaustavite Odmah",
     PctComplete: "% Kompletiran",
     PercentDone: "Procenat Završen",
     PerformingLayout: "Izvršava Layout...",
@@ -317,6 +341,7 @@
     PlaceholderFirstName: "John",
     PlaceholderLastName: "Smith",
     Playground: "Igralište",
+    Plugins: "Dopune",
     Port: "Port",
     Prefix: "Prefiks",
     PrefixPlaceholder: "filename{:length}, filesize{:[B|L][1-8]}",
@@ -337,13 +362,17 @@
     Quarter: "Četvrtina",
     Queries: "Upiti",
     QueriesNoPackage: "Upiti bez odgovarajućeg paketa",
+    Query: "Upit",
     QueryDetailsfor: "Detalji o Upitu",
+    QueryID: "Identifikator Upita",
     QueryIDPlaceholder: "som?q*ry.1",
+    QueryName: "Ime Upita",
     QueryNamePlaceholder: "My?Su?erQ*ry",
     QuerySet: "Kolekcija Upita",
     Queue: "Red (Queue)",
     Quote: "Citat",
     QuotedTerminator: "Završni Karakter",
+    RawTextPage: "Neobrađen Tekst (Tekuća Stranica)",
     RecordCount: "Broj Rekorda",
     RecordLength: "Dužina Rekorda",
     Records: "Rekordi",
@@ -358,6 +387,8 @@
     RemoteDali: "Daleki Dali",
     RemoteDaliIP: "Daleki&nbsp;Dali&nbsp;IP&nbsp;Adresa",
     Remove: "Uklonite",
+    RemoveSubfiles: "Uklonite Pod-Datoteku",
+    RemoveUser: "Uklonite Korisnika",
     Rename: "Preimenujte",
     RenderedSVG: "Donesene SVG",
     RenderSVG: "Donesite SVG",
@@ -365,6 +396,8 @@
     RequestSchema: "Shema Zahtjeva",
     Reschedule: "Ponovo Stavite Na Raspored",
     Reset: "Resetujte",
+    ResetThisQuery: "Resetujte Tekući Upit",
+    ResetViewToSelection: "Resetujte Odabrani Prikaz",
     Resource: "Resurs",
     Resources: "Resursi",
     ResponseSchema: "Shema Odgovora",
@@ -377,6 +410,8 @@
     Resume: "Nastavite",
     RetainSuperfileStructure: "Zadržite Strukturu Superdatoteke",
     RetypePassword: "Ponovite Lozinku",
+    Reverse: "Idite Unazad",
+    RowPath: "Put Do Rekorda",
     Rows: "Redovi",
     RowTag: "Etiketa Reda",
     RoxieCluster: "Roxie Klaster",
@@ -415,6 +450,7 @@
     Start: "Počnite",
     Started: "Počeo",
     State: "Stanje",
+    Stats: "Statistike",
     Status: "Status",
     Stopped: "Zaustavljen",
     Subgraph: "Pod-Graf",
@@ -423,9 +459,11 @@
     Subtype: "Pod-Vrsta",
     Summary: "Kratak Pregled",
     SummaryMessage: "Sažeta Poruka",
-    SuperFile: "Super Datoteka",
     Superfile: "Super Datoteka",
+    SuperFile: "Super Datoteka",
     SuperFiles: "Super Datoteke",
+    Superfiles: "SuperDatoteke",
+    SuperFilesBelongsTo: "Pripadnik Superdatoteke",
     SuperfilesOnly: "Samo Superdatoteke",
     Suspend: "Suspendujte",
     Suspended: "Suspendovan",
@@ -444,6 +482,7 @@
     TargetWuid: "Cilj/Wuid",
     Terminators: "Terminatori",
     TestPages: "Test Stranice",
+    Text: "Tekst",
     ThorMasterAddress: "Adresa Glavnog Thora",
     ThorNetworkAddress: "Netvork Adresa Thora",
     Time: "Vrijeme",
@@ -470,8 +509,11 @@
     title_HPCCPlatformMain: "ECL Watch - Glavna Stranica",
     title_HPCCPlatformOps: "ECL Watch - Upravljnje",
     title_HPCCPlatformRoxie: "ECL Watch - Roxie",
+    title_HPCCPlatformServicesPlugin: "ECL Monitor - Dopune",
     title_Inputs: "Unosi",
     title_LFDetails: "Detalji o Logičkol Datoteci",
+    title_LibrariesUsed: "Biblioteke U Korištenju",
+    title_Log: "Log Fajl",
     title_LZBrowse: "Zona za Pretovar",
     title_MemberOf: "Član Od",
     title_Members: "Članovi",
@@ -485,15 +527,20 @@
     title_Results: "Rezultati",
     title_SearchResults: "Rezultati Pretraživanja",
     title_SourceFiles: "",
+    title_SourceFiles: "Originalni Fajlovi",
+    title_Topology: "Topologija",
     title_TpThorStatus: "Stanje Thora",
     title_UserPermissions: "Korisničke Dozvile za Pristup",
     title_UserQuery: "Prava Pristupa",
     title_WUDetails: "ECL Detalji o Radnoj Jedinici",
     title_WUQuery: "ECL Radne Jedinice",
+    To: "Prema",
     ToDate: "Do Sada",
     Toenablegraphviews: "Da biste mogli vidjeli grafikone, moraćete instalisati Graph View Control plugin",
     Top: "Vrh",
+    Topology: "Topologija",
     ToSizes: "Do Velićina",
+    TotalClusterTime: "Ukupno Vrijeme Klastera",
     TotalSize: "Totalna Veličina",
     TotalThorTime: "Ukupno Vrijeme Thor-a",
     TransitionGuide: "Vodič",

+ 48 - 1
esp/src/eclwatch/nls/hr/hpcc.js

@@ -33,6 +33,7 @@
     ArchivedOnly: "Samo Arhiviran",
     ArchivedWarning: "Upozorenje: koristite kratak vremenski period. Ako koristite duži vremenski period, pretraživanje radnih jedinica može trajati duže od dozviljenog vremena za pretraživanje .",
     AutoRefresh: "Osvježi",
+    Back: "Natrag",
     BannerColor: "Boja Reklamnog Bloka",
     BannerMessage: "Poruka za Reklamni Blok",
     BannerScroll: "Kretanje Reklamnog Bloka",
@@ -59,11 +60,14 @@
     Command: "Komanda",
     Comment: "Komentar",
     Completed: "Kompletiran",
+    ComplexityWarning: "Više od praga {threshold} aktivnosti ({activityCount}) - prekinite prikaz podataka?",
     Component: "Komponenta",
     Compress: "Sabijte",
     Compressed: "Komprimirani",
+    CompressedFileSize: "Komprimirana Veličina Datoteke",
     Configuration: "Konfiguracija",
     ConfirmPassword: "Potvrdite Lozinku",
+    ConfirmRemoval: "Jeste li sigurni da to želite učiniti?",
     Content: "Sadržaj",
     Contents: "Sadržaji",
     ContentType: "Vrsta Sadržaja",
@@ -78,12 +82,14 @@
     Debug: "Otklonite Neispravnosti",
     DEF: "DEF",
     Delete: "Obrišite",
+    Deleted: "Obrisan",
     DeleteSelectedFiles: "Obrišite Odabrane Datoteke?",
     DeleteSelectedGroups: "Obrišite odabranu(e) grupu(e)?",
     DeleteSelectedPermissions: "Obrišite Odabrane Dozvole Za Pristup",
     DeleteSelectedQueries: "Obrišite Odabrane Zahtjeve?",
     DeleteSelectedUsers: "Obrišite Odabrane Korisnike?",
     DeleteSelectedWorkunits: "Obrišite Odabrane Radne Jedinice?",
+    DeleteSuperfile2: "Obrišite Super Datoteku",
     DeleteSuperfile: "Obrišite Superdatoteke?",
     DeleteThisPackage: "Obrišite ovaj paket?",
     Delimited: "Razgraničen",
@@ -92,17 +98,20 @@
     DenyRead: "<center>Zabranite<br>Čitanje</center>",
     DenyWrite: "<center>Zabranite<br>Pisanje</center>",
     Depth: "Dubina",
+    DepthTooltip: "'Najveća Dubina Podgrafa",
     Deschedule: "Izbacite Is Reda Za Izvršavanje",
     DescheduleSelectedWorkunits: "Izbacite Odabrane Radne Jedinice Is Reda Za Izvršavanje?",
     Description: "Opis",
     Despray: "Ponovo Objedinite Datoteku",
     Details: "Detalji",
     DFUServerName: "Ime DFU Servera",
+    DFUWorkunit: "DFU RadnaJedinica",
     Directory: "Direktorij",
     DisableScopeScanConfirm: "Da li ste sigurni da želite da onemogućite skaniranje opsega? Promjene će biti prihvaćene poslije restarta DALIja",
     DisableScopeScans: "Onemogućite Skaniranje Opsega",
     DiskUsage: "Iskorištenost Diska",
     Distance: "Razdaljina",
+    DistanceTooltip: "Maksimalna Veličina Podgrafa Za Odabranu Aktivnost",
     Dll: "Dll",
     DOT: "DOT",
     DOTAttributes: "DOT Atributi",
@@ -112,6 +121,7 @@
     Duration: "Trajanje",
     EBCDIC: "EBCDIC",
     ECL: "ECL",
+    ECLWorkunit: "ECL RadnaJedinica",
     Edges: "Ivice",
     Edit: "Editujte",
     EditDOT: "Editujte DOT",
@@ -159,11 +169,16 @@
     Find: "Nađite",
     FindNext: "Nađite Slijedeći",
     FindPrevious: "Nađite Prethodni",
+    Finished: "Završen",
     FirstName: "Ime",
+    FirstNRows: "Prvih N Redova",
     Fixed: "Fiksni",
+    Folder: "Fascikla",
     Format: "Format",
+    Forward: "Naprijed",
     FromDate: "Od Datuma",
     FromSizes: "Od Veličine",
+    FromTime: "Od Vremena",
     FullName: "Ime i Prezime",
     Graph: "Graf",
     Graphs: "Grafikoni",
@@ -206,6 +221,8 @@
     LargestSize: "Najveća veličina",
     LastName: "Prezime",
     LastNDays: "Poslijednjih N Dana",
+    LastNHours: "Posljednjih N Sati",
+    LastNRows: "Posljednjih N Redova",
     LDAPWarning: "<b>Greška LDAP Servica:</b>  'Previše korisnika' - Molimo koristite filter.",
     LegacyForm: "Stari Prevaziđeni Formular",
     LibrariesUsed: "Biblioteke u Korištenju",
@@ -220,6 +237,7 @@
     LoadPackageContentHere: "(Dobavite ovamo sadržaj paketa)",
     LoadPackageFromFile: "Dobavite Paket iz Datoteke",
     Local: "Lokalni",
+    Log: "Dnevnik (Log)",
     LogFile: "Datoteka Aktivnosti",
     LoggedInAs: "Prijavljen kao",
     LogicalFile: "Logička Datoteka",
@@ -228,9 +246,12 @@
     LogicalFilesOnly: "Samo Logičke Datoteke",
     LogicalFileType: "Tip Logičke Datoteke",
     LogicalName: "Ime Logičke Datoteke",
+    Logs: "Dnevnici",
     log_analysis_1: "log_analysis_1*",
     Low: "Nizak",
     ManualCopy: "Pritisnite Ctrl+C",
+    ManualOverviewSelection: "Nophodno Je Selektirati Pregled",
+    ManualTreeSelection: "Nophodno Je Selektirati Drvo",
     Mappings: "Mapiranja",
     Mask: "Maska",
     Max: "Maksimum",
@@ -249,6 +270,7 @@
     MonitorShotLimit: "Nadgledajte Shot Limit",
     MonitorSub: "Nadgledajte Sub",
     Month: "Mjesec",
+    More: "Nastavite",
     MustContainUppercaseAndSymbol: "Mora uključiti veliko slovo i simbol",
     NA: "N/A",
     Name: "Ime",
@@ -304,10 +326,12 @@
     PasswordExpired: "Vaša lozinka je istekla I mora biti promijenjena",
     PasswordExpirePostfix: "dan(a). Želite li je sada promijeniti?",
     PasswordExpirePrefix: "Vaša lozinka će isteći za",
+    PasswordOpenZAP: "Unesite Lozinku Za ZAP (neobavezno)",
     PasswordsDoNotMatch: "Pogrešna Lozinka.",
     Path: "Put",
     PathMask: "Maska za Put",
     Pause: "Pauza",
+    PauseNow: "Zaustavite Odmah",
     PctComplete: "% Kompletiran",
     PercentDone: "Procenat Završen",
     PerformingLayout: "Izvršava Layout...",
@@ -317,6 +341,7 @@
     PlaceholderFirstName: "John",
     PlaceholderLastName: "Smith",
     Playground: "Igralište",
+    Plugins: "Dodatci",
     Port: "Port",
     Prefix: "Prefiks",
     PrefixPlaceholder: "filename{:length}, filesize{:[B|L][1-8]}",
@@ -337,13 +362,17 @@
     Quarter: "Četvrtina",
     Queries: "Upiti",
     QueriesNoPackage: "Upiti bez odgovarajućeg paketa",
+    Query: "Upit",
     QueryDetailsfor: "Detalji o Upitu",
+    QueryID: "Identifikator Upita",
     QueryIDPlaceholder: "som?q*ry.1",
+    QueryName: "Naziv Upita",
     QueryNamePlaceholder: "My?Su?erQ*ry",
     QuerySet: "Kolekcija Upita",
     Queue: "Red (Queue)",
     Quote: "Citat",
     QuotedTerminator: "Završni Karakter",
+    RawTextPage: "Neobrađen Tekst (Tekuća Stranica)",
     RecordCount: "Broj Rekorda",
     RecordLength: "Dužina Rekorda",
     Records: "Rekordi",
@@ -358,6 +387,8 @@
     RemoteDali: "Daleki Dali",
     RemoteDaliIP: "Daleki&nbsp;Dali&nbsp;IP&nbsp;Adresa",
     Remove: "Uklonite",
+    RemoveSubfiles: "Uklonite Pod-Datoteku",
+    RemoveUser: "Uklonite Korisnika",
     Rename: "Preimenujte",
     RenderedSVG: "Donesene SVG",
     RenderSVG: "Donesite SVG",
@@ -365,6 +396,8 @@
     RequestSchema: "Shema Zahtjeva",
     Reschedule: "Ponovo Stavite Na Raspored",
     Reset: "Resetujte",
+    ResetThisQuery: "Resetujte Tekući Upit",
+    ResetViewToSelection: "Resetujte Odabrani Prikaz",
     Resource: "Resurs",
     Resources: "Resursi",
     ResponseSchema: "Shema Odgovora",
@@ -377,6 +410,8 @@
     Resume: "Nastavite",
     RetainSuperfileStructure: "Zadržite Strukturu Superdatoteke",
     RetypePassword: "Ponovite Lozinku",
+    Reverse: "Idite Unazad",
+    RowPath: "Put Do Rekorda",
     Rows: "Redovi",
     RowTag: "Etiketa Reda",
     RoxieCluster: "Roxie Klaster",
@@ -415,6 +450,7 @@
     Start: "Počnite",
     Started: "Počeo",
     State: "Stanje",
+    Stats: "Statistike",
     Status: "Status",
     Stopped: "Zaustavljen",
     Subgraph: "Pod-Graf",
@@ -423,9 +459,11 @@
     Subtype: "Pod-Vrsta",
     Summary: "Kratak Pregled",
     SummaryMessage: "Sažeta Poruka",
-    SuperFile: "Super Datoteka",
     Superfile: "Super Datoteka",
+    SuperFile: "Super Datoteka",
     SuperFiles: "Super Datoteke",
+    Superfiles: "SuperDatoteke",
+    SuperFilesBelongsTo: "Pripadnik Superdatoteke",
     SuperfilesOnly: "Samo Superdatoteke",
     Suspend: "Suspendujte",
     Suspended: "Suspendovan",
@@ -444,6 +482,7 @@
     TargetWuid: "Cilj/Wuid",
     Terminators: "Terminatori",
     TestPages: "Test Stranice",
+    Text: "Tekst",
     ThorMasterAddress: "Adresa Glavnog Thora",
     ThorNetworkAddress: "Netvork Adresa Thora",
     Time: "Vrijeme",
@@ -470,8 +509,11 @@
     title_HPCCPlatformMain: "ECL Watch - Glavna Stranica",
     title_HPCCPlatformOps: "ECL Watch - Upravljnje",
     title_HPCCPlatformRoxie: "ECL Watch - Roxie",
+    title_HPCCPlatformServicesPlugin: "ECL Monitor - Dodatci",
     title_Inputs: "Unosi",
     title_LFDetails: "Detalji o Logičkol Datoteci",
+    title_LibrariesUsed: "Biblioteke U Korištenju",
+    title_Log: "Log Fajl",
     title_LZBrowse: "Zona za Pretovar",
     title_MemberOf: "Član Od",
     title_Members: "Članovi",
@@ -485,15 +527,20 @@
     title_Results: "Rezultati",
     title_SearchResults: "Rezultati Pretraživanja",
     title_SourceFiles: "",
+    title_SourceFiles: "Originalni Fajlovi",
+    title_Topology: "Topologija",
     title_TpThorStatus: "Stanje Thora",
     title_UserPermissions: "Korisničke Dozvile za Pristup",
     title_UserQuery: "Prava Pristupa",
     title_WUDetails: "ECL Detalji o Radnoj Jedinici",
     title_WUQuery: "ECL Radne Jedinice",
+    To: "Prema",
     ToDate: "Do Sada",
     Toenablegraphviews: "Da biste mogli vidjeli grafikone, moraćete instalisati Graph View Control plugin",
     Top: "Vrh",
+    Topology: "Topologija",
     ToSizes: "Do Velićina",
+    TotalClusterTime: "Ukupno Vrijeme Klastera",
     TotalSize: "Totalna Veličina",
     TotalThorTime: "Ukupno Vrijeme Thor-a",
     TransitionGuide: "Vodič",

+ 46 - 0
esp/src/eclwatch/nls/sr/hpcc.js

@@ -33,6 +33,7 @@
     ArchivedOnly: "Само Архивиран",
     ArchivedWarning: "Упозорење: користите кратак временски период. Ако користите дужи временски период, претраживање радних јединица може трајати дуже од дозвиљеног времена за претраживање.",
     AutoRefresh: "Освежи",
+    Back: "Назад",
     BannerColor: "Боја Рекламног Блока",
     BannerMessage: "Порука за Рекламни Блок",
     BannerScroll: "Кретање Рекламног Блока",
@@ -60,11 +61,14 @@
     Command: "Команда",
     Comment: "Коментар",
     Completed: "Комплетиран",
+    ComplexityWarning: "Више од прага {threshold} активности ({activityCount}) - прекините приказ података?",
     Component: "Компонента",
     Compress: "Сабијте",
     Compressed: "Компримирани",
+    CompressedFileSize: "Компримирана Величина Датотеке",
     Configuration: "Конфигурација",
     ConfirmPassword: "Потврдите Лозинку",
+    ConfirmRemoval: "Јесте ли сигурни да то желите учинити?",
     Content: "Садржај",
     Contents: "Садржаји",
     ContentType: "Врста Садржаја",
@@ -79,12 +83,14 @@
     Debug: "Отклоните Неисправности",
     DEF: "ДЕФ",
     Delete: "Обришите",
+    Deleted: "Избрисан",
     DeleteSelectedFiles: "Обришите Одабране Датотеке?",
     DeleteSelectedGroups: "Обришите одабрану(е) групу(е)?",
     DeleteSelectedPermissions: "Обришите Одабране Дозволе За Приступ",
     DeleteSelectedQueries: "Обришите Одабране Захтјеве?",
     DeleteSelectedUsers: "Обришите Одабране Кориснике?",
     DeleteSelectedWorkunits: "Обришите Одабране Радне Јединице?",
+    DeleteSuperfile2: "Избришите Супер Датотеку",
     DeleteSuperfile: "Обришите Супердатотеке?",
     DeleteThisPackage: "Обришите Овај Пакет?",
     Delimited: "Разграничен",
@@ -93,17 +99,20 @@
     DenyRead: "<center>Забраните<br>Читање</center>",
     DenyWrite: "<center>Забраните<br>Писање</center>",
     Depth: "Дубина",
+    DepthTooltip: "'Највећа Дубина Подграфа",
     Deschedule: "Избаците Ис Реда За Извршавање",
     DescheduleSelectedWorkunits: "Избаците Одабране Радне Јединице Из Реда За Извршавање?",
     Description: "Опис",
     Despray: "Поново Обjедините Датотеку",
     Details: "Детаљи",
     DFUServerName: "Име ДФУ Сервера",
+    DFUWorkunit: "ДФУ РаднаЈединицa",
     Directory: "Директориј",
     DisableScopeScanConfirm: "Да ли сте сигурни да желите онемогућити сканирање опсега? Промене ће бити прихваћене после рестарта ДАЛИја",
     DisableScopeScans: "Онемогућите Сканирање Опсега",
     DiskUsage: "Искориштеност Диска",
     Distance: "Раздаљина",
+    DistanceTooltip: "Максимална Величина Подграфа За Одабрану Активност",
     Dll: "Длл",
     DOT: "ДОТ",
     DOTAttributes: "ДОТ Атрибути",
@@ -113,6 +122,7 @@
     Duration: "Трајање",
     EBCDIC: "ЕБЦДИK",
     ECL: "ЕЦЛ",
+    ECLWorkunit: "ЕЦЛ РаднаЈединица",
     Edges: "Ивице",
     Edit: "Едитујте",
     EditDOT: "Едитујте ДОТ",
@@ -159,11 +169,16 @@
     Find: "Нађите",
     FindNext: "Нађите Следећи",
     FindPrevious: "Нађите Претходни",
+    Finished: "Завршен",
     FirstName: "Име",
+    FirstNRows: "Првих Н Редова",
     Fixed: "Фиксни",
+    Folder: "Фасцикла",
     Format: "Формат",
+    Forward: "Напред",
     FromDate: "Од Датума",
     FromSizes: "Од Величине",
+    FromTime: "Од Времена",
     FullName: "Име и Презиме",
     Graph: "Граф",
     Graphs: "Графикони",
@@ -206,6 +221,8 @@
     LargestSize: "Највећа величина",
     LastName: "Презиме",
     LastNDays: "Последњих Н Дана",
+    LastNHours: "Последњих Н Сати",
+    LastNRows: "Последњих Н Редова",
     LDAPWarning: "<б>Грешка ЛДАП Сервица:</б>  'Превише корисника' - Молимо користите филтер.",
     LegacyForm: "Стари Превазиђени Формулар",
     LibrariesUsed: "Библиотеке у Кориштењу",
@@ -220,6 +237,7 @@
     LoadPackageContentHere: "(Добавите овамо садржај пакета)",
     LoadPackageFromFile: "Добавите Пакет из Датотеке",
     Local: "Локални",
+    Log: "Дневник (Лог)",
     LogFile: "Датотека Активности",
     LoggedInAs: "Пријављен као",
     LogicalFile: "Логичка Датотека",
@@ -228,9 +246,12 @@
     LogicalFilesOnly: "Само Логичке Датотеке",
     LogicalFileType: "Тип Логичке Датотеке",
     LogicalName: "Име Логичке Датотеке",
+    Logs: "Дневници",
     log_analysis_1: "лог_аналисис_1*",
     Low: "Низак",
     ManualCopy: "Притисните Ctrl+C",
+    ManualOverviewSelection: "Нопходно Је Одабрати Преглед",
+    ManualTreeSelection: "Нопходно Је Одабрати Дрво",
     Mappings: "Мапирања",
     Mask: "Маска",
     Max: "Максимум",
@@ -249,6 +270,7 @@
     MonitorShotLimit: "Надгледајте Шот Лимит",
     MonitorSub: "Надгледајте Суб",
     Month: "Месец",
+    More: "Наставите",
     MustContainUppercaseAndSymbol: "Мораte укључити велико слово и симбол",
     NA: "Н/A",
     Name: "Име",
@@ -304,10 +326,12 @@
     PasswordExpired: "Ваша лозинка је истекла И мора бити промењена",
     PasswordExpirePostfix: "дан(а). Желите ли је сада променити?",
     PasswordExpirePrefix: "Ваша лозинка ће истећи за",
+    PasswordOpenZAP: "Унесите Лозинку За ЗАП (необавезно)",
     PasswordsDoNotMatch: "Погрешна Лозинка.",
     Path: "Пут",
     PathMask: "Маска за Пут",
     Pause: "Пауза",
+    PauseNow: "Зауставите Одмах",
     PctComplete: "% Комплетиран",
     PercentDone: "Проценат Завршен",
     PerformingLayout: "Извршава Лejaут...",
@@ -317,6 +341,7 @@
     PlaceholderFirstName: "Џон",
     PlaceholderLastName: "Смит",
     Playground: "Игралиште",
+    Plugins: "Допуне",
     Port: "Порт",
     Prefix: "Префикс",
     PrefixPlaceholder: "имедатотеке{:дужина}, величинадатотеке{:[B|L][1-8]}",
@@ -337,13 +362,17 @@
     Quarter: "Четвртина",
     Queries: "Упити",
     QueriesNoPackage: "Упити без одговарајућег пакета",
+    Query: "Упит",
     QueryDetailsfor: "Детаљи о Упиту",
+    QueryID: "Идентификатор Упита",
     QueryIDPlaceholder: "som?q*ry.1",
+    QueryName: "Име Упита",
     QueryNamePlaceholder: "My?Su?erQ*ry",
     QuerySet: "Колекција Упита",
     Queue: "Ред (Kjу)",
     Quote: "Цитат",
     QuotedTerminator: "Завршни Карактер",
+    RawTextPage: "Необрађен Текст (Текућа Страница)",
     RecordCount: "Број Рекорда",
     RecordLength: "Дужина Рекорда",
     Records: "Рекорди",
@@ -358,6 +387,8 @@
     RemoteDali: "Далеки Дали",
     RemoteDaliIP: "Далеки&nbsp;Дали&nbsp;ИП&nbsp;Адреса",
     Remove: "Уклоните",
+    RemoveSubfiles: "Уклоните Поддатотеку",
+    RemoveUser: "Уклоните Корисника",
     Rename: "Преименујте",
     RenderedSVG: "Донесене СВГ",
     RenderSVG: "Донесите СВГ",
@@ -365,6 +396,8 @@
     RequestSchema: "Шема Захтева",
     Reschedule: "Поново Ставите На Распоред",
     Reset: "Ресетујте",
+    ResetThisQuery: "Ресетујте Текући Упит",
+    ResetViewToSelection: "Ресетујте Одабрани Вју",
     Resource: "Ресурс",
     Resources: "Ресурси",
     ResponseSchema: "Шема Одговора",
@@ -377,6 +410,8 @@
     Resume: "Наставите",
     RetainSuperfileStructure: "Задржите Структуру Супердатотеке",
     RetypePassword: "Поновите Лозинку",
+    Reverse: "Идите Уназад",
+    RowPath: "Пут До Рекорда",
     Rows: "Редови",
     RowTag: "Етикета Реда",
     RoxieCluster: "Роkcи Кластер",
@@ -415,6 +450,7 @@
     Start: "Почните",
     Started: "Почео",
     State: "Стање",
+    Stats: "Статистике",
     Status: "Статус",
     Stopped: "Заустављен",
     Subgraph: "ПодГраф",
@@ -426,6 +462,8 @@
     SuperFile: "Супер Датотека",
     Superfile: "Супер Датотека",
     SuperFiles: "Супер Датотеке",
+    Superfiles: "СуперДатотеке",
+    SuperFilesBelongsTo: "Припадник Супердатотеке",
     SuperfilesOnly: "Само Супердатотеке",
     Suspend: "Суспендујте",
     Suspended: "Суспендован",
@@ -444,6 +482,7 @@
     TargetWuid: "Циљ/Pjид",
     Terminators: "Терминатори",
     TestPages: "Тест Странице",
+    Text: "Текст",
     ThorMasterAddress: "Адреса Главног Тора",
     ThorNetworkAddress: "Нетворк Адреса Торa",
     Time: "Време",
@@ -470,8 +509,11 @@
     title_HPCCPlatformMain: "ECL Watch - Главна Страница",
     title_HPCCPlatformOps: "ECL Watch - Управљње",
     title_HPCCPlatformRoxie: "ECL Watch - Роkcи",
+    title_HPCCPlatformServicesPlugin: "ЕЦЛ Монитор - Допуне",
     title_Inputs: "Уноси",
     title_LFDetails: "Детаљи о Логичкоj Датотеци",
+    title_LibrariesUsed: "Библиотеке У Кориштењу",
+    title_Log: "Лог Фајл",
     title_LZBrowse: "Зона за Претовар",
     title_MemberOf: "Члан Од",
     title_Members: "Чланови",
@@ -485,15 +527,19 @@
     title_Results: "Резултати",
     title_SearchResults: "Резултати Претраживања",
     title_SourceFiles: "Оригиналне Датотеке",
+    title_Topology: "Топологија",
     title_TpThorStatus: "Стање Тора",
     title_UserPermissions: "Корисничке Дозвиле за Приступ",
     title_UserQuery: "Права Приступа",
     title_WUDetails: "ЕЦЛ Детаљи о Радној Јединици",
     title_WUQuery: "ЕЦЛ Радне Јединице",
+    To: "Према",
     ToDate: "До Сада",
     Toenablegraphviews: "Да бисте могли видети графиконе, мораћете инсталисати Граф Вjу Kонтрол плaгин",
     Top: "Врх",
+    Topology: "Топологија",
     ToSizes: "До Величина",
+    TotalClusterTime: "Укупно Време Кластера",
     TotalSize: "Укупна Величина",
     TotalThorTime: "Укупно Време Тора",
     TransitionGuide: "Водич",

+ 1 - 0
esp/src/eclwatch/templates/WUDetailsWidget.html

@@ -82,6 +82,7 @@
                             <li>
                                 <label class="Prompt" for="${id}Cluster">${i18n.Cluster}:</label>
                                 <div id="${id}Cluster"></div>
+                                <div id="${id}AllowedClusters" data-dojo-type="dijit.form.Select"/></div>
                             </li>
                             <li>
                                 <label class="Prompt" for="${id}TotalClusterTime">${i18n.TotalClusterTime}:</label>

+ 41 - 18
roxie/ccd/ccdserver.cpp

@@ -5321,6 +5321,7 @@ IRoxieServerActivityFactory *createRoxieServerInlineTableActivityFactory(unsigne
 class CRoxieServerWorkUnitReadActivity : public CRoxieServerActivity
 {
     IHThorWorkunitReadArg &helper;
+    CriticalSection readerCrit;
     Owned<IWorkUnitRowReader> wuReader; // MORE - can we use IRoxieInput instead?
 public:
     CRoxieServerWorkUnitReadActivity(const IRoxieServerActivityFactory *_factory, IProbeManager *_probeManager)
@@ -5348,8 +5349,10 @@ public:
 
     virtual void reset() 
     {
-        CriticalBlock b(statecrit);
-        wuReader.clear();
+        {
+            CriticalBlock b(readerCrit);
+            wuReader.clear();
+        }
         CRoxieServerActivity::reset(); 
     };
 
@@ -5357,11 +5360,15 @@ public:
 
     virtual const void *nextInGroup()
     {
-        CriticalBlock b(statecrit);
         ActivityTimer t(totalCycles, timeActivities);
-        if (!wuReader)
-            return NULL;
-        const void *ret = wuReader->nextInGroup();
+        Linked<IWorkUnitRowReader> useReader;
+        {
+            CriticalBlock b(readerCrit);
+            if (!wuReader)
+                return NULL;
+            useReader.set(wuReader);
+        }
+        const void *ret = useReader->nextInGroup();
         if (ret)
             processed++;
         return ret;
@@ -5747,6 +5754,7 @@ protected:
 class CRoxieServerLocalResultReadActivity : public CRoxieServerActivity
 {
     IHThorLocalResultReadArg &helper;
+    CriticalSection iterCrit;
     Owned<IRoxieInput> iter;
     ILocalGraphEx * graph;
     unsigned graphId;
@@ -5775,18 +5783,24 @@ public:
 
     virtual void reset() 
     {
-        CriticalBlock b(statecrit);
-        iter.clear();
+        {
+            CriticalBlock b(iterCrit);
+            iter.clear();
+        }
         CRoxieServerActivity::reset(); 
     };
 
     virtual const void *nextInGroup()
     {
-        CriticalBlock b(statecrit);
         ActivityTimer t(totalCycles, timeActivities);
-        if (!iter)
-            return NULL;
-        const void * next = iter->nextInGroup();
+        Linked<IRoxieInput> useIter;
+        {
+            CriticalBlock b(iterCrit);
+            if (!iter)
+                return NULL;
+            useIter.set(iter);
+        }
+        const void * next = useIter->nextInGroup();
         if (next)
         {
             processed++;
@@ -6076,6 +6090,7 @@ class CRoxieServerGraphLoopResultReadActivity : public CRoxieServerActivity
 {
 protected:
     IHThorGraphLoopResultReadArg &helper;
+    CriticalSection iterCrit;
     Owned<IRoxieInput> iter;
     ILocalGraphEx * graph;
     unsigned graphId;
@@ -6126,18 +6141,26 @@ public:
 
     virtual void reset() 
     {
-        CriticalBlock b(statecrit);
-        if (iter)
-            iter->reset();
-        iter.clear();
+        {
+            CriticalBlock b(iterCrit);
+            if (iter)
+                iter->reset();
+            iter.clear();
+        }
         CRoxieServerActivity::reset(); 
     };
 
     virtual const void *nextInGroup()
     {
-        CriticalBlock b(statecrit);
         ActivityTimer t(totalCycles, timeActivities);
-        const void * next = iter ? iter->nextInGroup() : NULL;
+        Linked<IRoxieInput> useIter;
+        {
+            CriticalBlock b(iterCrit);
+            if (!iter)
+                return NULL;
+            useIter.set(iter);
+        }
+        const void * next = useIter->nextInGroup();
         if (next)
         {
             processed++;

+ 44 - 49
system/jlib/jthread.cpp

@@ -1732,7 +1732,7 @@ class CLinuxPipeProcess: public CInterface, implements IPipeProcess
             }
             return 0;
         }
-        void stop() 
+        void stop()
         {
             stopsem.signal();
             Thread::join();
@@ -1780,6 +1780,27 @@ protected: friend class PipeWriterThread;
     StringArray envVars;
     StringArray envValues;
 
+    void clearUtilityThreads()
+    {
+        Owned<cForkThread> ft;
+        cStdErrorBufferThread *et;
+        {
+            CriticalBlock block(sect); // clear forkthread and stderrbufferthread
+            ft.setown(forkthread.getClear());
+            et = stderrbufferthread;
+            stderrbufferthread = NULL;
+        }
+        if (ft)
+        {
+            ft->join();
+            ft.clear();
+        }
+        if (et)
+        {
+            et->stop();
+            delete et;
+        }
+    }
 public:
     IMPLEMENT_IINTERFACE;
 
@@ -1805,22 +1826,7 @@ public:
         closeInput();
         closeOutput();
         closeError();
-
-        Owned<cForkThread> ft;
-        cStdErrorBufferThread *et;
-        {   CriticalBlock block(sect); // clear forkthread  and stderrbufferthread
-            ft.setown(forkthread.getClear());
-            et = stderrbufferthread;
-            stderrbufferthread = NULL;
-        }
-        if (ft) {
-            ft->join();
-            ft.clear();
-        }
-        if (et) {
-            et->stop();
-            delete et;
-        }
+        clearUtilityThreads();
     }
 
 
@@ -2083,51 +2089,40 @@ public:
             pipeProcess = (HANDLE)-1;
         }
     }
-    
-    
+
     unsigned wait()
     {
-        CriticalBlock block(sect); 
-        if (stderrbufferthread)
-            stderrbufferthread->stop();
-        if (forkthread) {
-            {
-                CriticalUnblock unblock(sect);
-                forkthread->join();
-            }
-            if (pipeProcess != (HANDLE)-1) {
-                if (title.length())
-                    PROGLOG("%s: Pipe: process %d complete %d",title.get(),pipeProcess,retcode);
-                pipeProcess = (HANDLE)-1;
-            }
-            forkthread.clear();
-        }
-        return retcode;
+        bool timedout;
+        return wait(INFINITE, timedout);
     }
 
     unsigned wait(unsigned timeoutms, bool &timedout)
     {
-        CriticalBlock block(sect); 
         timedout = false;
-        if (forkthread) {
+        if (INFINITE != timeoutms)
+        {
+            CriticalBlock block(sect);
+            if (forkthread)
             {
-                CriticalUnblock unblock(sect);
-                if (!forkthread->join(timeoutms)) {
-                    timedout = true;
-                    return retcode;
+                {
+                    CriticalUnblock unblock(sect);
+                    if (!forkthread->join(timeoutms))
+                    {
+                        timedout = true;
+                        return retcode;
+                    }
                 }
-
-            }
-            if (pipeProcess != (HANDLE)-1) {
-                if (title.length())
-                    PROGLOG("%s: Pipe: process %d complete %d",title.get(),pipeProcess,retcode);
-                pipeProcess = (HANDLE)-1;
             }
-            forkthread.clear();
+        }
+        clearUtilityThreads(); // NB: will recall forkthread->join(), but doesn't matter
+        if (pipeProcess != (HANDLE)-1)
+        {
+            if (title.length())
+                PROGLOG("%s: Pipe: process %d complete %d", title.get(), pipeProcess, retcode);
+            pipeProcess = (HANDLE)-1;
         }
         return retcode;
     }
-    
 
     void closeOutput()
     {