Work on logical backups.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / KernelUtils.java
index 1d81409115b9bcba31ae862117c18c2a728df571..7d296ae0e91e8b1dfbe9dc7d5c8234d9de803be6 100644 (file)
@@ -24,12 +24,9 @@ import javax.security.auth.login.LoginContext;
 import javax.security.auth.login.LoginException;
 
 import org.apache.commons.logging.Log;
-import org.argeo.cms.CmsException;
-import org.argeo.node.DataModelNamespace;
-import org.argeo.node.NodeConstants;
-import org.osgi.framework.Bundle;
+import org.argeo.api.DataModelNamespace;
+import org.argeo.api.NodeConstants;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
 import org.osgi.util.tracker.ServiceTracker;
 
 /** Package utilities */
@@ -44,7 +41,7 @@ class KernelUtils implements KernelConstants {
                                        .getInstance("JavaLoginConfig", uriParameter);
                        javax.security.auth.login.Configuration.setConfiguration(jaasConfiguration);
                } catch (Exception e) {
-                       throw new CmsException("Cannot set configuration " + jaasConfigurationUrl, e);
+                       throw new IllegalArgumentException("Cannot set configuration " + jaasConfigurationUrl, e);
                }
        }
 
@@ -61,7 +58,7 @@ class KernelUtils implements KernelConstants {
                try {
                        props.load(cl.getResourceAsStream(resource));
                } catch (IOException e) {
-                       throw new CmsException("Cannot load " + resource + " from classpath", e);
+                       throw new IllegalArgumentException("Cannot load " + resource + " from classpath", e);
                }
                return asDictionary(props);
        }
@@ -73,7 +70,7 @@ class KernelUtils implements KernelConstants {
                try {
                        return new File(executionDir, relativePath).getCanonicalFile();
                } catch (IOException e) {
-                       throw new CmsException("Cannot get canonical file", e);
+                       throw new IllegalArgumentException("Cannot get canonical file", e);
                }
        }
 
