|
1 | 1 | package com.marklogic.client.ext.qconsole.impl; |
2 | 2 |
|
3 | | -/** |
4 | | - * This scripts are defined as strings so that it's easy to reuse this in an environment like Gradle without |
5 | | - * having to read files from the classpath. |
6 | | - */ |
7 | | -public class QconsoleScripts { |
| 3 | +import java.io.BufferedReader; |
| 4 | +import java.io.InputStream; |
| 5 | +import java.io.InputStreamReader; |
| 6 | +import java.nio.charset.StandardCharsets; |
| 7 | +import java.util.stream.Collectors; |
8 | 8 |
|
9 | | - /** |
10 | | - * This relies on internal APIs in the qconsole-model function that have changed between MarkLogic 8 and 9. |
11 | | - * Specifically, qconsole-model:default-content-source() in ML8 was removed and qconsole-model:default-database() |
12 | | - * can be used instead. |
13 | | - */ |
14 | | - public static final String IMPORT = "xquery version \"1.0-ml\";\n" + |
15 | | - "\n" + |
16 | | - "declare namespace qconsole=\"http://marklogic.com/appservices/qconsole\";\n" + |
17 | | - "\n" + |
18 | | - "import module namespace amped-qconsole = \"http://marklogic.com/appservices/qconsole/util-amped\" at \"/MarkLogic/appservices/qconsole/qconsole-amped.xqy\";\n" + |
19 | | - "import module namespace idecl = \"http://marklogic.com/appservices/qconsole/decl\" at \"/MarkLogic/appservices/qconsole/qconsole-decl.xqy\";\n" + |
20 | | - "import module namespace qconsole-model = \"http://marklogic.com/appservices/qconsole/model\" at \"/MarkLogic/appservices/qconsole/qconsole-model.xqy\";\n" + |
21 | | - "\n" + |
22 | | - "declare namespace eval = \"xdmp:eval\";\n" + |
23 | | - "\n" + |
24 | | - "declare variable $exported-workspace as node() external;\n" + |
25 | | - "declare variable $user as xs:string external;\n" + |
26 | | - "\n" + |
27 | | - "declare function local:qconsole-eval(\n" + |
28 | | - " $xquery as xs:string,\n" + |
29 | | - " $vars as item()*,\n" + |
30 | | - " $options as element(eval:options)?\n" + |
31 | | - ") as item()*\n" + |
32 | | - "{ xdmp:log(text{(\"local:qconsole-eval\", xdmp:quote($vars))}),\n" + |
33 | | - " xdmp:security-assert(\"http://marklogic.com/xdmp/privileges/qconsole\", \"execute\"),\n" + |
34 | | - " xdmp:eval($xquery, $vars, <options xmlns=\"xdmp:eval\">\n" + |
35 | | - " <database>{xdmp:database(\"App-Services\")}</database>\n" + |
36 | | - " </options>)\n" + |
37 | | - "};\n" + |
38 | | - "\n" + |
39 | | - "declare function local:import-workspace(\n" + |
40 | | - " $workspace as element(),\n" + |
41 | | - " $user as xs:string \n" + |
42 | | - ") as xs:string*\n" + |
43 | | - "{\n" + |
44 | | - " let $eval-query :=\n" + |
45 | | - " 'declare namespace qconsole = \"http://marklogic.com/appservices/qconsole\";\n" + |
46 | | - " import module namespace qconsole-model=\"http://marklogic.com/appservices/qconsole/model\"\n" + |
47 | | - " at \"/MarkLogic/appservices/qconsole/qconsole-model.xqy\";\n" + |
48 | | - " import module namespace amped-qconsole = \"http://marklogic.com/appservices/qconsole/util-amped\"\n" + |
49 | | - " at \"/MarkLogic/appservices/qconsole/qconsole-amped.xqy\";\n" + |
50 | | - " declare variable $xquery-query-template as xs:string external;\n" + |
51 | | - " declare variable $workspace as element(export) external;\n" + |
52 | | - " declare variable $user as xs:string external;\n" + |
53 | | - " let $_ := xdmp:log(text{(\"user\", $user)})\n" + |
54 | | - " let $wsid := xdmp:random()\n" + |
55 | | - " let $imported-wsname := string($workspace/workspace/@name)\n" + |
56 | | - " let $existing-wsnames := amped-qconsole:qconsole-get-user-workspaces(())/qconsole:name/string()\n" + |
57 | | - " let $wsname :=\n" + |
58 | | - " if( $imported-wsname = $existing-wsnames )\n" + |
59 | | - " then qconsole-model:generate-workspace-name(())\n" + |
60 | | - " else $imported-wsname\n" + |
61 | | - " let $queries := $workspace/workspace/query\n" + |
62 | | - " let $userid := xdmp:user($user)\n" + |
63 | | - " let $_ := xdmp:log(text{(\"userid\", $userid)})\n" + |
64 | | - " let $ws := <qconsole:workspace>\n" + |
65 | | - " <qconsole:id>{$wsid}</qconsole:id>\n" + |
66 | | - " <qconsole:name>{$wsname}</qconsole:name>\n" + |
67 | | - " <qconsole:security>\n" + |
68 | | - " <qconsole:userid>{$userid}</qconsole:userid>\n" + |
69 | | - " </qconsole:security>\n" + |
70 | | - " <qconsole:active>true</qconsole:active>\n" + |
71 | | - " <qconsole:queries>\n" + |
72 | | - " {\n" + |
73 | | - " for $q at $i in $queries\n" + |
74 | | - " let $qid := xdmp:random()\n" + |
75 | | - " let $qname := string($q/@name)\n" + |
76 | | - " let $focus := string($q/@focus)\n" + |
77 | | - " let $active := string($q/@active)\n" + |
78 | | - " let $content-source :=\n" + |
79 | | - " if ( exists($q/@content-source) )\n" + |
80 | | - " then string($q/@content-source)\n" + |
81 | | - " else qconsole-model:default-database()\n" + |
82 | | - " let $mode := string($q/@mode)\n" + |
83 | | - " let $query-text := text { $q }\n" + |
84 | | - " let $q-uri := concat(\"/queries/\", $qid, \".txt\")\n" + |
85 | | - " let $save-q := amped-qconsole:qconsole-document-insert($q-uri, $query-text)\n" + |
86 | | - " return\n" + |
87 | | - " <qconsole:query>\n" + |
88 | | - " <qconsole:id>{$qid}</qconsole:id>\n" + |
89 | | - " <qconsole:name>{$qname}</qconsole:name>\n" + |
90 | | - " <qconsole:content-source>{$content-source}</qconsole:content-source>\n" + |
91 | | - " <qconsole:active>{$active}</qconsole:active>\n" + |
92 | | - " <qconsole:focus>{$focus}</qconsole:focus>\n" + |
93 | | - " <qconsole:mode>{$mode}</qconsole:mode>\n" + |
94 | | - " </qconsole:query>\n" + |
95 | | - " }\n" + |
96 | | - " </qconsole:queries>\n" + |
97 | | - " </qconsole:workspace>\n" + |
98 | | - " let $ws-uri := concat(\"/workspaces/\", $wsid, \".xml\")\n" + |
99 | | - " let $save-ws := amped-qconsole:qconsole-document-insert($ws-uri, $ws)\n" + |
100 | | - " let $set-active := qconsole-model:set-only-one-workspace-active($wsid)\n" + |
101 | | - " return $wsid'\n" + |
102 | | - " \n" + |
103 | | - " let $new-wsid := \n" + |
104 | | - " local:qconsole-eval($eval-query, \n" + |
105 | | - " (xs:QName(\"workspace\"), $workspace, \n" + |
106 | | - " xs:QName(\"xquery-query-template\"), $idecl:default-query-text,\n" + |
107 | | - " xs:QName(\"user\"), $user), ())\n" + |
108 | | - " let $ws-uri := concat(\"/workspaces/\", $new-wsid, \".xml\")\n" + |
109 | | - " return $ws-uri\n" + |
110 | | - "};\n" + |
111 | | - "\n" + |
112 | | - "local:import-workspace($exported-workspace/element(), $user)"; |
| 9 | +public class QconsoleScripts { |
113 | 10 |
|
114 | | - public final static String EXPORT = "xquery version \"1.0-ml\";\n" + |
115 | | - "\n" + |
116 | | - "declare namespace qconsole=\"http://marklogic.com/appservices/qconsole\";\n" + |
117 | | - "\n" + |
118 | | - "declare variable $user as xs:string external;\n" + |
119 | | - "declare variable $workspace as xs:string external;\n" + |
120 | | - "\n" + |
121 | | - "declare function local:do-eval($query as xs:string, $vars) {\n" + |
122 | | - " xdmp:eval($query, $vars, \n" + |
123 | | - " <options xmlns=\"xdmp:eval\">\n" + |
124 | | - " <database>{xdmp:database(\"App-Services\")}</database>\n" + |
125 | | - " </options>)\n" + |
126 | | - "};\n" + |
127 | | - "\n" + |
128 | | - "declare function local:get-ws-uri($user as xs:string, $workspace as xs:string) {\n" + |
129 | | - " let $ws-query := 'xquery version \"1.0-ml\";\n" + |
130 | | - " declare namespace qconsole = \"http://marklogic.com/appservices/qconsole\";\n" + |
131 | | - " declare variable $user as xs:string external;\n" + |
132 | | - " declare variable $workspace as xs:string external;\n" + |
133 | | - " cts:uris((), (), cts:and-query((\n" + |
134 | | - " cts:directory-query(\"/workspaces/\"),\n" + |
135 | | - " cts:element-value-query(xs:QName(\"qconsole:userid\"), xs:string(xdmp:user($user))),\n" + |
136 | | - " cts:element-value-query(xs:QName(\"qconsole:name\"), $workspace)\n" + |
137 | | - " ))\n" + |
138 | | - " )'\n" + |
139 | | - " return local:do-eval($ws-query, (xs:QName(\"user\"), $user, xs:QName(\"workspace\"), $workspace))\n" + |
140 | | - "};\n" + |
141 | | - "\n" + |
142 | | - "declare function local:get-workspace($ws-uri as xs:string) {\n" + |
143 | | - " let $query := \"declare variable $ws-uri as xs:string external; fn:doc($ws-uri)\"\n" + |
144 | | - " return local:do-eval($query, (xs:QName(\"ws-uri\"), $ws-uri))\n" + |
145 | | - "};\n" + |
146 | | - "\n" + |
147 | | - "let $user := ($user, xdmp:get-current-user())[1]\n" + |
148 | | - "\n" + |
149 | | - "let $ws-uri := local:get-ws-uri($user, $workspace)\n" + |
150 | | - "let $ws := local:get-workspace($ws-uri)\n" + |
151 | | - "let $queries := \n" + |
152 | | - " for $q in $ws/qconsole:workspace/qconsole:queries/qconsole:query\n" + |
153 | | - " return \n" + |
154 | | - " <query name=\"{string($q/qconsole:name)}\" focus=\"{string($q/qconsole:focus)}\" active=\"{string($q/qconsole:active)}\" mode=\"{string($q/qconsole:mode)}\">\n" + |
155 | | - " {local:do-eval(concat(\"fn:doc('/queries/\", xs:unsignedLong($q/qconsole:id), \".txt')\"), ())}\n" + |
156 | | - " </query>\n" + |
157 | | - "\n" + |
158 | | - "let $export := \n" + |
159 | | - " if ($queries) then (\n" + |
160 | | - " <export>\n" + |
161 | | - " <workspace name=\"{string($ws/qconsole:workspace/qconsole:name)}\">\n" + |
162 | | - " {$queries}\n" + |
163 | | - " </workspace>\n" + |
164 | | - " </export> )\n" + |
165 | | - " else (text{\"No workspace found with the name of \", $workspace, \".\"})\n" + |
166 | | - "\n" + |
167 | | - "return $export"; |
| 11 | + private final static String MODULE_PATH = "com/marklogic/client/ext/qconsole/impl/"; |
| 12 | + public static final String IMPORT; |
| 13 | + public final static String EXPORT; |
| 14 | + static { |
| 15 | + IMPORT = readFile( MODULE_PATH + "import-workspaces.xqy"); |
| 16 | + EXPORT = readFile(MODULE_PATH + "export-workspaces.xqy"); |
| 17 | + } |
168 | 18 |
|
| 19 | + private static String readFile(String fileName){ |
| 20 | + InputStream inputStream = QconsoleScripts.class.getClassLoader().getResourceAsStream(fileName); |
| 21 | + return new BufferedReader( |
| 22 | + new InputStreamReader(inputStream, StandardCharsets.UTF_8)) |
| 23 | + .lines() |
| 24 | + .collect(Collectors.joining("\n")); |
| 25 | + } |
169 | 26 | } |
0 commit comments