View Javadoc
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  /** Make the DJay-ing to provide a full running Suite platform */
19  public class DefaultSystemMaintenanceService implements SystemMaintenanceService {
20  	private final static Log log = LogFactory.getLog(DefaultSystemMaintenanceService.class);
21  
22  	/* DEPENDENCY INJECTION */
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  	// To be cleaned once first init and config mechanisms have been implemented
42  	// private final static String publicPath = "/public";
43  	// FIXME Users must have read access on the jcr:system/jcr:versionStorage
44  	// node under JackRabbit to be able to manage versions
45  	private final static String jackRabbitVersionSystemPath = "/jcr:system";
46  
47  	@Override
48  	public boolean prepareJcrTree(Session session) {
49  		boolean hasCHanged = false;
50  		try {
51  			// JcrUtils.mkdirs(session, publicPath, NodeType.NT_UNSTRUCTURED);
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  			// Remove unused default JCR rights
70  			JcrUtils.clearAccessControList(session, "/", "everyone");
71  
72  			JcrUtils.addPrivilege(session, jackRabbitVersionSystemPath, OfficeRole.coworker.dn(), Privilege.JCR_READ);
73  			// Default configuration of the workspace
74  			JcrUtils.addPrivilege(session, "/", NodeConstants.ROLE_ADMIN, Privilege.JCR_ALL);
75  			// JcrUtils.addPrivilege(session, publicPath,
76  			// NodeConstants.ROLE_USER, Privilege.JCR_READ);
77  			// JcrUtils.addPrivilege(session, publicPath, "anonymous",
78  			// Privilege.JCR_READ);
79  			// JcrUtils.addPrivilege(session, publicPath,
80  			// NodeConstants.ROLE_ANONYMOUS, Privilege.JCR_READ);
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  	/* DEPENDENCY INJECTION */
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 }