X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fjcr%2FJcrInitUtils.java;fp=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fjcr%2FJcrInitUtils.java;h=27f011b13ca87b0fbf5cf0ddb49fb6e67df2b33e;hb=a1e5c8447beec2b896b0a03e38a4c17608a4b85d;hp=0000000000000000000000000000000000000000;hpb=623a0db2d0f161c101b9e41abcaccc04d478d32a;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/JcrInitUtils.java b/org.argeo.cms/src/org/argeo/cms/internal/jcr/JcrInitUtils.java new file mode 100644 index 000000000..27f011b13 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/jcr/JcrInitUtils.java @@ -0,0 +1,124 @@ +package org.argeo.cms.internal.jcr; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Dictionary; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; + +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.RepositoryFactory; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.api.NodeConstants; +import org.argeo.api.NodeDeployment; +import org.argeo.jackrabbit.client.ClientDavexRepositoryFactory; +import org.argeo.jcr.JcrException; +import org.argeo.naming.LdapAttrs; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.FrameworkUtil; + +/** JCR specific init utilities. */ +public class JcrInitUtils { + private final static Log log = LogFactory.getLog(JcrInitUtils.class); + private final static BundleContext bundleContext = FrameworkUtil.getBundle(JcrInitUtils.class).getBundleContext(); + + public static void addToDeployment(NodeDeployment nodeDeployment) { + // node repository +// Dictionary provided = null; + Dictionary provided = nodeDeployment.getProps(NodeConstants.NODE_REPOS_FACTORY_PID, + NodeConstants.NODE); + Dictionary nodeConfig = JcrInitUtils.getNodeRepositoryConfig(provided); + // node repository is mandatory + nodeDeployment.addFactoryDeployConfig(NodeConstants.NODE_REPOS_FACTORY_PID, nodeConfig); + + // additional repositories +// dataModels: for (DataModels.DataModel dataModel : dataModels.getNonAbstractDataModels()) { +// if (NodeConstants.NODE_REPOSITORY.equals(dataModel.getName())) +// continue dataModels; +// Dictionary config = JcrInitUtils.getRepositoryConfig(dataModel.getName(), +// getProps(NodeConstants.NODE_REPOS_FACTORY_PID, dataModel.getName())); +// if (config.size() != 0) +// putFactoryDeployConfig(NodeConstants.NODE_REPOS_FACTORY_PID, config); +// } + + } + + /** Override the provided config with the framework properties */ + public static 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) { + props.put(repoConf.name(), value); + if (log.isDebugEnabled()) + log.debug("Set node repo configuration " + repoConf.name() + " to " + value); + } + } + props.put(NodeConstants.CN, NodeConstants.NODE_REPOSITORY); + return props; + } + + public static Dictionary getRepositoryConfig(String dataModelName, + Dictionary provided) { + if (dataModelName.equals(NodeConstants.NODE_REPOSITORY) || dataModelName.equals(NodeConstants.EGO_REPOSITORY)) + throw new IllegalArgumentException("Data model '" + dataModelName + "' is reserved."); + Dictionary props = provided != null ? provided : new Hashtable(); + for (RepoConf repoConf : RepoConf.values()) { + Object value = getFrameworkProp( + NodeConstants.NODE_REPOS_PROP_PREFIX + dataModelName + '.' + repoConf.name()); + if (value != null) { + props.put(repoConf.name(), value); + if (log.isDebugEnabled()) + log.debug("Set " + dataModelName + " repo configuration " + repoConf.name() + " to " + value); + } + } + if (props.size() != 0) + props.put(NodeConstants.CN, dataModelName); + return props; + } + + private static void registerRemoteInit(String uri) { + try { + Repository repository = createRemoteRepository(new URI(uri)); + Hashtable properties = new Hashtable<>(); + properties.put(NodeConstants.CN, NodeConstants.NODE_INIT); + properties.put(LdapAttrs.labeledURI.name(), uri); + properties.put(Constants.SERVICE_RANKING, -1000); + bundleContext.registerService(Repository.class, repository, properties); + } catch (RepositoryException e) { + throw new JcrException(e); + } catch (URISyntaxException e) { + throw new IllegalArgumentException(e); + } + } + + private static Repository createRemoteRepository(URI uri) throws RepositoryException { + RepositoryFactory repositoryFactory = new ClientDavexRepositoryFactory(); + Map params = new HashMap(); + params.put(ClientDavexRepositoryFactory.JACKRABBIT_DAVEX_URI, uri.toString()); + // TODO make it configurable + params.put(ClientDavexRepositoryFactory.JACKRABBIT_REMOTE_DEFAULT_WORKSPACE, NodeConstants.SYS_WORKSPACE); + return repositoryFactory.getRepository(params); + } + + private static String getFrameworkProp(String key, String def) { + String value; + if (bundleContext != null) + value = bundleContext.getProperty(key); + else + value = System.getProperty(key); + if (value == null) + return def; + return value; + } + + private static String getFrameworkProp(String key) { + return getFrameworkProp(key, null); + } + +}