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.argeo.api.cms.CmsDeployment; import org.argeo.api.cms.CmsLog; import org.argeo.api.cms.CmsConstants; import org.argeo.jackrabbit.client.ClientDavexRepositoryFactory; import org.argeo.jcr.JcrException; import org.argeo.util.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 CmsLog log = CmsLog.getLog(JcrInitUtils.class); private final static BundleContext bundleContext = FrameworkUtil.getBundle(JcrInitUtils.class).getBundleContext(); public static void addToDeployment(CmsDeployment nodeDeployment) { // node repository // Dictionary provided = null; Dictionary provided = nodeDeployment.getProps(CmsConstants.NODE_REPOS_FACTORY_PID, CmsConstants.NODE); Dictionary nodeConfig = JcrInitUtils.getNodeRepositoryConfig(provided); // node repository is mandatory nodeDeployment.addFactoryDeployConfig(CmsConstants.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(CmsConstants.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(CmsConstants.CN, CmsConstants.NODE_REPOSITORY); return props; } public static Dictionary getRepositoryConfig(String dataModelName, Dictionary provided) { if (dataModelName.equals(CmsConstants.NODE_REPOSITORY) || dataModelName.equals(CmsConstants.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( CmsConstants.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(CmsConstants.CN, dataModelName); return props; } private static void registerRemoteInit(String uri) { try { Repository repository = createRemoteRepository(new URI(uri)); Hashtable properties = new Hashtable<>(); properties.put(CmsConstants.CN, CmsConstants.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, CmsConstants.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); } }