X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FFirstInitProperties.java;h=2a054d5be1af1c10c63c1216ddd39b4e0fe792dd;hb=277bb126a4b8523b93c2cd9abd345833a8387eba;hp=cc2c3efe4ce2802d44909055eeb8dcb8b2bbb843;hpb=2d6b7c0c3badea29451c4d8e41ebb5aca2258806;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/FirstInitProperties.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/FirstInitProperties.java index cc2c3efe4..2a054d5be 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/FirstInitProperties.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/FirstInitProperties.java @@ -2,12 +2,24 @@ package org.argeo.cms.internal.kernel; import static org.argeo.cms.internal.kernel.KernelUtils.getFrameworkProp; +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; import java.util.Dictionary; import java.util.Hashtable; +import java.util.List; +import org.apache.commons.io.FileUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.cms.CmsException; +import org.argeo.cms.auth.AuthConstants; import org.argeo.jcr.ArgeoJcrConstants; import org.argeo.node.NodeConstants; import org.argeo.node.RepoConf; +import org.argeo.osgi.useradmin.UserAdminConf; import org.eclipse.equinox.http.jetty.JettyConstants; /** @@ -15,8 +27,15 @@ import org.eclipse.equinox.http.jetty.JettyConstants; * configuration. */ class FirstInitProperties { - Dictionary getNodeRepositoryConfig() { - Hashtable props = new Hashtable(); + private final static Log log = LogFactory.getLog(FirstInitProperties.class); + + public FirstInitProperties() { + log.info("## FIRST INIT ##"); + } + + /** Override the provided config with the framework properties */ + Dictionary getNodeRepositoryConfig(Dictionary provided) { + Dictionary props = provided != null ? provided : new Hashtable(); for (RepoConf repoConf : RepoConf.values()) { Object value = getFrameworkProp(NodeConstants.NODE_REPO_PROP_PREFIX + repoConf.name()); if (value != null) @@ -27,7 +46,8 @@ class FirstInitProperties { return props; } - Dictionary getHttpServerConfig() { + /** Override the provided config with the framework properties */ + Dictionary getHttpServerConfig(Dictionary provided) { String httpPort = getFrameworkProp("org.osgi.service.http.port"); String httpsPort = getFrameworkProp("org.osgi.service.http.port.secure"); /// TODO make it more generic @@ -52,8 +72,112 @@ class FirstInitProperties { if (httpHost != null) { props.put(JettyConstants.HTTP_HOST, httpHost); } - props.put(NodeConstants.CN, "default"); + props.put(NodeConstants.CN, NodeConstants.DEFAULT); } return props; } + + List> getUserDirectoryConfigs() { + List> res = new ArrayList<>(); + File nodeBaseDir = KernelUtils.getOsgiInstancePath(KernelConstants.DIR_NODE).toFile(); + List uris = new ArrayList<>(); + + // node roles + String nodeRolesUri = getFrameworkProp(NodeConstants.ROLES_URI); + String baseNodeRoleDn = AuthConstants.ROLES_BASEDN; + if (nodeRolesUri == null) { + File nodeRolesFile = new File(nodeBaseDir, baseNodeRoleDn + ".ldif"); + if (!nodeRolesFile.exists()) + try { + FileUtils.copyInputStreamToFile(getClass().getResourceAsStream(baseNodeRoleDn + ".ldif"), + nodeRolesFile); + } catch (IOException e) { + throw new CmsException("Cannot copy demo resource", e); + } + nodeRolesUri = nodeRolesFile.toURI().toString(); + } + uris.add(nodeRolesUri); + + // Business roles + String userAdminUris = getFrameworkProp(NodeConstants.USERADMIN_URIS); + if (userAdminUris == null) { + String demoBaseDn = "dc=example,dc=com"; + File businessRolesFile = new File(nodeBaseDir, demoBaseDn + ".ldif"); + if (!businessRolesFile.exists()) + try { + FileUtils.copyInputStreamToFile(getClass().getResourceAsStream(demoBaseDn + ".ldif"), + businessRolesFile); + } catch (IOException e) { + throw new CmsException("Cannot copy demo resource", e); + } + userAdminUris = businessRolesFile.toURI().toString(); + } + for (String userAdminUri : userAdminUris.split(" ")) + uris.add(userAdminUri); + + // Interprets URIs + for (String uri : uris) { + URI u; + try { + u = new URI(uri); + if (u.getPath() == null) + throw new CmsException("URI " + uri + " must have a path in order to determine base DN"); + if (u.getScheme() == null) { + if (uri.startsWith("/") || uri.startsWith("./") || uri.startsWith("../")) + u = new File(uri).getCanonicalFile().toURI(); + else if (!uri.contains("/")) { + u = KernelUtils.getOsgiInstanceUri(KernelConstants.DIR_NODE + '/' + uri); + // u = new URI(nodeBaseDir.toURI() + uri); + } else + throw new CmsException("Cannot interpret " + uri + " as an uri"); + } else if (u.getScheme().equals("file")) { + u = new File(u).getCanonicalFile().toURI(); + } + } catch (Exception e) { + throw new CmsException("Cannot interpret " + uri + " as an uri", e); + } + Dictionary properties = UserAdminConf.uriAsProperties(u.toString()); + res.add(properties); + } + + return res; + } + + /** + * Called before node initialisation, in order populate OSGi instance are + * with some files (typically LDIF, etc). + */ + void prepareInstanceArea() { + String nodeInit = getFrameworkProp(NodeConstants.NODE_INIT); + if (nodeInit == null) + nodeInit = "../../init"; + if (nodeInit.startsWith("http")) { + // remoteFirstInit(nodeInit); + return; + } + + // TODO use java.nio.file + File initDir; + if (nodeInit.startsWith(".")) + initDir = KernelUtils.getExecutionDir(nodeInit); + else + initDir = new File(nodeInit); + // TODO also uncompress archives + if (initDir.exists()) + try { + FileUtils.copyDirectory(initDir, KernelUtils.getOsgiInstanceDir(), new FileFilter() { + + @Override + public boolean accept(File pathname) { + if (pathname.getName().equals(".svn") || pathname.getName().equals(".git")) + return false; + return true; + } + }); + log.info("CMS initialized from " + initDir.getCanonicalPath()); + } catch (IOException e) { + throw new CmsException("Cannot initialize from " + initDir, e); + } + } + }