]> git.argeo.org Git - lgpl/argeo-commons.git/blob - AbstractJcrTestCase.java
319ba75d615ad8a5282b868e618c885e7951b130
[lgpl/argeo-commons.git] / AbstractJcrTestCase.java
1 package org.argeo.jcr.unit;
2
3 import java.io.File;
4 import java.security.AccessController;
5 import java.security.PrivilegedAction;
6
7 import javax.jcr.Repository;
8 import javax.jcr.Session;
9 import javax.jcr.SimpleCredentials;
10 import javax.security.auth.Subject;
11 import javax.security.auth.login.LoginContext;
12 import javax.security.auth.login.LoginException;
13
14 import org.apache.commons.io.FileUtils;
15 import org.apache.commons.logging.Log;
16 import org.apache.commons.logging.LogFactory;
17 import org.argeo.jcr.ArgeoJcrException;
18
19 import junit.framework.TestCase;
20
21 public abstract class AbstractJcrTestCase extends TestCase {
22 private final static Log log = LogFactory.getLog(AbstractJcrTestCase.class);
23
24 private Repository repository;
25 private Session session = null;
26
27 public final static String LOGIN_CONTEXT_TEST_SYSTEM = "TEST_JACKRABBIT_ADMIN";
28
29 // protected abstract File getRepositoryFile() throws Exception;
30
31 protected abstract Repository createRepository() throws Exception;
32
33 protected abstract void clearRepository(Repository repository)
34 throws Exception;
35
36 @Override
37 protected void setUp() throws Exception {
38 File homeDir = getHomeDir();
39 FileUtils.deleteDirectory(homeDir);
40 repository = createRepository();
41 }
42
43 @Override
44 protected void tearDown() throws Exception {
45 if (session != null) {
46 session.logout();
47 if (log.isTraceEnabled())
48 log.trace("Logout session");
49 }
50 clearRepository(repository);
51 }
52
53 protected Session session() {
54 if (session != null && session.isLive())
55 return session;
56 Session session;
57 if (getLoginContext() != null) {
58 LoginContext lc;
59 try {
60 lc = new LoginContext(getLoginContext());
61 lc.login();
62 } catch (LoginException e) {
63 throw new ArgeoJcrException("JAAS login failed", e);
64 }
65 session = Subject.doAs(lc.getSubject(),
66 new PrivilegedAction<Session>() {
67
68 @Override
69 public Session run() {
70 return login();
71 }
72
73 });
74 } else
75 session = login();
76 this.session = session;
77 return this.session;
78 }
79
80 protected String getLoginContext() {
81 return null;
82 }
83
84 protected Session login() {
85 try {
86 if (log.isTraceEnabled())
87 log.trace("Login session");
88 Subject subject = Subject.getSubject(AccessController.getContext());
89 if (subject != null)
90 return getRepository().login();
91 else
92 return getRepository().login(
93 new SimpleCredentials("demo", "demo".toCharArray()));
94 } catch (Exception e) {
95 throw new ArgeoJcrException("Cannot login to repository", e);
96 }
97 }
98
99 protected Repository getRepository() {
100 return repository;
101 }
102
103 /**
104 * enables children class to set an existing repository in case it is not
105 * deleted on startup, to test migration by instance
106 */
107 public void setRepository(Repository repository) {
108 this.repository = repository;
109 }
110
111 protected File getHomeDir() {
112 File homeDir = new File(System.getProperty("java.io.tmpdir"),
113 AbstractJcrTestCase.class.getSimpleName() + "-"
114 + System.getProperty("user.name"));
115 return homeDir;
116 }
117
118 }