View Javadoc
1   package org.argeo.slc.repo.core;
2   
3   import java.util.List;
4   import java.util.Map;
5   import java.util.TreeMap;
6   
7   import javax.jcr.NoSuchWorkspaceException;
8   import javax.jcr.Repository;
9   import javax.jcr.RepositoryException;
10  import javax.jcr.Session;
11  
12  import org.apache.commons.logging.Log;
13  import org.apache.commons.logging.LogFactory;
14  import org.argeo.jcr.JcrUtils;
15  import org.argeo.slc.SlcConstants;
16  import org.argeo.slc.SlcException;
17  import org.argeo.slc.repo.NodeIndexer;
18  
19  /** Generic operations on a JCR-based repo. */
20  abstract class AbstractJcrRepoManager {
21  	private final static Log log = LogFactory
22  			.getLog(AbstractJcrRepoManager.class);
23  	private String securityWorkspace = "security";
24  
25  	private Repository jcrRepository;
26  	private Session adminSession;
27  	private List<NodeIndexer> nodeIndexers;
28  
29  	// registries
30  	private Map<String, Session> workspaceSessions = new TreeMap<String, Session>();
31  	private Map<String, WorkspaceIndexer> workspaceIndexers = new TreeMap<String, WorkspaceIndexer>();
32  
33  	public void init() {
34  		try {
35  			adminSession = jcrRepository.login();
36  			String[] workspaceNames = adminSession.getWorkspace()
37  					.getAccessibleWorkspaceNames();
38  			for (String workspaceName : workspaceNames) {
39  				if (workspaceName.equals(securityWorkspace))
40  					continue;
41  				if (workspaceName.equals(adminSession.getWorkspace().getName()))
42  					continue;
43  				workspaceInit(workspaceName);
44  			}
45  		} catch (RepositoryException e) {
46  			throw new SlcException("Cannot initialize repo manager", e);
47  		}
48  	}
49  
50  	public void destroy() {
51  		for (String key : workspaceIndexers.keySet()) {
52  			workspaceIndexers.get(key).close();
53  		}
54  
55  		for (String key : workspaceSessions.keySet()) {
56  			JcrUtils.logoutQuietly(workspaceSessions.get(key));
57  		}
58  		JcrUtils.logoutQuietly(adminSession);
59  	}
60  
61  	public void createWorkspace(String workspaceName) {
62  		try {
63  			try {
64  				jcrRepository.login(workspaceName);
65  				throw new SlcException("Workspace " + workspaceName
66  						+ " exists already.");
67  			} catch (NoSuchWorkspaceException e) {
68  				// try to create workspace
69  				adminSession.getWorkspace().createWorkspace(workspaceName);
70  				workspaceInit(workspaceName);
71  			}
72  		} catch (RepositoryException e) {
73  			throw new SlcException("Cannot create workspace " + workspaceName,
74  					e);
75  		}
76  	}
77  
78  	protected void workspaceInit(String workspaceName) {
79  		Session workspaceAdminSession = null;
80  		try {
81  			workspaceAdminSession = jcrRepository.login(workspaceName);
82  			workspaceSessions.put(workspaceName, adminSession);
83  			JcrUtils.addPrivilege(workspaceAdminSession, "/",
84  					SlcConstants.ROLE_SLC, "jcr:all");
85  			WorkspaceIndexer workspaceIndexer = new WorkspaceIndexer(
86  					workspaceAdminSession, nodeIndexers);
87  			workspaceIndexers.put(workspaceName, workspaceIndexer);
88  		} catch (RepositoryException e) {
89  			log.error("Cannot initialize workspace " + workspaceName, e);
90  		} finally {
91  			JcrUtils.logoutQuietly(workspaceAdminSession);
92  		}
93  	}
94  
95  	public void setJcrRepository(Repository jcrRepository) {
96  		this.jcrRepository = jcrRepository;
97  	}
98  
99  	public void setNodeIndexers(List<NodeIndexer> nodeIndexers) {
100 		this.nodeIndexers = nodeIndexers;
101 	}
102 
103 	public void setSecurityWorkspace(String securityWorkspace) {
104 		this.securityWorkspace = securityWorkspace;
105 	}
106 }