Skip to content

Commit b804636

Browse files
committed
fixed #271 - allow plugins to know entity name
WARNING!!!!: This is a breaking change. Make sure you delete the .tmp directory from your data hub project directory. Also, any previously run jobs will no longer render correctly in the Jobs tab.
1 parent da0b70f commit b804636

File tree

12 files changed

+79
-93
lines changed

12 files changed

+79
-93
lines changed

marklogic-data-hub/src/main/java/com/marklogic/hub/FlowManager.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,9 @@ private JobParameters buildJobParameters(Flow flow, int batchSize) {
150150
JobParametersBuilder jpb = new JobParametersBuilder();
151151
jpb.addLong("chunk", Integer.toUnsignedLong(batchSize));
152152
jpb.addString("uid", UUID.randomUUID().toString());
153-
jpb.addString("jobType", flow.getType().toString());
154-
jpb.addString("entityName", flow.getEntityName());
155-
jpb.addString("flowName", flow.getName());
153+
jpb.addString("flowType", flow.getType().toString());
154+
jpb.addString("entity", flow.getEntityName());
155+
jpb.addString("flow", flow.getName());
156156
return jpb.toJobParameters();
157157
}
158158

marklogic-data-hub/src/main/resources/ml-modules/root/com.marklogic.hub/mlcp-flow-transform.xqy

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,25 @@ declare function mlcpFlow:transform(
2323
let $uri := map:get($content, "uri")
2424
return
2525
perf:log('mlcp-flow-transform(' || $uri || ')', function() {
26-
let $paramNodes := xdmp:unquote(map:get($context, 'transform_param'))/node()/*
27-
let $paramMap := map:new()
28-
let $_ := $paramNodes ! map:put($paramMap, fn:local-name(.), ./string())
26+
let $params := map:new((
27+
for $pair in map:get($context, 'transform_param') ! fn:tokenize(., ",")
28+
let $parts := fn:tokenize($pair, "=")
29+
return
30+
map:entry($parts[1], $parts[2])
31+
))
2932

3033
let $flow := flow:get-flow(
31-
map:get($paramMap, 'entity-name'),
32-
map:get($paramMap, 'flow-name'),
33-
map:get($paramMap, 'flow-type'))
34+
map:get($params, 'entity'),
35+
map:get($params, 'flow'),
36+
map:get($params, 'flowType'))
3437

3538
let $_ :=
3639
if ($flow) then ()
3740
else
38-
fn:error(xs:QName("MISSING_FLOW"), "The specified flow " || map:get($paramMap, "flow-name") || " is missing.")
41+
fn:error(xs:QName("MISSING_FLOW"), "The specified flow " || map:get($params, "flow") || " is missing.")
3942

4043
let $envelope := try {
41-
flow:run-plugins($flow, $uri, map:get($content, "value"), $paramMap)
44+
flow:run-plugins($flow, $uri, map:get($content, "value"), $params)
4245
}
4346
catch($ex) {
4447
xdmp:log(xdmp:describe($ex, (), ())),

marklogic-data-hub/src/main/resources/ml-modules/services/flow.xqy

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,12 @@ declare %rapi:transaction-mode("update") function post(
7878
perf:log('/v1/resources/flow:post', function() {
7979
let $flow as element(hub:flow) := $input/hub:flow
8080
let $identifier := map:get($params, "identifier")
81-
let $_ := flow:run-flow($flow, $identifier, map:map())
81+
let $options := map:new((
82+
map:entry("entity", $flow/hub:entity/fn:data()),
83+
map:entry("flow", $flow/hub:name/fn:data()),
84+
map:entry("flowType", $flow/hub:type/fn:data())
85+
))
86+
let $_ := flow:run-flow($flow, $identifier, $options)
8287
return
8388
document { () }
8489
})

marklogic-data-hub/src/main/resources/ml-modules/transforms/run-flow.xqy

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@ declare function runFlow:transform(
2020
) as document-node()
2121
{
2222
perf:log('/transforms/run-flow:transform', function() {
23-
let $entity-name := map:get($params, 'entity-name')
24-
let $flow-name := map:get($params, 'flow-name')
23+
let $entity-name := map:get($params, 'entity')
24+
let $flow-name := map:get($params, 'flow')
25+
let $flow-type := "input"
26+
let $_ := map:put($params, "flowType", $flow-type)
2527

2628
let $uri := map:get($context, 'uri')
27-
let $flow := flow:get-flow($entity-name, $flow-name, "input")
29+
let $flow := flow:get-flow($entity-name, $flow-name, $flow-type)
2830
let $_ :=
2931
if ($flow) then ()
3032
else

marklogic-data-hub/src/test/java/com/marklogic/hub/DataHubInstallTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@ public static void setup() throws IOException {
3030
dataHub.initProject();
3131
dataHub.install(new StatusListener() {
3232
@Override
33-
public void onStatusChange(int percentComplete, String message) {
34-
}
33+
public void onStatusChange(int percentComplete, String message) {}
34+
35+
@Override
36+
public void onError() {}
3537
});
3638
}
3739

@@ -40,8 +42,10 @@ public static void teardown() throws IOException {
4042
dataHub = new DataHub(getHubConfig(projectPath.toString()));
4143
dataHub.uninstall(new StatusListener() {
4244
@Override
43-
public void onStatusChange(int percentComplete, String message) {
44-
}
45+
public void onStatusChange(int percentComplete, String message) {}
46+
47+
@Override
48+
public void onError() {}
4549
});
4650
FileUtils.deleteDirectory(projectPath);
4751
}

marklogic-data-hub/src/test/java/com/marklogic/hub/HubTestBase.java

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,8 @@
1515
*/
1616
package com.marklogic.hub;
1717

18-
import java.io.File;
19-
import java.io.FileInputStream;
20-
import java.io.IOException;
21-
import java.io.InputStream;
22-
import java.util.Properties;
23-
24-
import javax.xml.parsers.DocumentBuilder;
25-
import javax.xml.parsers.DocumentBuilderFactory;
26-
import javax.xml.parsers.ParserConfigurationException;
27-
2818
import com.fasterxml.jackson.databind.JsonNode;
2919
import com.fasterxml.jackson.databind.ObjectMapper;
30-
import org.apache.commons.io.FileUtils;
31-
import org.apache.commons.io.FilenameUtils;
32-
import org.apache.commons.io.IOUtils;
33-
import org.slf4j.Logger;
34-
import org.slf4j.LoggerFactory;
35-
import org.w3c.dom.Document;
36-
import org.xml.sax.SAXException;
37-
3820
import com.marklogic.client.DatabaseClient;
3921
import com.marklogic.client.DatabaseClientFactory;
4022
import com.marklogic.client.DatabaseClientFactory.Authentication;
@@ -44,11 +26,23 @@
4426
import com.marklogic.client.eval.EvalResult;
4527
import com.marklogic.client.eval.EvalResultIterator;
4628
import com.marklogic.client.eval.ServerEvaluationCall;
47-
import com.marklogic.client.io.DOMHandle;
48-
import com.marklogic.client.io.DocumentMetadataHandle;
49-
import com.marklogic.client.io.Format;
50-
import com.marklogic.client.io.InputStreamHandle;
51-
import com.marklogic.client.io.StringHandle;
29+
import com.marklogic.client.io.*;
30+
import org.apache.commons.io.FileUtils;
31+
import org.apache.commons.io.FilenameUtils;
32+
import org.apache.commons.io.IOUtils;
33+
import org.slf4j.Logger;
34+
import org.slf4j.LoggerFactory;
35+
import org.w3c.dom.Document;
36+
import org.xml.sax.SAXException;
37+
38+
import javax.xml.parsers.DocumentBuilder;
39+
import javax.xml.parsers.DocumentBuilderFactory;
40+
import javax.xml.parsers.ParserConfigurationException;
41+
import java.io.File;
42+
import java.io.FileInputStream;
43+
import java.io.IOException;
44+
import java.io.InputStream;
45+
import java.util.Properties;
5246

5347
public class HubTestBase {
5448
static final private Logger logger = LoggerFactory.getLogger(HubTestBase.class);
@@ -173,14 +167,19 @@ protected static void installHub() throws IOException {
173167
@Override
174168
public void onStatusChange(int percentComplete, String message) {
175169
}
170+
171+
@Override
172+
public void onError() {}
176173
});
177174
}
178175

179176
protected static void uninstallHub() throws IOException {
180177
new DataHub(getHubConfig()).uninstall(new StatusListener() {
181178
@Override
182-
public void onStatusChange(int percentComplete, String message) {
183-
}
179+
public void onStatusChange(int percentComplete, String message) {}
180+
181+
@Override
182+
public void onError() {}
184183
});
185184
FileUtils.deleteDirectory(new File(PROJECT_PATH));
186185
}

quick-start/src/main/java/com/marklogic/quickstart/service/FlowManagerService.java

Lines changed: 11 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,12 @@
2525
import org.springframework.context.ConfigurableApplicationContext;
2626
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
2727
import org.springframework.stereotype.Service;
28-
import org.w3c.dom.Document;
29-
import org.w3c.dom.Node;
30-
import org.w3c.dom.NodeList;
31-
import org.xml.sax.SAXException;
3228

33-
import javax.xml.parsers.DocumentBuilder;
34-
import javax.xml.parsers.DocumentBuilderFactory;
3529
import javax.xml.parsers.ParserConfigurationException;
36-
import java.io.*;
37-
import java.nio.charset.StandardCharsets;
30+
import java.io.BufferedWriter;
31+
import java.io.File;
32+
import java.io.FileWriter;
33+
import java.io.IOException;
3834
import java.nio.file.Path;
3935
import java.nio.file.Paths;
4036
import java.util.ArrayList;
@@ -139,43 +135,20 @@ protected ConfigurableApplicationContext buildApplicationContext(JobStatusListen
139135
return ctx;
140136
}
141137

142-
private JobParameters buildJobParameters(JsonNode json) throws ParserConfigurationException, IOException, SAXException {
138+
private JobParameters buildJobParameters(JsonNode json) throws ParserConfigurationException, IOException {
143139
JobParametersBuilder jpb = new JobParametersBuilder();
144140
jpb.addString("mlcpOptions", json.toString());
145141
jpb.addString("uid", UUID.randomUUID().toString());
146142

147143
// convert the transform params into job params to be stored in ML for later reference
148144
JsonNode tp = json.get("transform_param");
149145
if (tp != null) {
150-
String transformParams = tp.textValue();
151-
transformParams = transformParams.replace("\"", "");
152-
logger.info("transformParams: " + transformParams);
153-
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
154-
DocumentBuilder builder = factory.newDocumentBuilder();
155-
ByteArrayInputStream bis = new ByteArrayInputStream(transformParams.getBytes(StandardCharsets.UTF_8));
156-
Document doc = builder.parse(bis);
157-
bis.close();
158-
159-
NodeList nodes = doc.getElementsByTagName("params");
160-
if (nodes.getLength() == 1) {
161-
Node params = nodes.item(0);
162-
NodeList childNodes = params.getChildNodes();
163-
for (int i = 0; i < childNodes.getLength(); i++) {
164-
Node child = childNodes.item(i);
165-
if (child.getNodeType() == Node.ELEMENT_NODE) {
166-
String name = child.getNodeName();
167-
switch (name) {
168-
case "entity-name":
169-
jpb.addString("entityName", child.getTextContent());
170-
break;
171-
case "flow-name":
172-
jpb.addString("flowName", child.getTextContent());
173-
break;
174-
case "flow-type":
175-
jpb.addString("flowType", child.getTextContent());
176-
}
177-
}
178-
}
146+
String transformParams = tp.textValue().replace("\"", "");
147+
String[] pairs = transformParams.split(",");
148+
149+
for (String pair : pairs) {
150+
String[] tokens = pair.split("=");
151+
jpb.addString(tokens[0], tokens[1]);
179152
}
180153
}
181154
return jpb.toJobParameters();

quick-start/src/main/ui/app/jobs/job.model.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ export class Job {
22
uid: string;
33
jobId: string;
44
jobName: string;
5-
jobType: string;
5+
flowType: string;
66
startTime: string;
77
endTime: string;
88
lastUpdated: string;
99
status: string;
1010

11-
entityName: string;
12-
flowName: string;
11+
entity: string;
12+
flow: string;
1313
jobOutput: string;
1414
mlcpOptions: string;
1515
}

quick-start/src/main/ui/app/jobs/jobs.tpl.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ <h1>Jobs</h1>
1919
<tr *ngFor="let job of jobs" [ngClass]="{'error' : job.status === 'FAILED' }">
2020
<td><i class="mdi" [ngClass]="getIconClass(job.jobName)"></i> {{job.jobName}}</td>
2121
<td>{{job.jobId}}</td>
22-
<td>{{job.entityName}}</td>
23-
<td>{{job.flowName}}</td>
22+
<td>{{job.entity}}</td>
23+
<td>{{job.flow}}</td>
2424
<td>{{job.status}}</td>
2525
<td>{{job.startTime | amTimeAgo}}</td>
2626
<td><span *ngIf="job.endTime">{{getDuration(job)}} seconds</span></td>

quick-start/src/main/ui/app/mlcp-ui/mlcp-ui.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,16 @@ <h3 (click)="toggleSection(group.category)"><i class="fa fa-caret-right" [ngClas
2323
tooltipPlacement="right"
2424
*ngIf="setting.type === 'boolean'"
2525
[ngModel]="setting.value"
26-
(change)="updateSetting(setting, $event.checked)">
26+
(change)="updateSetting(setting, $event)">
2727
{{setting.label}}
2828
</mdl-switch>
2929
<mdl-textfield floating-label type="text"
3030
[tooltip]="setting.description"
3131
tooltipPlacement="innerRight"
32-
[placeholder]="setting.label"
32+
[label]="setting.label"
3333
name="{{setting.field}}" *ngIf="isText(setting.type)"
3434
[ngModel]="setting.value"
35-
(change)="updateSetting(setting, $event.target.value)"
35+
(input)="updateSetting(setting, $event.target.value)"
3636
[disabled]="setting.readOnly"></mdl-textfield>
3737
<app-custom-select
3838
[id]="setting.field"

0 commit comments

Comments
 (0)