From: Mathieu Baudier Date: Thu, 9 Feb 2017 16:38:17 +0000 (+0100) Subject: Refactor JCR X-Git-Tag: argeo-commons-2.1.60~7 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=9b91329a1c5d7e6b5fc4fae3c21d6019318acc8e;p=lgpl%2Fargeo-commons.git Refactor JCR --- diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/JackrabbitType.java b/org.argeo.cms/src/org/argeo/cms/internal/jcr/JackrabbitType.java new file mode 100644 index 000000000..9b07b59e8 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/jcr/JackrabbitType.java @@ -0,0 +1,6 @@ +package org.argeo.cms.internal.jcr; + +/** The available Jackrabbit node types */ +enum JackrabbitType { + localfs, h2, postgresql, postgresql_ds, postgresql_cluster, memory; +} diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepoConf.java b/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepoConf.java new file mode 100644 index 000000000..429a51a58 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepoConf.java @@ -0,0 +1,69 @@ +package org.argeo.cms.internal.jcr; + +import org.argeo.osgi.metatype.EnumAD; +import org.argeo.osgi.metatype.EnumOCD; + +/** JCR repository configuration */ +public enum RepoConf implements EnumAD { + /** Repository type */ + type("localfs"), + /** Default workspace */ + @Deprecated defaultWorkspace("main"), + /** Database URL */ + dburl(null), + /** Database user */ + dbuser(null), + /** Database password */ + dbpassword(null), + + /** The identifier (can be an URL locating the repo) */ + labeledUri(null), + // + // JACKRABBIT SPECIFIC + // + /** Maximum database pool size */ + maxPoolSize(10), + /** Maximum cache size in MB */ + @Deprecated maxCacheMB(null), + /** Bundle cache size in MB */ + bundleCacheMB(8), + /** Extractor pool size */ + extractorPoolSize(0), + /** Search cache size */ + searchCacheSize(1000), + /** Max volatile index size */ + maxVolatileIndexSize(1048576), + /** Cluster id (if appropriate configuration) */ + clusterId("default"); + + /** The default value. */ + private Object def; + private String oid; + + RepoConf(String oid, Object def) { + this.oid = oid; + this.def = def; + } + + RepoConf(Object def) { + this.def = def; + } + + public Object getDefault() { + return def; + } + + @Override + public String getID() { + if (oid != null) + return oid; + return EnumAD.super.getID(); + } + + public static class OCD extends EnumOCD { + public OCD(String locale) { + super(RepoConf.class, locale); + } + } + +} diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java b/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java new file mode 100644 index 000000000..fab39fd5f --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java @@ -0,0 +1,190 @@ +package org.argeo.cms.internal.jcr; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Dictionary; +import java.util.Enumeration; +import java.util.Properties; +import java.util.UUID; + +import javax.jcr.RepositoryException; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.jackrabbit.core.RepositoryContext; +import org.apache.jackrabbit.core.RepositoryImpl; +import org.apache.jackrabbit.core.cache.CacheManager; +import org.apache.jackrabbit.core.config.RepositoryConfig; +import org.apache.jackrabbit.core.config.RepositoryConfigurationParser; +import org.argeo.cms.CmsException; +import org.argeo.cms.internal.kernel.CmsPaths; +import org.argeo.jcr.ArgeoJcrException; +import org.argeo.node.NodeConstants; +import org.xml.sax.InputSource; + +/** Can interpret properties in order to create an actual JCR repository. */ +public class RepositoryBuilder { + private final static Log log = LogFactory.getLog(RepositoryBuilder.class); + + public RepositoryContext createRepositoryContext(Dictionary properties) throws RepositoryException { + RepositoryConfig repositoryConfig = createRepositoryConfig(properties); + RepositoryContext repositoryContext = createJackrabbitRepository(repositoryConfig); + RepositoryImpl repository = repositoryContext.getRepository(); + + // cache + Object maxCacheMbStr = prop(properties, RepoConf.maxCacheMB); + if (maxCacheMbStr != null) { + Integer maxCacheMB = Integer.parseInt(maxCacheMbStr.toString()); + CacheManager cacheManager = repository.getCacheManager(); + cacheManager.setMaxMemory(maxCacheMB * 1024l * 1024l); + cacheManager.setMaxMemoryPerCache((maxCacheMB / 4) * 1024l * 1024l); + } + + return repositoryContext; + } + + RepositoryConfig createRepositoryConfig(Dictionary properties) throws RepositoryException { + JackrabbitType type = JackrabbitType.valueOf(prop(properties, RepoConf.type).toString()); + ClassLoader cl = getClass().getClassLoader(); + InputStream in = null; + try { + final String base = "/org/argeo/cms/internal/jcr"; + in = cl.getResourceAsStream(base + "/repository-" + type.name() + ".xml"); + + if (in == null) + throw new ArgeoJcrException("Repository configuration not found"); + InputSource config = new InputSource(in); + Properties jackrabbitVars = getConfigurationProperties(type, properties); + RepositoryConfig repositoryConfig = RepositoryConfig.create(config, jackrabbitVars); + return repositoryConfig; + } finally { + IOUtils.closeQuietly(in); + } + } + + private Properties getConfigurationProperties(JackrabbitType type, Dictionary properties) { + Properties props = new Properties(); + for (Enumeration keys = properties.keys(); keys.hasMoreElements();) { + String key = keys.nextElement(); + props.put(key, properties.get(key)); + } + + // home + String homeUri = props.getProperty(RepoConf.labeledUri.name()); + Path homePath; + if (homeUri == null) { + String cn = props.getProperty(NodeConstants.CN); + assert cn != null; + homePath = CmsPaths.getRepoDirPath(cn); + } else { + try { + homePath = Paths.get(new URI(homeUri)).toAbsolutePath(); + } catch (URISyntaxException e) { + throw new CmsException("Invalid repository home URI", e); + } + } + Path rootUuidPath = homePath.resolve("repository/meta/rootUUID"); + if (!Files.exists(rootUuidPath)) { + try { + Files.createDirectories(rootUuidPath.getParent()); + Files.write(rootUuidPath, UUID.randomUUID().toString().getBytes()); + } catch (IOException e) { + log.error("Could not set rootUUID", e); + } + } + File homeDir = homePath.toFile(); + homeDir.mkdirs(); + // home cannot be overridden + props.put(RepositoryConfigurationParser.REPOSITORY_HOME_VARIABLE, homePath.toString()); + + Path indexBase = CmsPaths.getRepoIndexBase(); + props.put("indexBase", indexBase.toString()); + + // common + setProp(props, RepoConf.defaultWorkspace); + setProp(props, RepoConf.maxPoolSize); + // Jackrabbit defaults + setProp(props, RepoConf.bundleCacheMB); + // See http://wiki.apache.org/jackrabbit/Search + setProp(props, RepoConf.extractorPoolSize); + setProp(props, RepoConf.searchCacheSize); + setProp(props, RepoConf.maxVolatileIndexSize); + + // specific + String dburl; + switch (type) { + case h2: + dburl = "jdbc:h2:" + homeDir.getPath() + "/h2/repository"; + setProp(props, RepoConf.dburl, dburl); + setProp(props, RepoConf.dbuser, "sa"); + setProp(props, RepoConf.dbpassword, ""); + break; + case postgresql: + case postgresql_ds: + case postgresql_cluster: + dburl = "jdbc:postgresql://localhost/demo"; + setProp(props, RepoConf.dburl, dburl); + setProp(props, RepoConf.dbuser, "argeo"); + setProp(props, RepoConf.dbpassword, "argeo"); + break; + case memory: + break; + case localfs: + break; + default: + throw new ArgeoJcrException("Unsupported node type " + type); + } + return props; + } + + private void setProp(Properties props, RepoConf key, String def) { + Object value = props.get(key.name()); + if (value == null) + value = def; + if (value == null) + value = key.getDefault(); + if (value != null) + props.put(key.name(), value.toString()); + } + + private void setProp(Properties props, RepoConf key) { + setProp(props, key, null); + } + + private String prop(Dictionary properties, RepoConf key) { + Object value = properties.get(key.name()); + if (value == null) + return key.getDefault() != null ? key.getDefault().toString() : null; + else + return value.toString(); + } + + private RepositoryContext createJackrabbitRepository(RepositoryConfig repositoryConfig) throws RepositoryException { + ClassLoader currentContextCl = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(RepositoryBuilder.class.getClassLoader()); + try { + long begin = System.currentTimeMillis(); + // + // Actual repository creation + // + RepositoryContext repositoryContext = RepositoryContext.create(repositoryConfig); + + double duration = ((double) (System.currentTimeMillis() - begin)) / 1000; + if (log.isTraceEnabled()) + log.trace( + "Created Jackrabbit repository in " + duration + " s, home: " + repositoryConfig.getHomeDir()); + + return repositoryContext; + } finally { + Thread.currentThread().setContextClassLoader(currentContextCl); + } + } + +} diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-h2.xml b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-h2.xml new file mode 100644 index 000000000..05267621f --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-h2.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-localfs.xml b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-localfs.xml new file mode 100644 index 000000000..3d2470863 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-localfs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-memory.xml b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-memory.xml new file mode 100644 index 000000000..ecee5bdad --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-memory.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql.xml b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql.xml new file mode 100644 index 000000000..967782820 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster.xml b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster.xml new file mode 100644 index 000000000..d8c23e733 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_ds.xml b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_ds.xml new file mode 100644 index 000000000..07a0d0428 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_ds.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsPaths.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsPaths.java new file mode 100644 index 000000000..d4dbc8163 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsPaths.java @@ -0,0 +1,17 @@ +package org.argeo.cms.internal.kernel; + +import java.nio.file.Path; + +public class CmsPaths { + public static Path getRepoDirPath(String cn) { + return KernelUtils.getOsgiInstancePath(KernelConstants.DIR_REPOS + '/' + cn); + } + + public static Path getRepoIndexBase() { + return KernelUtils.getOsgiInstancePath(KernelConstants.DIR_REPOS); + } + + private CmsPaths() { + + } +} diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/FirstInit.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/FirstInit.java index a8ef66a90..8bd348f8e 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/FirstInit.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/FirstInit.java @@ -22,6 +22,7 @@ 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.internal.jcr.RepoConf; import org.argeo.node.NodeConstants; import org.argeo.osgi.useradmin.UserAdminConf; import org.eclipse.equinox.http.jetty.JettyConstants; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitType.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitType.java deleted file mode 100644 index b9671f2a4..000000000 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitType.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.argeo.cms.internal.kernel; - -/** The available Jackrabbit node types */ -@Deprecated -public enum JackrabbitType { - localfs, h2, postgresql, postgresql_ds,postgresql_cluster, memory; -} diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java deleted file mode 100644 index 836e35344..000000000 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java +++ /dev/null @@ -1,759 +0,0 @@ -package org.argeo.cms.internal.kernel; - -/** - * Argeo CMS Kernel. Responsible for : - *
    - *
  • security
  • - *
  • provisioning
  • - *
  • transaction
  • - *
  • logging
  • - *
  • local and remote file systems access
  • - *
  • OS access
  • - *
- */ -@Deprecated -final class Kernel{ -//implements KernelHeader, KernelConstants { -// /* -// * SERVICE REFERENCES -// */ -// // private ServiceReference configurationAdmin; -// private final ServiceTracker configurationAdmin; -// private final ServiceTracker logReaderService; -// private final ServiceTracker httpService; -// private final ConditionalPermissionAdmin permissionAdmin; -// /* -// * REGISTERED SERVICES -// */ -// private ServiceRegistration loggerReg; -// private ServiceRegistration tmReg; -// private ServiceRegistration utReg; -// private ServiceRegistration tsrReg; -// private ServiceRegistration repositoryReg; -// private ServiceRegistration repositoryFactoryReg; -// private ServiceRegistration userAdminReg; -// -// /* -// * SERVICES IMPLEMENTATIONS -// */ -// private NodeLogger logger; -// private BitronixTransactionManager transactionManager; -// private BitronixTransactionSynchronizationRegistry transactionSynchronizationRegistry; -// private NodeRepositoryFactory repositoryFactory; -// private Repository repository; -// private NodeUserAdmin userAdmin; -// -// // Members -// private final BundleContext bc;// = Activator.getBundleContext(); -// private final NodeSecurity nodeSecurity; -// -// private final static Log log = LogFactory.getLog(Kernel.class); -// ThreadGroup threadGroup = new ThreadGroup(Kernel.class.getSimpleName()); -// private DataHttp dataHttp; -// private NodeHttp nodeHttp; -// private KernelThread kernelThread; -// -// private Locale defaultLocale = null; -// private List locales = null; -// -// public Kernel() { -// // KernelUtils.logFrameworkProperties(log); -// nodeSecurity = new NodeSecurity(); -// bc = FrameworkUtil.getBundle(getClass()).getBundleContext(); -// configurationAdmin = new ServiceTracker(bc, ConfigurationAdmin.class, -// new PrepareStc()); -// configurationAdmin.open(); -// logReaderService = new ServiceTracker(bc, LogReaderService.class, -// new PrepareStc()); -// logReaderService.open(); -// httpService = new ServiceTracker(bc, HttpService.class, new PrepareHttpStc()); -// httpService.open(); -// -// permissionAdmin = bc.getService(bc.getServiceReference(ConditionalPermissionAdmin.class)); -// } -// -// /* -// * PACKAGE RESTRICTED INTERFACE -// */ -// Subject getKernelSubject() { -// return nodeSecurity.getKernelSubject(); -// } -// -// /* -// * INITIALISATION -// */ -// -// final void init() { -// Subject.doAs(nodeSecurity.getKernelSubject(), new PrivilegedAction() { -// @Override -// public Void run() { -// doInit(); -// return null; -// } -// }); -// } -// -// private void doInit() { -// long begin = System.currentTimeMillis(); -// // Use CMS bundle classloader -// ClassLoader currentContextCl = Thread.currentThread().getContextClassLoader(); -// Thread.currentThread().setContextClassLoader(Kernel.class.getClassLoader()); -// try { -// // Listen to service publication (also ours) -// // bc.addServiceListener(Kernel.this); -// -// if (nodeSecurity.isFirstInit()) -// firstInit(); -// -// defaultLocale = new Locale(getFrameworkProp(NodeConstants.I18N_DEFAULT_LOCALE, ENGLISH.getLanguage())); -// locales = asLocaleList(getFrameworkProp(NodeConstants.I18N_LOCALES)); -// -// // ServiceTracker -// // logReaderService = new ServiceTracker( -// // bc, LogReaderService.class, null); -// // logReaderService.open(); -// logger = new NodeLogger(logReaderService.getService()); -// // logReaderService.close(); -// -// if (isMaintenance()) -// maintenanceInit(); -// else -// normalInit(); -// } catch (Throwable e) { -// log.error("Cannot initialize Argeo CMS", e); -// throw new ArgeoException("Cannot initialize", e); -// } finally { -// Thread.currentThread().setContextClassLoader(currentContextCl); -// // FIXME better manage lifecycle. -// try { -// new LoginContext(LOGIN_CONTEXT_KERNEL, nodeSecurity.getKernelSubject()).logout(); -// } catch (LoginException e) { -// e.printStackTrace(); -// } -// } -// -// long jvmUptime = ManagementFactory.getRuntimeMXBean().getUptime(); -// log.info("## ARGEO CMS UP in " + (jvmUptime / 1000) + "." + (jvmUptime % 1000) + "s ##"); -// long initDuration = System.currentTimeMillis() - begin; -// if (log.isTraceEnabled()) -// log.trace("Kernel initialization took " + initDuration + "ms"); -// directorsCut(initDuration); -// } -// -// private void normalInit() { -// ConfigurationAdmin conf = findConfigurationAdmin(); -// -// // HTTP -// initWebServer(conf); -// // ServiceReference sr = -// // bc.getServiceReference(ExtendedHttpService.class); -// // if (sr != null) -// // addHttpService(sr); -// // else -// // log.warn("No http service found"); -// -// // Initialise services -// initTransactionManager(); -// -// RepositoryServiceFactory jrsf = new RepositoryServiceFactory(); -// String[] clazzes = { ManagedServiceFactory.class.getName() }; -// Hashtable serviceProps = new Hashtable(); -// serviceProps.put(Constants.SERVICE_PID, ArgeoJcrConstants.JACKRABBIT_REPO_FACTORY_PID); -// bc.registerService(clazzes, jrsf, serviceProps); -// -// try { -// Configuration nodeConf = conf.createFactoryConfiguration(ArgeoJcrConstants.JACKRABBIT_REPO_FACTORY_PID); -// // Configuration nodeConf = -// // conf.getConfiguration(ArgeoJcrConstants.REPO_PID_NODE); -// if (nodeConf.getProperties() == null) { -// Dictionary props = getNodeConfigFromFrameworkProperties(); -// if (props == null) { -// // TODO interactive configuration -// if (log.isDebugEnabled()) -// log.debug("No argeo.node.repo.type=localfs|h2|postgresql|memory" -// + " property defined, entering interactive mode..."); -// return; -// } -// // props.put(ConfigurationAdmin.SERVICE_FACTORYPID, -// // ArgeoJcrConstants.JACKRABBIT_REPO_FACTORY_PID); -// props.put(Constants.SERVICE_PID, ArgeoJcrConstants.REPO_PID_NODE); -// nodeConf.update(props); -// } -// } catch (IOException e) { -// throw new CmsException("Cannot get configuration", e); -// } -// -// // ManagedJackrabbitRepository nodeRepo = new -// // ManagedJackrabbitRepository(); -// // String[] clazzes = { ManagedService.class.getName(), -// // Repository.class.getName(), -// // JackrabbitRepository.class.getName() }; -// // Hashtable serviceProps = new Hashtable(); -// // serviceProps.put(Constants.SERVICE_PID, -// // ArgeoJcrConstants.REPO_PID_NODE); -// // serviceProps.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, -// // ArgeoJcrConstants.ALIAS_NODE); -// // repositoryReg = bc.registerService(clazzes, nodeRepo, serviceProps); -// // nodeRepo.waitForInit(); -// -// ServiceTracker jackrabbitSt = new ServiceTracker<>(bc, -// JackrabbitRepository.class, new ServiceTrackerCustomizer() { -// -// @Override -// public JackrabbitRepository addingService(ServiceReference reference) { -// JackrabbitRepository nodeRepo = bc.getService(reference); -// // new -// // JackrabbitDataModel(bc).prepareDataModel(nodeRepo); -// prepareDataModel(KernelUtils.openAdminSession(nodeRepo)); -// -// // repository = (JackrabbitRepository) -// // bc.getService(repositoryReg.getReference()); -// repository = new HomeRepository(nodeRepo); -// Hashtable regProps = new Hashtable(); -// regProps.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, ArgeoJcrConstants.ALIAS_NODE); -// repositoryReg = (ServiceRegistration) bc.registerService(Repository.class, -// repository, regProps); -// -// // if (repository == null) -// // repository = new NodeRepository(); -// if (repositoryFactory == null) { -// repositoryFactory = new NodeRepositoryFactory(); -// // repositoryFactory.setBundleContext(bc); -// repositoryFactoryReg = bc.registerService(RepositoryFactory.class, repositoryFactory, null); -// } -// userAdmin = new NodeUserAdmin(transactionManager, repository); -// userAdminReg = bc.registerService(UserAdmin.class, userAdmin, userAdmin.currentState()); -// return nodeRepo; -// } -// -// @Override -// public void modifiedService(ServiceReference reference, -// JackrabbitRepository service) { -// } -// -// @Override -// public void removedService(ServiceReference reference, -// JackrabbitRepository service) { -// } -// }); -// jackrabbitSt.open(); -// -// // new JackrabbitDataModel(bc).prepareDataModel(nodeRepo); -// // prepareDataModel(nodeRepo); -// // -// // repository = (JackrabbitRepository) -// // bc.getService(repositoryReg.getReference()); -// // -// //// if (repository == null) -// //// repository = new NodeRepository(); -// // if (repositoryFactory == null) { -// // repositoryFactory = new OsgiJackrabbitRepositoryFactory(); -// // repositoryFactory.setBundleContext(bc); -// // } -// // userAdmin = new NodeUserAdmin(transactionManager, repository); -// -// // ADMIN UIs -// UserUi userUi = new UserUi(); -// Hashtable props = new Hashtable(); -// props.put("contextName", "user"); -// bc.registerService(ApplicationConfiguration.class, userUi, props); -// -// // Bundle rapWorkbenchBundle = -// // findBundle("org.eclipse.rap.ui.workbench"); -// // if (rapWorkbenchBundle != null) -// // try { -// // Class clss = rapWorkbenchBundle -// // .loadClass("org.eclipse.rap.ui.internal.servlet.WorkbenchApplicationConfiguration"); -// // -// // Hashtable rapWorkbenchProps = new Hashtable(); -// // rapWorkbenchProps.put("contextName", "ui"); -// // ApplicationConfiguration workbenchApplicationConfiguration = -// // (ApplicationConfiguration) clss -// // .newInstance(); -// // bc.registerService(ApplicationConfiguration.class, -// // workbenchApplicationConfiguration, -// // rapWorkbenchProps); -// // } catch (Exception e) { -// // log.error("Cannot initalize RAP workbench", e); -// // } -// -// // Kernel thread -//// kernelThread = new KernelThread(this); -//// kernelThread.setContextClassLoader(Kernel.class.getClassLoader()); -//// kernelThread.start(); -// -// // Publish services to OSGi -// publish(); -// } -// -// private Dictionary getNodeConfigFromFrameworkProperties() { -// String repoType = KernelUtils.getFrameworkProp(NodeConstants.NODE_REPO_PROP_PREFIX + RepoConf.type.name()); -// if (repoType == null) -// return null; -// -// Hashtable props = new Hashtable(); -// for (RepoConf repoConf : RepoConf.values()) { -// String value = KernelUtils.getFrameworkProp(NodeConstants.NODE_REPO_PROP_PREFIX + repoConf.name()); -// if (value != null) -// props.put(repoConf.name(), value); -// } -// return props; -// } -// -// /** Session is logged out. */ -// private void prepareDataModel(Session adminSession) { -// try { -// Set processed = new HashSet(); -// bundles: for (Bundle bundle : bc.getBundles()) { -// BundleWiring wiring = bundle.adapt(BundleWiring.class); -// if (wiring == null) { -// if (log.isTraceEnabled()) -// log.error("No wiring for " + bundle.getSymbolicName()); -// continue bundles; -// } -// processWiring(adminSession, wiring, processed); -// } -// } finally { -// JcrUtils.logoutQuietly(adminSession); -// } -// } -// -// private void processWiring(Session adminSession, BundleWiring wiring, Set processed) { -// // recursively process requirements first -// List requiredWires = wiring.getRequiredWires(CMS_DATA_MODEL_NAMESPACE); -// for (BundleWire wire : requiredWires) { -// processWiring(adminSession, wire.getProviderWiring(), processed); -// // registerCnd(adminSession, wire.getCapability(), processed); -// } -// List capabilities = wiring.getCapabilities(CMS_DATA_MODEL_NAMESPACE); -// for (BundleCapability capability : capabilities) { -// registerCnd(adminSession, capability, processed); -// } -// } -// -// private void registerCnd(Session adminSession, BundleCapability capability, Set processed) { -// Map attrs = capability.getAttributes(); -// String name = attrs.get(DataModelNamespace.CAPABILITY_NAME_ATTRIBUTE).toString(); -// if (processed.contains(name)) { -// if (log.isTraceEnabled()) -// log.trace("Data model " + name + " has already been processed"); -// return; -// } -// String path = attrs.get(DataModelNamespace.CAPABILITY_CND_ATTRIBUTE).toString(); -// URL url = capability.getRevision().getBundle().getResource(path); -// try (Reader reader = new InputStreamReader(url.openStream())) { -// CndImporter.registerNodeTypes(reader, adminSession, true); -// processed.add(name); -// if (log.isDebugEnabled()) -// log.debug("Registered CND " + url); -// } catch (Exception e) { -// throw new CmsException("Cannot read cnd " + url, e); -// } -// -// Hashtable properties = new Hashtable<>(); -// properties.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, name); -// bc.registerService(Repository.class, adminSession.getRepository(), properties); -// if (log.isDebugEnabled()) -// log.debug("Published data model " + name); -// } -// -// private boolean isMaintenance() { -// String startLevel = KernelUtils.getFrameworkProp("osgi.startLevel"); -// if (startLevel == null) -// return false; -// int bundleStartLevel = bc.getBundle().adapt(BundleStartLevel.class).getStartLevel(); -// // int frameworkStartLevel = -// // bc.getBundle(0).adapt(BundleStartLevel.class) -// // .getStartLevel(); -// int frameworkStartLevel = Integer.parseInt(startLevel); -// // int frameworkStartLevel = bc.getBundle(0) -// // .adapt(FrameworkStartLevel.class).getStartLevel(); -// return bundleStartLevel == frameworkStartLevel; -// } -// -// private void maintenanceInit() { -// log.info("## MAINTENANCE ##"); -// // bc.addServiceListener(Kernel.this); -// initWebServer(null); -// MaintenanceUi maintenanceUi = new MaintenanceUi(); -// Hashtable props = new Hashtable(); -// props.put("contextName", "maintenance"); -// bc.registerService(ApplicationConfiguration.class, maintenanceUi, props); -// } -// -// private void firstInit() { -// log.info("## FIRST INIT ##"); -// String nodeInit = getFrameworkProp(NodeConstants.NODE_INIT); -// if (nodeInit == null) -// nodeInit = "../../init"; -// if (nodeInit.startsWith("http")) { -// // remoteFirstInit(nodeInit); -// return; -// } -// 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, 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); -// } -// } -// -// // private void remoteFirstInit(String uri) { -// // try { -// // repository = new NodeRepository(); -// // repositoryFactory = new OsgiJackrabbitRepositoryFactory(); -// // Repository remoteRepository = -// // ArgeoJcrUtils.getRepositoryByUri(repositoryFactory, uri); -// // Session remoteSession = remoteRepository.login(new -// // SimpleCredentials("root", "demo".toCharArray()), "main"); -// // Session localSession = this.repository.login(); -// // // FIXME register node type -// // // if (false) -// // // CndImporter.registerNodeTypes(null, localSession); -// // ByteArrayOutputStream out = new ByteArrayOutputStream(); -// // remoteSession.exportSystemView("/", out, true, false); -// // ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); -// // localSession.importXML("/", in, -// // ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW); -// // // JcrUtils.copy(remoteSession.getRootNode(), -// // // localSession.getRootNode()); -// // } catch (Exception e) { -// // throw new CmsException("Cannot first init from " + uri, e); -// // } -// // } -// -// /** Can be null */ -// private ConfigurationAdmin findConfigurationAdmin() { -// // configurationAdmin = -// // bc.getServiceReference(ConfigurationAdmin.class); -// // if (configurationAdmin == null) { -// // return null; -// // } -// // return bc.getService(configurationAdmin); -// return configurationAdmin.getService(); -// } -// -// /** Can be null */ -// Bundle findBundle(String symbolicName) { -// for (Bundle b : bc.getBundles()) -// if (b.getSymbolicName().equals(symbolicName)) -// return b; -// return null; -// } -// -// private void initTransactionManager() { -// bitronix.tm.Configuration tmConf = TransactionManagerServices.getConfiguration(); -// tmConf.setServerId(getFrameworkProp(FRAMEWORK_UUID)); -// -// // File tmBaseDir = new File(getFrameworkProp(TRANSACTIONS_HOME, -// // getOsgiInstancePath(DIR_TRANSACTIONS))); -// Bundle bitronixBundle = FrameworkUtil.getBundle(bitronix.tm.Configuration.class); -// File tmBaseDir = bitronixBundle.getDataFile(DIR_TRANSACTIONS); -// // File tmBaseDir = bc.getDataFile(DIR_TRANSACTIONS); -// File tmDir1 = new File(tmBaseDir, "btm1"); -// tmDir1.mkdirs(); -// tmConf.setLogPart1Filename(new File(tmDir1, tmDir1.getName() + ".tlog").getAbsolutePath()); -// File tmDir2 = new File(tmBaseDir, "btm2"); -// tmDir2.mkdirs(); -// tmConf.setLogPart2Filename(new File(tmDir2, tmDir2.getName() + ".tlog").getAbsolutePath()); -// transactionManager = getTransactionManager(); -// transactionSynchronizationRegistry = getTransactionSynchronizationRegistry(); -// } -// -// private void initWebServer(final ConfigurationAdmin conf) { -// String httpPort = getFrameworkProp("org.osgi.service.http.port"); -// String httpsPort = getFrameworkProp("org.osgi.service.http.port.secure"); -// try { -// if (httpPort != null || httpsPort != null) { -// final Hashtable jettyProps = new Hashtable(); -// if (httpPort != null) { -// jettyProps.put(JettyConstants.HTTP_PORT, httpPort); -// jettyProps.put(JettyConstants.HTTP_ENABLED, true); -// } -// if (httpsPort != null) { -// jettyProps.put(JettyConstants.HTTPS_PORT, httpsPort); -// jettyProps.put(JettyConstants.HTTPS_ENABLED, true); -// jettyProps.put(JettyConstants.SSL_KEYSTORETYPE, "PKCS12"); -// jettyProps.put(JettyConstants.SSL_KEYSTORE, -// nodeSecurity.getHttpServerKeyStore().getCanonicalPath()); -// jettyProps.put(JettyConstants.SSL_PASSWORD, "changeit"); -// jettyProps.put(JettyConstants.SSL_WANTCLIENTAUTH, true); -// } -// if (conf != null) { -// // TODO make filter more generic -// String filter = "(" + JettyConstants.HTTP_PORT + "=" + httpPort + ")"; -// if (conf.listConfigurations(filter) != null) -// return; -// Configuration jettyConf = conf.createFactoryConfiguration(JETTY_FACTORY_PID, null); -// jettyConf.update(jettyProps); -// -// } else { -// JettyConfigurator.startServer("default", jettyProps); -// } -// } -// } catch (Exception e) { -// throw new CmsException("Cannot initialize web server on " + httpPortsMsg(httpPort, httpsPort), e); -// } -// } -// -// private void publish() { -// -// // Logging -// loggerReg = bc.registerService(ArgeoLogger.class, logger, null); -// // Transaction -// tmReg = bc.registerService(TransactionManager.class, transactionManager, null); -// utReg = bc.registerService(UserTransaction.class, transactionManager, null); -// tsrReg = bc.registerService(TransactionSynchronizationRegistry.class, transactionSynchronizationRegistry, null); -// // User admin -// // userAdminReg = bc.registerService(UserAdmin.class, userAdmin, -// // userAdmin.currentState()); -// // JCR -// // Hashtable regProps = new Hashtable(); -// // regProps.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, -// // ArgeoJcrConstants.ALIAS_NODE); -// // repositoryReg = (ServiceRegistration) -// // bc.registerService(Repository.class, repository, -// // regProps); -// // repositoryFactoryReg = bc.registerService(RepositoryFactory.class, -// // repositoryFactory, null); -// } -// -// void destroy() { -// long begin = System.currentTimeMillis(); -// unpublish(); -// -// kernelThread.destroyAndJoin(); -// -// if (dataHttp != null) -// dataHttp.destroy(); -// if (nodeHttp != null) -// nodeHttp.destroy(); -// if (userAdmin != null) -// userAdmin.destroy(); -// // if (repository != null) -// // repository.shutdown(); -// if (transactionManager != null) -// transactionManager.shutdown(); -// -// // bc.removeServiceListener(this); -// -// // Clean hanging threads from Jackrabbit -// TransientFileFactory.shutdown(); -// -// // Clean hanging Gogo shell thread -// new GogoShellKiller().start(); -// -// nodeSecurity.destroy(); -// long duration = System.currentTimeMillis() - begin; -// log.info("## ARGEO CMS DOWN in " + (duration / 1000) + "." + (duration % 1000) + "s ##"); -// } -// -// private void unpublish() { -// userAdminReg.unregister(); -// repositoryFactoryReg.unregister(); -// repositoryReg.unregister(); -// tmReg.unregister(); -// utReg.unregister(); -// tsrReg.unregister(); -// loggerReg.unregister(); -// } -// -// // @Override -// // public void serviceChanged(ServiceEvent event) { -// // ServiceReference sr = event.getServiceReference(); -// // Object service = bc.getService(sr); -// // if (service instanceof Repository) { -// // Object jcrRepoAlias = -// // sr.getProperty(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS); -// // if (jcrRepoAlias != null) {// JCR repository -// // String alias = jcrRepoAlias.toString(); -// // Repository repository = (Repository) bc.getService(sr); -// // Map props = new HashMap(); -// // for (String key : sr.getPropertyKeys()) -// // props.put(key, sr.getProperty(key)); -// // if (ServiceEvent.REGISTERED == event.getType()) { -// // try { -// // // repositoryFactory.register(repository, props); -// // dataHttp.registerRepositoryServlets(alias, repository); -// // } catch (Exception e) { -// // throw new CmsException("Could not publish JCR repository " + alias, e); -// // } -// // } else if (ServiceEvent.UNREGISTERING == event.getType()) { -// // // repositoryFactory.unregister(repository, props); -// // dataHttp.unregisterRepositoryServlets(alias); -// // } -// // } -// // } -// // // else if (service instanceof ExtendedHttpService) { -// // // if (ServiceEvent.REGISTERED == event.getType()) { -// // // addHttpService(sr); -// // // } else if (ServiceEvent.UNREGISTERING == event.getType()) { -// // // dataHttp.destroy(); -// // // dataHttp = null; -// // // } -// // // } -// // } -// -// private HttpService addHttpService(ServiceReference sr) { -// // for (String key : sr.getPropertyKeys()) -// // log.debug(key + "=" + sr.getProperty(key)); -// HttpService httpService = bc.getService(sr); -// // TODO find constants -// Object httpPort = sr.getProperty("http.port"); -// Object httpsPort = sr.getProperty("https.port"); -// dataHttp = new DataHttp(httpService); -// nodeHttp = new NodeHttp(httpService, bc); -// if (log.isDebugEnabled()) -// log.debug(httpPortsMsg(httpPort, httpsPort)); -// return httpService; -// } -// -// private String httpPortsMsg(Object httpPort, Object httpsPort) { -// return "HTTP " + httpPort + (httpsPort != null ? " - HTTPS " + httpsPort : ""); -// } -// -// @Override -// public Locale getDefaultLocale() { -// return defaultLocale; -// } -// -// /** Can be null. */ -// @Override -// public List getLocales() { -// return locales; -// } -// -// final private static void directorsCut(long initDuration) { -// // final long ms = 128l + (long) (Math.random() * 128d); -// long ms = initDuration / 100; -// log.info("Spend " + ms + "ms" + " reflecting on the progress brought to mankind" + " by Free Software..."); -// long beginNano = System.nanoTime(); -// try { -// Thread.sleep(ms, 0); -// } catch (InterruptedException e) { -// // silent -// } -// long durationNano = System.nanoTime() - beginNano; -// final double M = 1000d * 1000d; -// double sleepAccuracy = ((double) durationNano) / (ms * M); -// if (log.isDebugEnabled()) -// log.debug("Sleep accuracy: " + String.format("%.2f", 100 - (sleepAccuracy * 100 - 100)) + " %"); -// } -// -// private class PrepareStc implements ServiceTrackerCustomizer { -// -// @Override -// public T addingService(ServiceReference reference) { -// T service = bc.getService(reference); -// System.out.println("addingService " + service); -// return service; -// } -// -// @Override -// public void modifiedService(ServiceReference reference, T service) { -// System.out.println("modifiedService " + service); -// } -// -// @Override -// public void removedService(ServiceReference reference, T service) { -// System.out.println("removedService " + service); -// } -// -// } -// -// private class PrepareHttpStc implements ServiceTrackerCustomizer { -// -// @Override -// public HttpService addingService(ServiceReference reference) { -// HttpService httpService = addHttpService(reference); -// return httpService; -// } -// -// @Override -// public void modifiedService(ServiceReference reference, HttpService service) { -// } -// -// @Override -// public void removedService(ServiceReference reference, HttpService service) { -// dataHttp.destroy(); -// dataHttp = null; -// } -// -// } -// -// /** Workaround for blocking Gogo shell by system shutdown. */ -// private class GogoShellKiller extends Thread { -// -// public GogoShellKiller() { -// super("Gogo shell killer"); -// setDaemon(true); -// } -// -// @Override -// public void run() { -// ThreadGroup rootTg = getRootThreadGroup(null); -// Thread gogoShellThread = findGogoShellThread(rootTg); -// if (gogoShellThread == null) -// return; -// while (getNonDaemonCount(rootTg) > 2) { -// try { -// Thread.sleep(100); -// } catch (InterruptedException e) { -// // silent -// } -// } -// gogoShellThread = findGogoShellThread(rootTg); -// if (gogoShellThread == null) -// return; -// System.exit(0); -// } -// } -// -// private static ThreadGroup getRootThreadGroup(ThreadGroup tg) { -// if (tg == null) -// tg = Thread.currentThread().getThreadGroup(); -// if (tg.getParent() == null) -// return tg; -// else -// return getRootThreadGroup(tg.getParent()); -// } -// -// private static int getNonDaemonCount(ThreadGroup rootThreadGroup) { -// Thread[] threads = new Thread[rootThreadGroup.activeCount()]; -// rootThreadGroup.enumerate(threads); -// int nonDameonCount = 0; -// for (Thread t : threads) -// if (t != null && !t.isDaemon()) -// nonDameonCount++; -// return nonDameonCount; -// } -// -// private static Thread findGogoShellThread(ThreadGroup rootThreadGroup) { -// Thread[] threads = new Thread[rootThreadGroup.activeCount()]; -// rootThreadGroup.enumerate(threads, true); -// for (Thread thread : threads) { -// if (thread.getName().equals("Gogo shell")) -// return thread; -// } -// return null; -// } - -} \ No newline at end of file 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 5b1df1708..5d4979791 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 @@ -9,7 +9,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.security.PrivilegedAction; import java.util.Dictionary; -import java.util.Enumeration; import java.util.Hashtable; import java.util.Properties; import java.util.TreeMap; @@ -21,7 +20,6 @@ import javax.jcr.Session; import javax.security.auth.Subject; import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; -import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.argeo.cms.CmsException; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepoConf.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepoConf.java deleted file mode 100644 index 111c86c4a..000000000 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepoConf.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.argeo.cms.internal.kernel; - -import org.argeo.osgi.metatype.EnumAD; -import org.argeo.osgi.metatype.EnumOCD; - -/** JCR repository configuration */ -enum RepoConf implements EnumAD { - /** Repository type */ - type("localfs"), - /** Default workspace */ - @Deprecated defaultWorkspace("main"), - /** Database URL */ - dburl(null), - /** Database user */ - dbuser(null), - /** Database password */ - dbpassword(null), - - /** The identifier (can be an URL locating the repo) */ - labeledUri(null), - // - // JACKRABBIT SPECIFIC - // - /** Maximum database pool size */ - maxPoolSize(10), - /** Maximum cache size in MB */ - @Deprecated maxCacheMB(null), - /** Bundle cache size in MB */ - bundleCacheMB(8), - /** Extractor pool size */ - extractorPoolSize(0), - /** Search cache size */ - searchCacheSize(1000), - /** Max volatile index size */ - maxVolatileIndexSize(1048576), - /** Cluster id (if appropriate configuration) */ - clusterId("default"); - - /** The default value. */ - private Object def; - private String oid; - - RepoConf(String oid, Object def) { - this.oid = oid; - this.def = def; - } - - RepoConf(Object def) { - this.def = def; - } - - public Object getDefault() { - return def; - } - - @Override - public String getID() { - if (oid != null) - return oid; - return EnumAD.super.getID(); - } - - public static class OCD extends EnumOCD { - public OCD(String locale) { - super(RepoConf.class, locale); - } - } - -} diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryBuilder.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryBuilder.java deleted file mode 100644 index f866c2b99..000000000 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryBuilder.java +++ /dev/null @@ -1,216 +0,0 @@ -package org.argeo.cms.internal.kernel; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Dictionary; -import java.util.Enumeration; -import java.util.Properties; -import java.util.UUID; - -import javax.jcr.RepositoryException; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.jackrabbit.core.RepositoryContext; -import org.apache.jackrabbit.core.RepositoryImpl; -import org.apache.jackrabbit.core.cache.CacheManager; -import org.apache.jackrabbit.core.config.RepositoryConfig; -import org.apache.jackrabbit.core.config.RepositoryConfigurationParser; -import org.argeo.cms.CmsException; -import org.argeo.jcr.ArgeoJcrException; -import org.argeo.node.NodeConstants; -import org.xml.sax.InputSource; - -/** Can interpret properties in order to create an actual JCR repository. */ -class RepositoryBuilder { - private final static Log log = LogFactory.getLog(RepositoryBuilder.class); - - RepositoryContext createRepositoryContext(Dictionary properties) throws RepositoryException { - RepositoryConfig repositoryConfig = createRepositoryConfig(properties); - RepositoryContext repositoryContext = createJackrabbitRepository(repositoryConfig); - RepositoryImpl repository = repositoryContext.getRepository(); - - // cache - Object maxCacheMbStr = prop(properties, RepoConf.maxCacheMB); - if (maxCacheMbStr != null) { - Integer maxCacheMB = Integer.parseInt(maxCacheMbStr.toString()); - CacheManager cacheManager = repository.getCacheManager(); - cacheManager.setMaxMemory(maxCacheMB * 1024l * 1024l); - cacheManager.setMaxMemoryPerCache((maxCacheMB / 4) * 1024l * 1024l); - } - - return repositoryContext; - } - - RepositoryConfig createRepositoryConfig(Dictionary properties) throws RepositoryException { - JackrabbitType type = JackrabbitType.valueOf(prop(properties, RepoConf.type).toString()); - ClassLoader cl = getClass().getClassLoader(); - InputStream in = null; - try { - final String base = "/org/argeo/cms/internal/kernel"; -// switch (type) { -// case h2: -// in = cl.getResourceAsStream(base + "/repository-h2.xml"); -// break; -// case postgresql: -// in = cl.getResourceAsStream(base + "/repository-postgresql.xml"); -// break; -// case postgresql_ds: -// in = cl.getResourceAsStream(base + "/repository-postgresql-ds.xml"); -// break; -// case memory: -// in = cl.getResourceAsStream(base + "/repository-memory.xml"); -// break; -// case localfs: -// in = cl.getResourceAsStream(base + "/repository-localfs.xml"); -// break; -// default: -// throw new ArgeoJcrException("Unsupported node type " + type); -// } - in = cl.getResourceAsStream(base + "/repository-"+type.name()+".xml"); - - if (in == null) - throw new ArgeoJcrException("Repository configuration not found"); - InputSource config = new InputSource(in); - Properties jackrabbitVars = getConfigurationProperties(type, properties); - RepositoryConfig repositoryConfig = RepositoryConfig.create(config, jackrabbitVars); - return repositoryConfig; - } finally { - IOUtils.closeQuietly(in); - } - } - - private Properties getConfigurationProperties(JackrabbitType type, Dictionary properties) { - Properties props = new Properties(); - for (Enumeration keys = properties.keys(); keys.hasMoreElements();) { - String key = keys.nextElement(); - // if (key.equals(ConfigurationAdmin.SERVICE_FACTORYPID) || - // key.equals(Constants.SERVICE_PID) - // || key.equals(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS)) - // continue keys; - // try { - // String value = prop(properties, RepoConf.valueOf(key)); - // if (value != null) - props.put(key, properties.get(key)); - // } catch (IllegalArgumentException e) { - // // ignore non RepoConf - // // FIXME make it more flexible/extensible - // } - } - - // home - String homeUri = props.getProperty(RepoConf.labeledUri.name()); - Path homePath; - if (homeUri == null) { - String cn = props.getProperty(NodeConstants.CN); - assert cn != null; - homePath = KernelUtils.getOsgiInstancePath(KernelConstants.DIR_REPOS + '/' + cn); - } else { - try { - homePath = Paths.get(new URI(homeUri)).toAbsolutePath(); - } catch (URISyntaxException e) { - throw new CmsException("Invalid repository home URI", e); - } - } - Path rootUuidPath = homePath.resolve("repository/meta/rootUUID"); - if (!Files.exists(rootUuidPath)) { - try { - Files.createDirectories(rootUuidPath.getParent()); - Files.write(rootUuidPath, UUID.randomUUID().toString().getBytes()); - } catch (IOException e) { - log.error("Could not set rootUUID", e); - } - } - File homeDir = homePath.toFile(); - homeDir.mkdirs(); - // home cannot be overridden - props.put(RepositoryConfigurationParser.REPOSITORY_HOME_VARIABLE, homePath.toString()); - - // common - setProp(props, RepoConf.defaultWorkspace); - setProp(props, RepoConf.maxPoolSize); - // Jackrabbit defaults - setProp(props, RepoConf.bundleCacheMB); - // See http://wiki.apache.org/jackrabbit/Search - setProp(props, RepoConf.extractorPoolSize); - setProp(props, RepoConf.searchCacheSize); - setProp(props, RepoConf.maxVolatileIndexSize); - - // specific - String dburl; - switch (type) { - case h2: - dburl = "jdbc:h2:" + homeDir.getPath() + "/h2/repository"; - setProp(props, RepoConf.dburl, dburl); - setProp(props, RepoConf.dbuser, "sa"); - setProp(props, RepoConf.dbpassword, ""); - break; - case postgresql: - case postgresql_ds: - case postgresql_cluster: - dburl = "jdbc:postgresql://localhost/demo"; - setProp(props, RepoConf.dburl, dburl); - setProp(props, RepoConf.dbuser, "argeo"); - setProp(props, RepoConf.dbpassword, "argeo"); - break; - case memory: - break; - case localfs: - break; - default: - throw new ArgeoJcrException("Unsupported node type " + type); - } - return props; - } - - private void setProp(Properties props, RepoConf key, String def) { - Object value = props.get(key.name()); - if (value == null) - value = def; - if (value == null) - value = key.getDefault(); - if (value != null) - props.put(key.name(), value.toString()); - } - - private void setProp(Properties props, RepoConf key) { - setProp(props, key, null); - } - - private String prop(Dictionary properties, RepoConf key) { - Object value = properties.get(key.name()); - if (value == null) - return key.getDefault() != null ? key.getDefault().toString() : null; - else - return value.toString(); - } - - private RepositoryContext createJackrabbitRepository(RepositoryConfig repositoryConfig) throws RepositoryException { - ClassLoader currentContextCl = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(RepositoryBuilder.class.getClassLoader()); - try { - long begin = System.currentTimeMillis(); - // - // Actual repository creation - // - RepositoryContext repositoryContext = RepositoryContext.create(repositoryConfig); - - double duration = ((double) (System.currentTimeMillis() - begin)) / 1000; - if (log.isTraceEnabled()) - log.trace( - "Created Jackrabbit repository in " + duration + " s, home: " + repositoryConfig.getHomeDir()); - - return repositoryContext; - } finally { - Thread.currentThread().setContextClassLoader(currentContextCl); - } - } - -} diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryServiceFactory.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryServiceFactory.java index 6ec276590..b718043d9 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryServiceFactory.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryServiceFactory.java @@ -8,6 +8,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.jackrabbit.core.RepositoryContext; import org.argeo.cms.CmsException; +import org.argeo.cms.internal.jcr.RepositoryBuilder; import org.argeo.node.NodeConstants; import org.argeo.util.LangUtils; import org.osgi.framework.BundleContext; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-h2.xml b/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-h2.xml deleted file mode 100644 index 05267621f..000000000 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-h2.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-localfs.xml b/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-localfs.xml deleted file mode 100644 index 3d2470863..000000000 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-localfs.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-memory.xml b/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-memory.xml deleted file mode 100644 index ecee5bdad..000000000 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-memory.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql.xml b/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql.xml deleted file mode 100644 index 967782820..000000000 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql_cluster.xml b/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql_cluster.xml deleted file mode 100644 index d8c23e733..000000000 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql_cluster.xml +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql_ds.xml b/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql_ds.xml deleted file mode 100644 index 07a0d0428..000000000 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql_ds.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file