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=1d81409115b9bcba31ae862117c18c2a728df571;hpb=088c1b517a543e935d8ab65c3b2fd2d0269b551d;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 1d8140911..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,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() { + + @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() { + 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); + } } } @@ -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); } }