Improve and simplify OSGi Boot
[lgpl/argeo-commons.git] / org.argeo.server.jcr / src / org / argeo / jcr / unit / AbstractJcrTestCase.java
index 530605eac6d4a62c4a8a366ac833d2a3576755d7..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,10 +39,15 @@ 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;
 
+       protected abstract void clearRepository(Repository repository)
+                       throws Exception;
+
        @Override
        protected void setUp() throws Exception {
                File homeDir = getHomeDir();
@@ -45,34 +55,60 @@ public abstract class AbstractJcrTestCase extends TestCase {
                repository = createRepository();
        }
 
-       protected File getHomeDir() {
-               File homeDir = new File(System.getProperty("java.io.tmpdir"),
-                               AbstractJcrTestCase.class.getSimpleName() + "-"
-                                               + System.getProperty("user.name"));
-               return homeDir;
-       }
-
        @Override
        protected void tearDown() throws Exception {
                if (session != null) {
                        session.logout();
-                       if (log.isDebugEnabled())
-                               log.debug("Logout session");
+                       if (log.isTraceEnabled())
+                               log.trace("Logout session");
                }
+               clearRepository(repository);
        }
 
        protected Session session() {
-               if (session == null) {
+               if (session != null && session.isLive())
+                       return session;
+               Session session;
+               if (getLoginContext() != null) {
+                       LoginContext lc;
                        try {
-                               if (log.isDebugEnabled())
-                                       log.debug("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() {
@@ -83,7 +119,15 @@ public abstract class AbstractJcrTestCase extends TestCase {
         * enables children class to set an existing repository in case it is not
         * deleted on startup, to test migration by instance
         */
-       protected void setRepository(Repository repository) {
+       public void setRepository(Repository repository) {
                this.repository = repository;
        }
+
+       protected File getHomeDir() {
+               File homeDir = new File(System.getProperty("java.io.tmpdir"),
+                               AbstractJcrTestCase.class.getSimpleName() + "-"
+                                               + System.getProperty("user.name"));
+               return homeDir;
+       }
+
 }