Improve and simplify OSGi Boot
[lgpl/argeo-commons.git] / org.argeo.server.jcr / src / org / argeo / jcr / unit / AbstractJcrTestCase.java
index ca32f7df0b359fdc8a0f4ed72581348b1c03389c..1269a3ee5730243b172896b546ff6191e3974dcc 100644 (file)
 package org.argeo.jcr.unit;
 
 import java.io.File;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 
 import javax.jcr.Repository;
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
-
-import junit.framework.TestCase;
+import javax.security.auth.Subject;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.argeo.ArgeoException;
+import org.argeo.jcr.ArgeoJcrException;
+
+import junit.framework.TestCase;
 
 public abstract class AbstractJcrTestCase extends TestCase {
        private final static Log log = LogFactory.getLog(AbstractJcrTestCase.class);
@@ -34,7 +39,9 @@ public abstract class AbstractJcrTestCase extends TestCase {
        private Repository repository;
        private Session session = null;
 
-//     protected abstract File getRepositoryFile() throws Exception;
+       public final static String LOGIN_CONTEXT_TEST_SYSTEM = "TEST_JACKRABBIT_ADMIN";
+
+       // protected abstract File getRepositoryFile() throws Exception;
 
        protected abstract Repository createRepository() throws Exception;
 
@@ -59,17 +66,49 @@ public abstract class AbstractJcrTestCase extends TestCase {
        }
 
        protected Session session() {
-               if (session == null || !session.isLive()) {
+               if (session != null && session.isLive())
+                       return session;
+               Session session;
+               if (getLoginContext() != null) {
+                       LoginContext lc;
                        try {
-                               if (log.isTraceEnabled())
-                                       log.trace("Login session");
-                               session = getRepository().login(
-                                               new SimpleCredentials("demo", "demo".toCharArray()));
-                       } catch (Exception e) {
-                               throw new ArgeoException("Cannot login to repository", e);
+                               lc = new LoginContext(getLoginContext());
+                               lc.login();
+                       } catch (LoginException e) {
+                               throw new ArgeoJcrException("JAAS login failed", e);
                        }
+                       session = Subject.doAs(lc.getSubject(),
+                                       new PrivilegedAction<Session>() {
+
+                                               @Override
+                                               public Session run() {
+                                                       return login();
+                                               }
+
+                                       });
+               } else
+                       session = login();
+               this.session = session;
+               return this.session;
+       }
+
+       protected String getLoginContext() {
+               return null;
+       }
+
+       protected Session login() {
+               try {
+                       if (log.isTraceEnabled())
+                               log.trace("Login session");
+                       Subject subject = Subject.getSubject(AccessController.getContext());
+                       if (subject != null)
+                               return getRepository().login();
+                       else
+                               return getRepository().login(
+                                               new SimpleCredentials("demo", "demo".toCharArray()));
+               } catch (Exception e) {
+                       throw new ArgeoJcrException("Cannot login to repository", e);
                }
-               return session;
        }
 
        protected Repository getRepository() {
@@ -84,30 +123,6 @@ public abstract class AbstractJcrTestCase extends TestCase {
                this.repository = repository;
        }
 
-       // public void logout() {
-       // if (session != null && session.isLive())
-       // JcrUtils.logoutQuietly(session);
-       // }
-       //
-       // protected static TestSuite defaultTestSuite(Class<? extends TestCase>
-       // clss) {
-       // String testSuiteClassName =
-       // "org.argeo.jackrabbit.unit.JackrabbitTestSuite";
-       // try {
-       // Class<?> testSuiteClass = AbstractJcrTestCase.class
-       // .getClassLoader().loadClass(testSuiteClassName);
-       // if (clss == null) {
-       // return (TestSuite) testSuiteClass.newInstance();
-       // } else {
-       // return (TestSuite) testSuiteClass.getConstructor(Class.class)
-       // .newInstance(clss);
-       // }
-       // } catch (Exception e) {
-       // throw new ArgeoException("Cannot find default test suite "
-       // + testSuiteClassName, e);
-       // }
-       // }
-
        protected File getHomeDir() {
                File homeDir = new File(System.getProperty("java.io.tmpdir"),
                                AbstractJcrTestCase.class.getSimpleName() + "-"