View Javadoc
1   package org.argeo.slc.client.ui.dist.controllers;
2   
3   import javax.jcr.Credentials;
4   import javax.jcr.NoSuchWorkspaceException;
5   import javax.jcr.Node;
6   import javax.jcr.Repository;
7   import javax.jcr.RepositoryException;
8   import javax.jcr.RepositoryFactory;
9   import javax.jcr.Session;
10  
11  import org.argeo.jcr.JcrUtils;
12  import org.argeo.node.security.Keyring;
13  import org.argeo.slc.SlcException;
14  import org.argeo.slc.repo.RepoUtils;
15  
16  /**
17   * Provide shortcuts to retrieve sessions, repositories and workspaces that are
18   * persisted in the current user node using path only.
19   */
20  public class DistSessionFactory {
21  
22  	/* DEPENDENCY INJECTION */
23  	private RepositoryFactory repositoryFactory;
24  	private Keyring keyring;
25  	private Repository nodeRepository;
26  
27  	/**
28  	 * Returns a new session on the given workspace. This session *must* be
29  	 * disposed by the caller. If the workspace does not exist and
30  	 * createIfNeeded==true, tries to create it
31  	 * 
32  	 * */
33  	public Session getSessionFromWorkspacePath(String path,
34  			boolean createIfNeeded) {
35  		Session nodeSession = null;
36  		try {
37  			nodeSession = nodeRepository.login();
38  			Node localWksp = nodeSession.getNode(path);
39  			Repository repository = RepoUtils.getRepository(repositoryFactory,
40  					keyring, localWksp.getParent());
41  			Credentials credentials = RepoUtils.getRepositoryCredentials(
42  					keyring, localWksp.getParent());
43  
44  			String wkspName = JcrUtils.lastPathElement(path);
45  			Session session = null;
46  			try {
47  				session = repository.login(credentials, wkspName);
48  			} catch (NoSuchWorkspaceException e) {
49  				if (createIfNeeded) {
50  					Session defaultSession = repository.login(credentials);
51  					try {
52  						defaultSession.getWorkspace().createWorkspace(wkspName);
53  					} catch (Exception e1) {
54  						throw new SlcException("Cannot create new workspace "
55  								+ wkspName, e);
56  					} finally {
57  						JcrUtils.logoutQuietly(defaultSession);
58  					}
59  					session = repository.login(credentials, wkspName);
60  				} else
61  					throw new SlcException("Workspace" + wkspName
62  							+ "does not exists and should not be created", e);
63  			}
64  			return session;
65  		} catch (RepositoryException e) {
66  			throw new SlcException("cannot create session" + " for workspace "
67  					+ path, e);
68  		} finally {
69  			JcrUtils.logoutQuietly(nodeSession);
70  		}
71  	}
72  
73  	/*
74  	 * DEPENDENCY INJECTION
75  	 */
76  	public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
77  		this.repositoryFactory = repositoryFactory;
78  	}
79  
80  	public void setKeyring(Keyring keyring) {
81  		this.keyring = keyring;
82  	}
83  
84  	public void setRepository(Repository nodeRepository) {
85  		this.nodeRepository = nodeRepository;
86  	}
87  }