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
18
19
20 public class DistSessionFactory {
21
22
23 private RepositoryFactory repositoryFactory;
24 private Keyring keyring;
25 private Repository nodeRepository;
26
27
28
29
30
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
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 }