Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.

Commit 1c3e5f3

Browse files
authored
Merge pull request #489 from BillFarber/feature/scaffoldSchemasDb
DEVEXP-427: Generate schemas database when running mlNewProject
2 parents 9c09f05 + c1183b6 commit 1c3e5f3

File tree

2 files changed

+204
-87
lines changed

2 files changed

+204
-87
lines changed

src/main/java/com/marklogic/appdeployer/scaffold/ScaffoldGenerator.java

Lines changed: 114 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public class ScaffoldGenerator extends LoggingObject {
3838
protected ObjectMapper objectMapper;
3939
private PrettyPrinter prettyPrinter = new DefaultPrettyPrinter();
4040

41-
public void generateScaffold(String path, AppConfig config) {
41+
public void generateScaffold(String path, AppInputs appInputs) {
4242
if (objectMapper == null) {
4343
objectMapper = ObjectMapperFactory.getObjectMapper();
4444
}
@@ -50,29 +50,58 @@ public void generateScaffold(String path, AppConfig config) {
5050
File modulesDir = getModulesDir(rootDir);
5151
modulesDir.mkdirs();
5252

53-
generateContentDatabaseFile(configDir, config);
54-
generateSecurityFiles(configDir, config);
53+
generateDatabaseFiles(configDir);
54+
if (appInputs.isWithUsersAndRoles()) {
55+
generateSecurityFiles(configDir, appInputs.getAppName());
56+
}
57+
if (appInputs.isWithRestServer()) {
58+
generateRestApiFile(configDir);
59+
generateRestPropertiesFile(modulesDir);
60+
generateSearchOptions(modulesDir, appInputs.getAppName());
61+
}
62+
}
63+
64+
/**
65+
*
66+
* @param path
67+
* @param config
68+
* @deprecated since 4.6.0; use the method using {@code ScaffoldInputs} instead.
69+
*/
70+
@Deprecated
71+
public void generateScaffold(String path, AppConfig config) {
72+
if (objectMapper == null) {
73+
objectMapper = ObjectMapperFactory.getObjectMapper();
74+
}
75+
File rootDir = new File(path);
76+
77+
File configDir = getConfigDir(rootDir);
78+
configDir.mkdirs();
79+
80+
File modulesDir = getModulesDir(rootDir);
81+
modulesDir.mkdirs();
5582

83+
generateDatabaseFiles(configDir);
84+
generateSecurityFiles(configDir, config.getName());
5685
if (!config.isNoRestServer()) {
57-
generateRestApiFile(configDir, config);
58-
generateRestPropertiesFile(modulesDir, config);
59-
generateSearchOptions(modulesDir, config);
86+
generateRestApiFile(configDir);
87+
generateRestPropertiesFile(modulesDir);
88+
generateSearchOptions(modulesDir, config.getName());
6089
}
6190

6291
}
6392

64-
private void generateSearchOptions(File modulesDir, AppConfig config) {
93+
private void generateSearchOptions(File modulesDir, String appName) {
6594
File optionsDir = new File(modulesDir, "options");
6695
optionsDir.mkdirs();
6796
String xml = "<options xmlns='http://marklogic.com/appservices/search'>\n <search-option>unfiltered</search-option>\n <quality-weight>0</quality-weight>\n</options>";
68-
writeFile(xml.getBytes(), new File(optionsDir, config.getName() + "-options.xml"));
97+
writeFile(xml.getBytes(), new File(optionsDir, appName + "-options.xml"));
6998
}
7099

71-
protected void generateRestPropertiesFile(File modulesDir, AppConfig config) {
72-
writeFile(buildRestPropertiesJson(config), new File(modulesDir, "rest-properties.json"));
100+
protected void generateRestPropertiesFile(File modulesDir) {
101+
writeFile(buildRestPropertiesJson(), new File(modulesDir, "rest-properties.json"));
73102
}
74103

75-
protected ObjectNode buildRestPropertiesJson(AppConfig config) {
104+
protected ObjectNode buildRestPropertiesJson() {
76105
ObjectNode node = objectMapper.createObjectNode();
77106
node.put("debug", false);
78107
node.put("validate-queries", true);
@@ -81,70 +110,70 @@ protected ObjectNode buildRestPropertiesJson(AppConfig config) {
81110
return node;
82111
}
83112

84-
protected void generateSecurityFiles(File configDir, AppConfig config) {
113+
protected void generateSecurityFiles(File configDir, String appName) {
85114
File rolesDir = new File(configDir, "security/roles");
86115
rolesDir.mkdirs();
87-
writeFile(buildNobodyRole(config), new File(rolesDir, "1-" + config.getName() + "-nobody-role.json"));
88-
writeFile(buildReaderRole(config), new File(rolesDir, "2-" + config.getName() + "-reader-role.json"));
89-
writeFile(buildWriterRole(config), new File(rolesDir, "3-" + config.getName() + "-writer-role.json"));
90-
writeFile(buildInternalRole(config), new File(rolesDir, "4-" + config.getName() + "-internal-role.json"));
91-
writeFile(buildAdminRole(config), new File(rolesDir, "5-" + config.getName() + "-admin-role.json"));
116+
writeFile(buildNobodyRole(appName), new File(rolesDir, "1-" + appName + "-nobody-role.json"));
117+
writeFile(buildReaderRole(appName), new File(rolesDir, "2-" + appName + "-reader-role.json"));
118+
writeFile(buildWriterRole(appName), new File(rolesDir, "3-" + appName + "-writer-role.json"));
119+
writeFile(buildInternalRole(appName), new File(rolesDir, "4-" + appName + "-internal-role.json"));
120+
writeFile(buildAdminRole(appName), new File(rolesDir, "5-" + appName + "-admin-role.json"));
92121

93122
File usersDir = new File(configDir, "security/users");
94123
usersDir.mkdirs();
95-
writeFile(buildReaderUser(config), new File(usersDir, config.getName() + "-reader-user.json"));
96-
writeFile(buildWriterUser(config), new File(usersDir, config.getName() + "-writer-user.json"));
97-
writeFile(buildAdminUser(config), new File(usersDir, config.getName() + "-admin-user.json"));
124+
writeFile(buildReaderUser(appName), new File(usersDir, appName + "-reader-user.json"));
125+
writeFile(buildWriterUser(appName), new File(usersDir, appName + "-writer-user.json"));
126+
writeFile(buildAdminUser(appName), new File(usersDir, appName + "-admin-user.json"));
98127
}
99128

100-
protected ObjectNode buildNobodyRole(AppConfig config) {
129+
protected ObjectNode buildNobodyRole(String appName) {
101130
ObjectNode node = objectMapper.createObjectNode();
102-
node.put("role-name", config.getName() + "-nobody");
131+
node.put("role-name", appName + "-nobody");
103132
node.put("description", "Unauthenticated user");
104133
node.putArray("role");
105134
return node;
106135
}
107136

108-
protected ObjectNode buildReaderRole(AppConfig config) {
137+
protected ObjectNode buildReaderRole(String appName) {
109138
ObjectNode node = objectMapper.createObjectNode();
110-
node.put("role-name", config.getName() + "-reader");
139+
node.put("role-name", appName + "-reader");
111140
node.put("description", "Can view documents, but not edit");
112141
ArrayNode array = node.putArray("role");
113142
array.add("rest-reader");
114-
array.add(config.getName() + "-nobody");
143+
array.add(appName + "-nobody");
115144
return node;
116145
}
117146

118-
protected ObjectNode buildWriterRole(AppConfig config) {
147+
protected ObjectNode buildWriterRole(String appName) {
119148
ObjectNode node = objectMapper.createObjectNode();
120-
node.put("role-name", config.getName() + "-writer");
149+
node.put("role-name", appName + "-writer");
121150
node.put("description", "Can read and write documents");
122151
ArrayNode array = node.putArray("role");
123152
array.add("rest-writer");
124-
array.add(config.getName() + "-reader");
153+
array.add(appName + "-reader");
125154
array = node.putArray("privilege");
126155
array.add(buildPrivilege("any-uri", "http://marklogic.com/xdmp/privileges/any-uri", "execute"));
127156
array.add(buildPrivilege("unprotected-collections", "http://marklogic.com/xdmp/privileges/unprotected-collections", "execute"));
128157
return node;
129158
}
130159

131-
protected ObjectNode buildInternalRole(AppConfig config) {
160+
protected ObjectNode buildInternalRole(String appName) {
132161
ObjectNode node = objectMapper.createObjectNode();
133-
node.put("role-name", config.getName() + "-internal");
162+
node.put("role-name", appName + "-internal");
134163
node.put("description", "Internal role used for amping");
135164
ArrayNode array = node.putArray("role");
136-
array.add(config.getName() + "-writer");
165+
array.add(appName + "-writer");
137166
return node;
138167
}
139168

140-
protected ObjectNode buildAdminRole(AppConfig config) {
169+
protected ObjectNode buildAdminRole(String appName) {
141170
ObjectNode node = objectMapper.createObjectNode();
142-
node.put("role-name", config.getName() + "-admin");
171+
node.put("role-name", appName + "-admin");
143172
node.put("description", "Non-admin administrator");
144173
ArrayNode array = node.putArray("role");
145174
array.add("rest-admin");
146175
array.add("manage-admin");
147-
array.add(config.getName() + "-writer");
176+
array.add(appName + "-writer");
148177
array = node.putArray("privilege");
149178
array.add(buildPrivilege("any-uri", "http://marklogic.com/xdmp/privileges/any-uri", "execute"));
150179
array.add(buildPrivilege("xdbc:insert-in", "http://marklogic.com/xdmp/privileges/xdbc-insert-in", "execute"));
@@ -160,54 +189,56 @@ protected ObjectNode buildPrivilege(String name, String action, String kind) {
160189
return node;
161190
}
162191

163-
protected ObjectNode buildReaderUser(AppConfig config) {
192+
protected ObjectNode buildReaderUser(String appName) {
164193
ObjectNode node = objectMapper.createObjectNode();
165-
String name = config.getName() + "-reader";
194+
String name = appName + "-reader";
166195
node.put("user-name", name);
167196
node.put("password", name);
168197
ArrayNode roles = node.putArray("role");
169-
roles.add(config.getName() + "-reader");
198+
roles.add(appName + "-reader");
170199
return node;
171200
}
172201

173-
protected ObjectNode buildWriterUser(AppConfig config) {
202+
protected ObjectNode buildWriterUser(String appName) {
174203
ObjectNode node = objectMapper.createObjectNode();
175-
String name = config.getName() + "-writer";
204+
String name = appName + "-writer";
176205
node.put("user-name", name);
177206
node.put("password", name);
178207
ArrayNode roles = node.putArray("role");
179-
roles.add(config.getName() + "-writer");
208+
roles.add(appName + "-writer");
180209
return node;
181210
}
182211

183-
protected ObjectNode buildAdminUser(AppConfig config) {
212+
protected ObjectNode buildAdminUser(String appName) {
184213
ObjectNode node = objectMapper.createObjectNode();
185-
String name = config.getName() + "-admin";
214+
String name = appName + "-admin";
186215
node.put("user-name", name);
187216
node.put("password", name);
188217
ArrayNode roles = node.putArray("role");
189-
roles.add(config.getName() + "-admin");
218+
roles.add(appName + "-admin");
190219
return node;
191220
}
192221

193-
protected void generateRestApiFile(File configDir, AppConfig config) {
194-
writeFile(buildRestApiJson(config).getBytes(), new File(configDir, "rest-api.json"));
222+
protected void generateRestApiFile(File configDir) {
223+
writeFile(buildRestApiJson().getBytes(), new File(configDir, "rest-api.json"));
195224
}
196225

197-
protected String buildRestApiJson(AppConfig config) {
226+
protected String buildRestApiJson() {
198227
return RestApiUtil.buildDefaultRestApiJson();
199228
}
200229

201-
protected void generateContentDatabaseFile(File configDir, AppConfig config) {
230+
protected void generateDatabaseFiles(File configDir) {
202231
File databasesDir = new File(configDir, "databases");
203232
databasesDir.mkdirs();
204233

205-
writeFile(buildContentDatabaseJson(config), new File(databasesDir, "content-database.json"));
234+
writeFile(buildContentDatabaseJson(), new File(databasesDir, "content-database.json"));
235+
writeFile(buildSchemasDatabaseJson(), new File(databasesDir, "schemas-database.json"));
206236
}
207237

208-
protected ObjectNode buildContentDatabaseJson(AppConfig config) {
238+
protected ObjectNode buildContentDatabaseJson() {
209239
ObjectNode node = objectMapper.createObjectNode();
210240
node.put("database-name", "%%DATABASE%%");
241+
node.put("schema-database", "%%SCHEMAS_DATABASE%%");
211242
ArrayNode array = node.putArray("range-element-index");
212243
ObjectNode index = array.addObject();
213244
index.put("scalar-type", "string");
@@ -219,6 +250,12 @@ protected ObjectNode buildContentDatabaseJson(AppConfig config) {
219250
return node;
220251
}
221252

253+
protected ObjectNode buildSchemasDatabaseJson() {
254+
ObjectNode node = objectMapper.createObjectNode();
255+
node.put("database-name", "%%SCHEMAS_DATABASE%%");
256+
return node;
257+
}
258+
222259
protected void writeFile(ObjectNode node, File f) {
223260
try {
224261
byte[] bytes = objectMapper.writer(prettyPrinter).writeValueAsBytes(node);
@@ -258,4 +295,32 @@ public void setObjectMapper(ObjectMapper objectMapper) {
258295
public void setPrettyPrinter(PrettyPrinter prettyPrinter) {
259296
this.prettyPrinter = prettyPrinter;
260297
}
298+
299+
public static class AppInputs {
300+
final private String appName;
301+
final private boolean withRestServer;
302+
final private boolean withUsersAndRoles;
303+
304+
public AppInputs(String appName) {
305+
this(appName, true, true);
306+
}
307+
308+
public AppInputs(String appName, boolean withRestServer, boolean withUsersAndRoles) {
309+
this.appName = appName;
310+
this.withRestServer = withRestServer;
311+
this.withUsersAndRoles = withUsersAndRoles;
312+
}
313+
314+
public String getAppName() {
315+
return appName;
316+
}
317+
318+
public boolean isWithRestServer() {
319+
return withRestServer;
320+
}
321+
322+
public boolean isWithUsersAndRoles() {
323+
return withUsersAndRoles;
324+
}
325+
}
261326
}

0 commit comments

Comments
 (0)