1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.delta;
35
36 import info.magnolia.cms.beans.config.ContentRepository;
37 import info.magnolia.cms.core.Content;
38 import info.magnolia.cms.core.ItemType;
39 import info.magnolia.cms.exchange.ActivationManager;
40 import info.magnolia.cms.exchange.ActivationManagerFactory;
41 import info.magnolia.cms.exchange.Subscriber;
42 import info.magnolia.cms.security.Permission;
43 import info.magnolia.cms.security.Role;
44 import info.magnolia.cms.security.RoleManager;
45 import info.magnolia.cms.security.Security;
46 import info.magnolia.cms.util.ContentUtil;
47 import info.magnolia.importexport.Bootstrapper;
48 import info.magnolia.module.InstallContext;
49 import info.magnolia.module.model.ModuleDefinition;
50 import info.magnolia.module.model.RepositoryDefinition;
51 import info.magnolia.repository.RepositoryConstants;
52
53 import javax.jcr.RepositoryException;
54
55
56
57
58
59
60
61 public class SetupModuleRepositoriesTask extends AbstractTask {
62
63 public SetupModuleRepositoriesTask() {
64 super("Setup module repositories", "Bootstrap empty repositories, grant them to superuser and subscribe them so that activation can be used.");
65 }
66
67
68 @Override
69 public void execute(InstallContext ctx) throws TaskExecutionException {
70 try {
71 final ModuleDefinition def = ctx.getCurrentModuleDefinition();
72
73 for (RepositoryDefinition repDef : def.getRepositories()) {
74 for (final String workspace : repDef.getWorkspaces()) {
75
76 if (!ContentRepository.checkIfInitialized(workspace)) {
77 final String[] bootstrapDirs = Bootstrapper.getBootstrapDirs();
78 Bootstrapper.bootstrapRepository(bootstrapDirs, workspace, new Bootstrapper.BootstrapFilter() {
79 @Override
80 public boolean accept(String filename) {
81 return filename.startsWith(workspace + ".");
82 }
83 });
84 }
85
86
87 grantRepositoryToSuperuser(workspace);
88 subscribeRepository(workspace);
89 }
90 }
91 }
92 catch (Throwable e) {
93 throw new TaskExecutionException("Could not bootstrap workspace: " + e.getMessage(), e);
94 }
95
96 }
97
98 private void grantRepositoryToSuperuser(String workspace) {
99
100 RoleManager roleMan = Security.getRoleManager();
101 final Role superuser = roleMan.getRole("superuser");
102 roleMan.addPermission(superuser, workspace, "/*", Permission.ALL);
103 }
104
105
106
107
108
109 private void subscribeRepository(String repository) throws TaskExecutionException {
110 ActivationManager sManager = ActivationManagerFactory.getActivationManager();
111 for (Subscriber subscriber : sManager.getSubscribers()) {
112 if (!subscriber.isSubscribed("/", repository)) {
113 Content subscriptionsNode = ContentUtil.getContent(RepositoryConstants.CONFIG, sManager.getConfigPath()
114 + "/"
115 + subscriber.getName()
116 + "/subscriptions");
117 try {
118 Content newSubscription = subscriptionsNode.createContent(repository, ItemType.CONTENTNODE);
119 newSubscription.createNodeData("toURI").setValue("/");
120 newSubscription.createNodeData("repository").setValue(repository);
121 newSubscription.createNodeData("fromURI").setValue("/");
122
123 }
124 catch (RepositoryException re) {
125 throw new TaskExecutionException("wasn't able to subscribe repository [" + repository + "]", re);
126 }
127 }
128 }
129 }
130 }