Massive Argeo APIs refactoring
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / KernelUtils.java
index e3bbdb79629d1cd8ed8a9d7837dce0b859a6fc3c..f267933cf5910de37b95213d30bab126c34cf8bd 100644 (file)
@@ -5,36 +5,37 @@ import java.io.IOException;
 import java.io.PrintStream;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.net.URL;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.security.PrivilegedAction;
+import java.security.URIParameter;
 import java.util.Dictionary;
-import java.util.Enumeration;
 import java.util.Hashtable;
 import java.util.Properties;
 import java.util.TreeMap;
 import java.util.TreeSet;
 
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.security.auth.Subject;
-import javax.security.auth.login.LoginContext;
-import javax.security.auth.login.LoginException;
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.logging.Log;
-import org.argeo.cms.CmsException;
-import org.argeo.node.NodeConstants;
-import org.osgi.framework.Bundle;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.cms.osgi.DataModelNamespace;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
+import org.osgi.util.tracker.ServiceTracker;
 
 /** Package utilities */
 class KernelUtils implements KernelConstants {
        final static String OSGI_INSTANCE_AREA = "osgi.instance.area";
        final static String OSGI_CONFIGURATION_AREA = "osgi.configuration.area";
 
+       static void setJaasConfiguration(URL jaasConfigurationUrl) {
+               try {
+                       URIParameter uriParameter = new URIParameter(jaasConfigurationUrl.toURI());
+                       javax.security.auth.login.Configuration jaasConfiguration = javax.security.auth.login.Configuration
+                                       .getInstance("JavaLoginConfig", uriParameter);
+                       javax.security.auth.login.Configuration.setConfiguration(jaasConfiguration);
+               } catch (Exception e) {
+                       throw new IllegalArgumentException("Cannot set configuration " + jaasConfigurationUrl, e);
+               }
+       }
+
        static Dictionary<String, ?> asDictionary(Properties props) {
                Hashtable<String, Object> hashtable = new Hashtable<String, Object>();
                for (Object key : props.keySet()) {
@@ -48,7 +49,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);
        }
@@ -60,7 +61,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);
                }
        }
 
@@ -75,32 +76,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;
@@ -111,31 +108,19 @@ class KernelUtils implements KernelConstants {
        }
 
        // Security
-       static Subject anonymousLogin() {
-               Subject subject = new Subject();
-               LoginContext lc;
-               try {
-                       lc = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, subject);
-                       lc.login();
-                       return subject;
-               } catch (LoginException e) {
-                       throw new CmsException("Cannot login as anonymous", e);
-               }
-       }
-
-       // HTTP
-       static void logRequestHeaders(Log log, HttpServletRequest request) {
-               if (!log.isDebugEnabled())
-                       return;
-               for (Enumeration<String> headerNames = request.getHeaderNames(); headerNames.hasMoreElements();) {
-                       String headerName = headerNames.nextElement();
-                       Object headerValue = request.getHeader(headerName);
-                       log.debug(headerName + ": " + headerValue);
-               }
-               log.debug(request.getRequestURI() + "\n");
-       }
+       // static Subject anonymousLogin() {
+       // Subject subject = new Subject();
+       // LoginContext lc;
+       // try {
+       // lc = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, subject);
+       // lc.login();
+       // return subject;
+       // } catch (LoginException e) {
+       // throw new CmsException("Cannot login as anonymous", e);
+       // }
+       // }
 
-       static void logFrameworkProperties(Log log) {
+       static void logFrameworkProperties(CmsLog log) {
                BundleContext bc = getBundleContext();
                for (Object sysProp : new TreeSet<Object>(System.getProperties().keySet())) {
                        log.debug(sysProp + "=" + bc.getProperty(sysProp.toString()));
@@ -150,8 +135,8 @@ class KernelUtils implements KernelConstants {
                // for (String key : keys)
                // log.debug(key + "=" + bc.getProperty(key));
        }
-       
-       static void printSystemProperties(PrintStream out){
+
+       static void printSystemProperties(PrintStream out) {
                TreeMap<String, String> display = new TreeMap<>();
                for (Object key : System.getProperties().keySet())
                        display.put(key.toString(), System.getProperty(key.toString()));
@@ -159,65 +144,108 @@ class KernelUtils implements KernelConstants {
                        out.println(key + "=" + display.get(key));
        }
 
-       static Session openAdminSession(Repository repository) {
-               return openAdminSession(repository, null);
-       }
-
-       static Session openAdminSession(final Repository repository, final String workspaceName) {
-               ClassLoader currentCl = Thread.currentThread().getContextClassLoader();
-               Thread.currentThread().setContextClassLoader(KernelUtils.class.getClassLoader());
-               LoginContext loginContext;
-               try {
-                       loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_DATA_ADMIN);
-                       loginContext.login();
-               } catch (LoginException e1) {
-                       throw new CmsException("Could not login as data admin", e1);
-               } finally {
-                       Thread.currentThread().setContextClassLoader(currentCl);
-               }
-               return Subject.doAs(loginContext.getSubject(), new PrivilegedAction<Session>() {
+//     static Session openAdminSession(Repository repository) {
+//             return openAdminSession(repository, null);
+//     }
+//
+//     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;
+//             try {
+//                     loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_DATA_ADMIN);
+//                     loginContext.login();
+//             } catch (LoginException e1) {
+//                     throw new IllegalStateException("Could not login as data admin", e1);
+//             } finally {
+//                     Thread.currentThread().setContextClassLoader(currentCl);
+//             }
+//             return loginContext;
+//     }
+
+//     static void doAsDataAdmin(Runnable action) {
+//             LoginContext loginContext = loginAsDataAdmin();
+//             Subject.doAs(loginContext.getSubject(), new PrivilegedAction<Void>() {
+//
+//                     @Override
+//                     public Void run() {
+//                             try {
+//                                     action.run();
+//                                     return null;
+//                             } finally {
+//                                     try {
+//                                             loginContext.logout();
+//                                     } catch (LoginException e) {
+//                                             throw new IllegalStateException(e);
+//                                     }
+//                             }
+//                     }
+//
+//             });
+//     }
+
+       static void asyncOpen(ServiceTracker<?, ?> st) {
+               Runnable run = new Runnable() {
 
                        @Override
-                       public Session run() {
-                               try {
-                                       return repository.login(workspaceName);
-                               } catch (RepositoryException e) {
-                                       throw new CmsException("Cannot open admin session", e);
-                               }
+                       public void run() {
+                               st.open();
                        }
-
-               });
+               };
+               Activator.getInternalExecutorService().execute(run);
+//             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
-        */
-       public 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;
+       static BundleContext getBundleContext() {
+               return Activator.getBundleContext();
        }
 
-       private static BundleContext getBundleContext() {
-               return getBundleContext(KernelUtils.class);
+       static boolean asBoolean(String value) {
+               if (value == null)
+                       return false;
+               switch (value) {
+               case "true":
+                       return true;
+               case "false":
+                       return false;
+               default:
+                       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);
                }
        }
 
-
        private KernelUtils() {
 
        }