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

Commit 9a426ee

Browse files
committed
#249 New API for writing out template resources to files
1 parent 77d0d8b commit 9a426ee

34 files changed

+1007
-195
lines changed
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package com.marklogic.appdeployer.scaffold;
2+
3+
import com.marklogic.appdeployer.ConfigDir;
4+
import com.marklogic.client.ext.helper.LoggingObject;
5+
import com.marklogic.mgmt.api.Resource;
6+
import com.marklogic.mgmt.api.cluster.Cluster;
7+
import com.marklogic.mgmt.api.database.Database;
8+
import com.marklogic.mgmt.api.forest.Forest;
9+
import com.marklogic.mgmt.api.group.Group;
10+
import com.marklogic.mgmt.api.security.*;
11+
import com.marklogic.mgmt.api.server.Server;
12+
import com.marklogic.mgmt.api.task.Task;
13+
import org.springframework.util.FileCopyUtils;
14+
15+
import javax.xml.bind.JAXBContext;
16+
import javax.xml.bind.JAXBException;
17+
import java.io.File;
18+
import java.io.IOException;
19+
import java.util.HashMap;
20+
import java.util.Map;
21+
import java.util.function.Function;
22+
23+
public class DefaultResourceWriter extends LoggingObject implements ResourceWriter {
24+
25+
private Map<Class<?>, Function<ConfigDir, File>> functionMap = new HashMap<>();
26+
27+
/**
28+
* Would be nice to handle this in the Resource class itself, but then the mgmt.api package has to depend on the
29+
* appdeployer package, which is the current home of ConfigDir. Sigh...
30+
*/
31+
public DefaultResourceWriter() {
32+
addFunction(Cluster.class, configDir -> configDir.getClustersDir());
33+
addFunction(Database.class, configDir -> configDir.getDatabasesDir());
34+
addFunction(Forest.class, configDir -> configDir.getForestsDir());
35+
addFunction(Group.class, configDir -> configDir.getGroupsDir());
36+
37+
// Security stuff
38+
addFunction(Amp.class, configDir -> configDir.getAmpsDir());
39+
addFunction(ExternalSecurity.class, configDir -> configDir.getExternalSecuritiesDir());
40+
addFunction(Privilege.class, configDir -> configDir.getPrivilegesDir());
41+
addFunction(ProtectedCollection.class, configDir -> configDir.getProtectedCollectionsDir());
42+
addFunction(Role.class, configDir -> configDir.getRolesDir());
43+
addFunction(User.class, configDir -> configDir.getUsersDir());
44+
45+
addFunction(Server.class, configDir -> configDir.getServersDir());
46+
addFunction(Task.class, configDir -> configDir.getTasksDir());
47+
}
48+
49+
/**
50+
* Allow clients to override or add their own functions for writing a resource.
51+
*
52+
* @param resourceClass
53+
* @param function
54+
*/
55+
public void addFunction(Class<?> resourceClass, Function<ConfigDir, File> function) {
56+
functionMap.put(resourceClass, function);
57+
}
58+
59+
@Override
60+
public File writeResourceAsJson(Resource r, ConfigDir configDir) {
61+
final File file = determineResourceFile(r, configDir, ".json");
62+
try {
63+
FileCopyUtils.copy(r.getJson().getBytes(), file);
64+
return file;
65+
} catch (IOException ex) {
66+
throw new RuntimeException("Unable to write to file: " + file.getAbsolutePath() + "; cause: " + ex.getMessage(), ex);
67+
}
68+
}
69+
70+
@Override
71+
public File writeResourceAsXml(Resource r, ConfigDir configDir) {
72+
final File file = determineResourceFile(r, configDir, ".xml");
73+
try {
74+
JAXBContext context = JAXBContext.newInstance(r.getClass());
75+
context.createMarshaller().marshal(r, file);
76+
return file;
77+
} catch (JAXBException ex) {
78+
throw new RuntimeException("Unable to write to file: " + file.getAbsolutePath() + "; cause: " + ex.getMessage(), ex);
79+
}
80+
}
81+
82+
protected File determineResourceFile(Resource r, ConfigDir configDir, String extension) {
83+
Function<ConfigDir, File> function = functionMap.get(r.getClass());
84+
if (function == null) {
85+
throw new IllegalArgumentException("Unsupported resource class type:" + r.getClass());
86+
}
87+
88+
final File dir = function.apply(configDir);
89+
dir.mkdirs();
90+
final File file = new File(dir, buildFilename(r, extension));
91+
92+
if (logger.isInfoEnabled()) {
93+
logger.info("Writing file: " + file.getAbsolutePath());
94+
}
95+
96+
return file;
97+
}
98+
99+
protected String buildFilename(Resource resource, String extension) {
100+
return resource.getClass().getSimpleName() + "-" + System.currentTimeMillis() + extension;
101+
}
102+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.marklogic.appdeployer.scaffold;
2+
3+
import com.marklogic.appdeployer.ConfigDir;
4+
import com.marklogic.mgmt.api.Resource;
5+
6+
import java.io.File;
7+
8+
/**
9+
* Interface for objects that can write a Resource object to the appropriate directory within the given ConfigDir.
10+
*/
11+
public interface ResourceWriter {
12+
13+
File writeResourceAsJson(Resource r, ConfigDir configDir);
14+
15+
/**
16+
* This isn't well-supported yet because most Resource subclasses don't yet have JAXB annotations on them.
17+
*
18+
* @param r
19+
* @param configDir
20+
* @return
21+
*/
22+
File writeResourceAsXml(Resource r, ConfigDir configDir);
23+
24+
}

src/main/java/com/marklogic/mgmt/api/API.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -278,17 +278,27 @@ public ExternalSecurity externalSecurity() {
278278
return externalSecurity(null);
279279
}
280280

281-
public Privilege privilege(String name) {
281+
public Privilege privilegeExecute(String name) {
282282
Privilege p = new Privilege(this, name);
283-
return name != null && p.exists() ? getResource(name, new PrivilegeManager(getManageClient()), Privilege.class)
283+
return name != null && p.exists() ? getResource(name, new PrivilegeManager(getManageClient()), Privilege.class, "kind", "execute")
284284
: p;
285285
}
286286

287-
public Privilege getPrivilege() {
288-
return privilege(null);
287+
public Privilege getPrivilegeExecute() {
288+
return privilegeExecute(null);
289289
}
290290

291-
public ProtectedCollection protectedCollection(String name) {
291+
public Privilege privilegeUri(String name) {
292+
Privilege p = new Privilege(this, name);
293+
return name != null && p.exists() ? getResource(name, new PrivilegeManager(getManageClient()), Privilege.class, "kind", "uri")
294+
: p;
295+
}
296+
297+
public Privilege getPrivilegeUri() {
298+
return privilegeUri(null);
299+
}
300+
301+
public ProtectedCollection protectedCollection(String name) {
292302
ProtectedCollection pc = new ProtectedCollection(this, name);
293303
return name != null && pc.exists() ? getResource(name, new ProtectedCollectionsManager(getManageClient()),
294304
ProtectedCollection.class) : pc;

src/main/java/com/marklogic/mgmt/api/Resource.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.marklogic.mgmt.ManageClient;
66
import com.marklogic.mgmt.resource.ResourceManager;
77
import com.marklogic.mgmt.SaveReceipt;
8+
import com.marklogic.mgmt.util.ObjectMapperFactory;
89
import org.slf4j.Logger;
910
import org.slf4j.LoggerFactory;
1011

@@ -25,11 +26,20 @@ public abstract class Resource extends ApiObject {
2526
* just wants to use the subclass instance like a regular Java bean class.
2627
*/
2728
protected Resource() {
29+
setObjectMapper(ObjectMapperFactory.getObjectMapper());
2830
}
2931

30-
protected Resource(API api) {
32+
/**
33+
*
34+
* @param api
35+
*/
36+
protected Resource(API api) {
3137
this.api = api;
32-
setObjectMapper(api.getObjectMapper());
38+
if (api != null) {
39+
setObjectMapper(api.getObjectMapper());
40+
} else {
41+
setObjectMapper(ObjectMapperFactory.getObjectMapper());
42+
}
3343
}
3444

3545
protected Logger getLogger() {
@@ -100,6 +110,7 @@ public boolean exists() {
100110
*
101111
* @return
102112
*/
113+
@JsonIgnore
103114
public String[] getResourceUrlParams() {
104115
return null;
105116
}

src/main/java/com/marklogic/mgmt/api/security/ExternalSecurity.java

Lines changed: 7 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,7 @@ public class ExternalSecurity extends Resource {
1212
private String authentication;
1313
private Integer cacheTimeout;
1414
private String authorization;
15-
private String ldapServerUri;
16-
private String ldapBase;
17-
private String ldapAttribute;
18-
private String ldapDefaultUser;
19-
private String ldapPassword;
20-
private String ldapBindMethod;
15+
private LdapServer ldapServer;
2116

2217
public ExternalSecurity() {
2318
super();
@@ -78,52 +73,11 @@ public void setAuthorization(String authorization) {
7873
this.authorization = authorization;
7974
}
8075

81-
public String getLdapServerUri() {
82-
return ldapServerUri;
83-
}
84-
85-
public void setLdapServerUri(String ldapServerUri) {
86-
this.ldapServerUri = ldapServerUri;
87-
}
88-
89-
public String getLdapBase() {
90-
return ldapBase;
91-
}
92-
93-
public void setLdapBase(String ldapBase) {
94-
this.ldapBase = ldapBase;
95-
}
96-
97-
public String getLdapAttribute() {
98-
return ldapAttribute;
99-
}
100-
101-
public void setLdapAttribute(String ldapAttribute) {
102-
this.ldapAttribute = ldapAttribute;
103-
}
104-
105-
public String getLdapDefaultUser() {
106-
return ldapDefaultUser;
107-
}
108-
109-
public void setLdapDefaultUser(String ldapDefaultUser) {
110-
this.ldapDefaultUser = ldapDefaultUser;
111-
}
112-
113-
public String getLdapPassword() {
114-
return ldapPassword;
115-
}
116-
117-
public void setLdapPassword(String ldapPassword) {
118-
this.ldapPassword = ldapPassword;
119-
}
120-
121-
public String getLdapBindMethod() {
122-
return ldapBindMethod;
123-
}
124-
125-
public void setLdapBindMethod(String ldapBindMethod) {
126-
this.ldapBindMethod = ldapBindMethod;
127-
}
76+
public LdapServer getLdapServer() {
77+
return ldapServer;
78+
}
12879

80+
public void setLdapServer(LdapServer ldapServer) {
81+
this.ldapServer = ldapServer;
82+
}
12983
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.marklogic.mgmt.api.security;
2+
3+
public class LdapServer {
4+
5+
private String ldapServerUri;
6+
private String ldapBase;
7+
private String ldapAttribute;
8+
private String ldapDefaultUser;
9+
private String ldapPassword;
10+
private String ldapBindMethod;
11+
12+
public String getLdapServerUri() {
13+
return ldapServerUri;
14+
}
15+
16+
public void setLdapServerUri(String ldapServerUri) {
17+
this.ldapServerUri = ldapServerUri;
18+
}
19+
20+
public String getLdapBase() {
21+
return ldapBase;
22+
}
23+
24+
public void setLdapBase(String ldapBase) {
25+
this.ldapBase = ldapBase;
26+
}
27+
28+
public String getLdapAttribute() {
29+
return ldapAttribute;
30+
}
31+
32+
public void setLdapAttribute(String ldapAttribute) {
33+
this.ldapAttribute = ldapAttribute;
34+
}
35+
36+
public String getLdapDefaultUser() {
37+
return ldapDefaultUser;
38+
}
39+
40+
public void setLdapDefaultUser(String ldapDefaultUser) {
41+
this.ldapDefaultUser = ldapDefaultUser;
42+
}
43+
44+
public String getLdapPassword() {
45+
return ldapPassword;
46+
}
47+
48+
public void setLdapPassword(String ldapPassword) {
49+
this.ldapPassword = ldapPassword;
50+
}
51+
52+
public String getLdapBindMethod() {
53+
return ldapBindMethod;
54+
}
55+
56+
public void setLdapBindMethod(String ldapBindMethod) {
57+
this.ldapBindMethod = ldapBindMethod;
58+
}
59+
}

src/main/java/com/marklogic/mgmt/api/security/Permission.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ public class Permission {
1111
private String roleName;
1212
private String capability;
1313

14+
public Permission() {
15+
}
16+
17+
public Permission(String roleName, String capability) {
18+
this.roleName = roleName;
19+
this.capability = capability;
20+
}
21+
1422
public String getRoleName() {
1523
return roleName;
1624
}

src/main/java/com/marklogic/mgmt/api/security/Role.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package com.marklogic.mgmt.api.security;
22

3-
import com.marklogic.mgmt.ManageClient;
43
import com.marklogic.mgmt.api.API;
54
import com.marklogic.mgmt.api.Resource;
65
import com.marklogic.mgmt.resource.ResourceManager;
76
import com.marklogic.mgmt.resource.security.RoleManager;
87

98
import javax.xml.bind.annotation.*;
109
import java.util.ArrayList;
11-
import java.util.Arrays;
1210
import java.util.List;
1311

1412
@XmlRootElement(name = "role-properties")
@@ -37,16 +35,6 @@ public class Role extends Resource {
3735
@XmlElementWrapper(name = "collections")
3836
private List<String> collection;
3937

40-
public static void main(String[] args) {
41-
API api = new API(new ManageClient());
42-
Role r = new Role();
43-
r.setRoleName("hi");
44-
r.setObjectMapper(api.getObjectMapper());
45-
r.setExternalName(Arrays.asList("name1", "name2"));
46-
System.out.println(r.getJson());
47-
48-
}
49-
5038
public Role() {
5139
}
5240

0 commit comments

Comments
 (0)