@@ -88,32 +85,28 @@ class KernelUtils implements KernelConstants {
 
        static URI getOsgiInstanceUri(String relativePath) {
                String osgiInstanceBaseUri = getFrameworkProp(OSGI_INSTANCE_AREA);
-               return safeUri(osgiInstanceBaseUri + (relativePath != null ? relativePath : ""));
+               if (osgiInstanceBaseUri != null)
+                       return safeUri(osgiInstanceBaseUri + (relativePath != null ? relativePath : ""));
+               else
+                       return Paths.get(System.getProperty("user.dir")).toUri();
        }
 
-       // static String getOsgiInstancePath(String relativePath) {
-       // try {
-       // if (relativePath == null)
-       // return getOsgiInstanceDir().getCanonicalPath();
-       // else
-       // return new File(getOsgiInstanceDir(), relativePath).getCanonicalPath();
-       // } catch (IOException e) {
-       // throw new CmsException("Cannot get instance path for " + relativePath,
-       // e);
-       // }
-       // }
-
        static File getOsgiConfigurationFile(String relativePath) {
                try {
                        return new File(new URI(getBundleContext().getProperty(OSGI_CONFIGURATION_AREA) + relativePath))
                                        .getCanonicalFile();
                } catch (Exception e) {
-                       throw new CmsException("Cannot get configuration file for " + relativePath, e);
+                       throw new IllegalArgumentException("Cannot get configuration file for " + relativePath, e);
                }
        }
 
        static String getFrameworkProp(String key, String def) {
-               String value = getBundleContext().getProperty(key);
+               BundleContext bundleContext = Activator.getBundleContext();
+               String value;
+               if (bundleContext != null)
+                       value = bundleContext.getProperty(key);
+               else
+                       value = System.getProperty(key);
                if (value == null)
                        return def;
                return value;
@@ -165,6 +158,28 @@ class KernelUtils implements KernelConstants {
        }
 
        static Session openAdminSession(final Repository repository, final String workspaceName) {
+               LoginContext loginContext = loginAsDataAdmin();
+               return Subject.doAs(loginContext.getSubject(), new PrivilegedAction<Session>() {
+
+                       @Override
+                       public Session run() {
+                               try {
+                                       return repository.login(workspaceName);
+                               } catch (RepositoryException e) {
+                                       throw new IllegalStateException("Cannot open admin session", e);
+                               } finally {
+                                       try {
+                                               loginContext.logout();
+                                       } catch (LoginException e) {
+                                               throw new IllegalStateException(e);
+                                       }
+                               }
+                       }
+
+               });
+       }
+
+       static LoginContext loginAsDataAdmin() {
                ClassLoader currentCl = Thread.currentThread().getContextClassLoader();
                Thread.currentThread().setContextClassLoader(KernelUtils.class.getClassLoader());
                LoginContext loginContext;
@@ -172,18 +187,28 @@ class KernelUtils implements KernelConstants {
                        loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_DATA_ADMIN);
                        loginContext.login();
                } catch (LoginException e1) {
-                       throw new CmsException("Could not login as data admin", e1);
+                       throw new IllegalStateException("Could not login as data admin", e1);
                } finally {
                        Thread.currentThread().setContextClassLoader(currentCl);
                }
-               return Subject.doAs(loginContext.getSubject(), new PrivilegedAction<Session>() {
+               return loginContext;
+       }
+
+       static void doAsDataAdmin(Runnable action) {
+               LoginContext loginContext = loginAsDataAdmin();
+               Subject.doAs(loginContext.getSubject(), new PrivilegedAction<Void>() {
 
                        @Override
-                       public Session run() {
+                       public Void run() {
                                try {
-                                       return repository.login(workspaceName);
-                               } catch (RepositoryException e) {
-                                       throw new CmsException("Cannot open admin session", e);
+                                       action.run();
+                                       return null;
+                               } finally {
+                                       try {
+                                               loginContext.logout();
+                                       } catch (LoginException e) {
+                                               throw new IllegalStateException(e);
+                                       }
                                }
                        }
 
@@ -198,25 +223,12 @@ class KernelUtils implements KernelConstants {
                                st.open();
                        }
                };
-               new Thread(run, "Open service tracker " + st).start();
-       }
-
-       /**
-        * @return the {@link BundleContext} of the {@link Bundle} which provided this
-        *         class, never null.
-        * @throws CmsException
-        *             if the related bundle is not active
-        */
-       static BundleContext getBundleContext(Class<?> clzz) {
-               Bundle bundle = FrameworkUtil.getBundle(clzz);
-               BundleContext bc = bundle.getBundleContext();
-               if (bc == null)
-                       throw new CmsException("Bundle " + bundle.getSymbolicName() + " is not active");
-               return bc;
+               Activator.getInternalExecutorService().execute(run);
+//             new Thread(run, "Open service tracker " + st).start();
        }
 
        static BundleContext getBundleContext() {
-               return getBundleContext(KernelUtils.class);
+               return Activator.getBundleContext();
        }
 
        static boolean asBoolean(String value) {
@@ -228,18 +240,18 @@ class KernelUtils implements KernelConstants {
                case "false":
                        return false;
                default:
-                       throw new CmsException("Unsupported value for attribute " + DataModelNamespace.ABSTRACT
-                                       + ": " + value);
+                       throw new IllegalArgumentException(
+                                       "Unsupported value for attribute " + DataModelNamespace.ABSTRACT + ": " + value);
                }
        }
 
        private static URI safeUri(String uri) {
                if (uri == null)
-                       throw new CmsException("URI cannot be null");
+                       throw new IllegalArgumentException("URI cannot be null");
                try {
                        return new URI(uri);
                } catch (URISyntaxException e) {
-                       throw new CmsException("Dadly formatted URI " + uri, e);
+                       throw new IllegalArgumentException("Badly formatted URI " + uri, e);
                }
        }