X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FKernelUtils.java;h=7d296ae0e91e8b1dfbe9dc7d5c8234d9de803be6;hb=6e6286a551d04ee0993dc7930bd9744f7c9df10e;hp=b3fb33ac3169911e02eaafe4b6df4fbd1197dfb5;hpb=8a582781fa376ebcf66096dd6fb90232648b4682;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java index b3fb33ac3..7d296ae0e 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java @@ -24,11 +24,10 @@ 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.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 */ class KernelUtils implements KernelConstants { @@ -42,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); } } @@ -59,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); } @@ -71,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); } } @@ -86,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; @@ -163,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() { + + @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; @@ -170,49 +187,71 @@ 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() { + return loginContext; + } + + static void doAsDataAdmin(Runnable action) { + LoginContext loginContext = loginAsDataAdmin(); + Subject.doAs(loginContext.getSubject(), new PrivilegedAction() { @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); + } } } }); } - /** - * @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 void asyncOpen(ServiceTracker st) { + Runnable run = new Runnable() { + + @Override + public void run() { + st.open(); + } + }; + Activator.getInternalExecutorService().execute(run); +// new Thread(run, "Open service tracker " + st).start(); } - private static BundleContext getBundleContext() { - return getBundleContext(KernelUtils.class); + static BundleContext getBundleContext() { + return Activator.getBundleContext(); + } + + 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); } }