1 package org.argeo.connect.core;
2
3 import java.util.List;
4
5 import javax.jcr.Repository;
6 import javax.jcr.RepositoryException;
7 import javax.jcr.Session;
8 import javax.jcr.security.Privilege;
9
10 import org.apache.commons.logging.Log;
11 import org.apache.commons.logging.LogFactory;
12 import org.argeo.connect.AppMaintenanceService;
13 import org.argeo.connect.ConnectException;
14 import org.argeo.connect.SystemMaintenanceService;
15 import org.argeo.jcr.JcrUtils;
16 import org.argeo.node.NodeConstants;
17
18
19 public class DefaultSystemMaintenanceService implements SystemMaintenanceService {
20 private final static Log log = LogFactory.getLog(DefaultSystemMaintenanceService.class);
21
22
23 private Repository repository;
24 private String workspaceName;
25 private List<AppMaintenanceService> maintenanceServices;
26
27 public void init() {
28 Session adminSession = null;
29 try {
30 adminSession = repository.login(workspaceName);
31 if (prepareJcrTree(adminSession)) {
32 configurePrivileges(adminSession);
33 }
34 } catch (Exception e) {
35 throw new ConnectException("Cannot initialise model", e);
36 } finally {
37 JcrUtils.logoutQuietly(adminSession);
38 }
39 }
40
41
42
43
44
45 private final static String jackRabbitVersionSystemPath = "/jcr:system";
46
47 @Override
48 public boolean prepareJcrTree(Session session) {
49 boolean hasCHanged = false;
50 try {
51
52 if (session.hasPendingChanges()) {
53 session.save();
54 hasCHanged = true;
55 }
56 } catch (RepositoryException e) {
57 throw new ConnectException("Cannot build model", e);
58 }
59 for (AppMaintenanceService service : maintenanceServices)
60 hasCHanged |= service.prepareJcrTree(session);
61 if (hasCHanged)
62 log.info("Repository has been initialised with Argeo Suite model");
63 return hasCHanged;
64 }
65
66 @Override
67 public void configurePrivileges(Session session) {
68 try {
69
70 JcrUtils.clearAccessControList(session, "/", "everyone");
71
72 JcrUtils.addPrivilege(session, jackRabbitVersionSystemPath, OfficeRole.coworker.dn(), Privilege.JCR_READ);
73
74 JcrUtils.addPrivilege(session, "/", NodeConstants.ROLE_ADMIN, Privilege.JCR_ALL);
75
76
77
78
79
80
81
82 session.save();
83 } catch (RepositoryException e) {
84 throw new ConnectException("Cannot build model", e);
85 }
86 for (AppMaintenanceService service : maintenanceServices)
87 service.configurePrivileges(session);
88 log.info("Access control configured");
89 }
90
91 public void destroy() {
92 }
93
94
95 public void setRepository(Repository repository) {
96 this.repository = repository;
97 }
98
99 public void setWorkspaceName(String workspaceName) {
100 this.workspaceName = workspaceName;
101 }
102
103 public void setMaintenanceServices(List<AppMaintenanceService> maintenanceServices) {
104 this.maintenanceServices = maintenanceServices;
105 }
106 }