]> git.argeo.org Git - gpl/argeo-slc.git/blob - plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/controllers/DistSessionFactory.java
Clean: fix typos, update comments
[gpl/argeo-slc.git] / plugins / org.argeo.slc.client.ui.dist / src / main / java / org / argeo / slc / client / ui / dist / controllers / DistSessionFactory.java
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.slc.SlcException;
13 import org.argeo.slc.repo.RepoUtils;
14 import org.argeo.util.security.Keyring;
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 }