From 97286adeb9f00e02c4a245674ff45628f8aaa9de Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 16 Jun 2022 12:28:01 +0200 Subject: [PATCH] Keep removing dependency to JCR. --- .../src/org/argeo/app/core/SuiteUtils.java | 2 +- org.argeo.app.ui/OSGI-INF/cmsApp.xml | 2 - .../OSGI-INF/contentEntryArea.xml | 1 + org.argeo.app.ui/OSGI-INF/dashboardLayer.xml | 1 - org.argeo.app.ui/OSGI-INF/overviewMap.xml | 1 + .../org/argeo/app/ui/DefaultDashboard.java | 6 +- .../src/org/argeo/app/ui/DefaultFooter.java | 8 +- .../src/org/argeo/app/ui/DefaultHeader.java | 6 +- .../src/org/argeo/app/ui/DefaultLeadPane.java | 8 +- .../org/argeo/app/ui/DefaultLoginScreen.java | 6 +- .../src/org/argeo/app/ui/SuiteApp.java | 148 +++++++++--------- .../app/ui/library/ContentEntryArea.java | 13 +- .../argeo/app/ui/openlayers/OverviewMap.java | 25 ++- 13 files changed, 117 insertions(+), 110 deletions(-) diff --git a/org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java b/org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java index 0a31b14..cc0e3bf 100644 --- a/org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java +++ b/org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java @@ -28,7 +28,7 @@ public class SuiteUtils { return EntityType.user.basePath() + '/' + uid; } - public static Node getOrCreateUserNode(Session adminSession, LdapName userDn) { + private static Node getOrCreateUserNode(Session adminSession, LdapName userDn) { try { Node usersBase = adminSession.getNode(EntityType.user.basePath()); String uid = userDn.getRdn(userDn.size() - 1).getValue().toString(); diff --git a/org.argeo.app.ui/OSGI-INF/cmsApp.xml b/org.argeo.app.ui/OSGI-INF/cmsApp.xml index c710661..1b50064 100644 --- a/org.argeo.app.ui/OSGI-INF/cmsApp.xml +++ b/org.argeo.app.ui/OSGI-INF/cmsApp.xml @@ -8,10 +8,8 @@ - - diff --git a/org.argeo.app.ui/OSGI-INF/contentEntryArea.xml b/org.argeo.app.ui/OSGI-INF/contentEntryArea.xml index ecc37c7..87cadaa 100644 --- a/org.argeo.app.ui/OSGI-INF/contentEntryArea.xml +++ b/org.argeo.app.ui/OSGI-INF/contentEntryArea.xml @@ -5,4 +5,5 @@ + diff --git a/org.argeo.app.ui/OSGI-INF/dashboardLayer.xml b/org.argeo.app.ui/OSGI-INF/dashboardLayer.xml index 436a8e6..7a12d71 100644 --- a/org.argeo.app.ui/OSGI-INF/dashboardLayer.xml +++ b/org.argeo.app.ui/OSGI-INF/dashboardLayer.xml @@ -5,5 +5,4 @@ - diff --git a/org.argeo.app.ui/OSGI-INF/overviewMap.xml b/org.argeo.app.ui/OSGI-INF/overviewMap.xml index 662cbe8..f378f05 100644 --- a/org.argeo.app.ui/OSGI-INF/overviewMap.xml +++ b/org.argeo.app.ui/OSGI-INF/overviewMap.xml @@ -5,4 +5,5 @@ + diff --git a/org.argeo.app.ui/src/org/argeo/app/ui/DefaultDashboard.java b/org.argeo.app.ui/src/org/argeo/app/ui/DefaultDashboard.java index 50fbed6..672b5d3 100644 --- a/org.argeo.app.ui/src/org/argeo/app/ui/DefaultDashboard.java +++ b/org.argeo.app.ui/src/org/argeo/app/ui/DefaultDashboard.java @@ -1,8 +1,6 @@ package org.argeo.app.ui; -import javax.jcr.Node; -import javax.jcr.RepositoryException; - +import org.argeo.api.acr.Content; import org.argeo.api.cms.CmsView; import org.argeo.cms.auth.CurrentUser; import org.argeo.cms.swt.CmsSwtUtils; @@ -17,7 +15,7 @@ import org.eclipse.swt.widgets.Label; public class DefaultDashboard implements CmsUiProvider { @Override - public Control createUi(Composite parent, Node context) throws RepositoryException { + public Control createUiPart(Composite parent, Content context) { parent.setLayout(new GridLayout()); CmsView cmsView = CmsSwtUtils.getCmsView(parent); if (cmsView.isAnonymous()) diff --git a/org.argeo.app.ui/src/org/argeo/app/ui/DefaultFooter.java b/org.argeo.app.ui/src/org/argeo/app/ui/DefaultFooter.java index 62a3a23..5e54368 100644 --- a/org.argeo.app.ui/src/org/argeo/app/ui/DefaultFooter.java +++ b/org.argeo.app.ui/src/org/argeo/app/ui/DefaultFooter.java @@ -2,9 +2,7 @@ package org.argeo.app.ui; import java.util.Map; -import javax.jcr.Node; -import javax.jcr.RepositoryException; - +import org.argeo.api.acr.Content; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.ui.CmsUiProvider; import org.eclipse.swt.SWT; @@ -16,7 +14,7 @@ import org.osgi.framework.BundleContext; /** Footer of a standard Argeo Suite application. */ public class DefaultFooter implements CmsUiProvider { @Override - public Control createUi(Composite parent, Node context) throws RepositoryException { + public Control createUiPart(Composite parent, Content context) { parent.setLayout(CmsSwtUtils.noSpaceGridLayout()); Composite content = new Composite(parent, SWT.NONE); content.setLayoutData(new GridData(0, 0)); @@ -27,7 +25,7 @@ public class DefaultFooter implements CmsUiProvider { return contentControl; } - protected Control createContent(Composite parent, Node context) throws RepositoryException { + protected Control createContent(Composite parent, Content context) { return parent; } diff --git a/org.argeo.app.ui/src/org/argeo/app/ui/DefaultHeader.java b/org.argeo.app.ui/src/org/argeo/app/ui/DefaultHeader.java index d304493..53554dc 100644 --- a/org.argeo.app.ui/src/org/argeo/app/ui/DefaultHeader.java +++ b/org.argeo.app.ui/src/org/argeo/app/ui/DefaultHeader.java @@ -2,9 +2,7 @@ package org.argeo.app.ui; import java.util.Map; -import javax.jcr.Node; -import javax.jcr.RepositoryException; - +import org.argeo.api.acr.Content; import org.argeo.api.cms.CmsTheme; import org.argeo.api.cms.CmsView; import org.argeo.cms.Localized; @@ -29,7 +27,7 @@ public class DefaultHeader implements CmsUiProvider { private Localized title = null; @Override - public Control createUi(Composite parent, Node context) throws RepositoryException { + public Control createUiPart(Composite parent, Content context) { CmsView cmsView = CmsSwtUtils.getCmsView(parent); CmsTheme theme = CmsSwtUtils.getCmsTheme(parent); diff --git a/org.argeo.app.ui/src/org/argeo/app/ui/DefaultLeadPane.java b/org.argeo.app.ui/src/org/argeo/app/ui/DefaultLeadPane.java index 5650e9c..94b3b93 100644 --- a/org.argeo.app.ui/src/org/argeo/app/ui/DefaultLeadPane.java +++ b/org.argeo.app.ui/src/org/argeo/app/ui/DefaultLeadPane.java @@ -9,13 +9,11 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; -import javax.jcr.Node; -import javax.jcr.RepositoryException; - +import org.argeo.api.acr.Content; +import org.argeo.api.cms.CmsLog; import org.argeo.api.cms.CmsView; import org.argeo.app.api.RankedObject; import org.argeo.app.core.SuiteUtils; -import org.argeo.api.cms.CmsLog; import org.argeo.cms.Localized; import org.argeo.cms.auth.CurrentUser; import org.argeo.cms.swt.CmsSwtUtils; @@ -45,7 +43,7 @@ public class DefaultLeadPane implements CmsUiProvider { private ClassLoader l10nClassLoader; @Override - public Control createUi(Composite parent, Node node) throws RepositoryException { + public Control createUiPart(Composite parent, Content node) { CmsView cmsView = CmsSwtUtils.getCmsView(parent); parent.setLayout(CmsSwtUtils.noSpaceGridLayout()); Composite appLayersC = new Composite(parent, SWT.NONE); diff --git a/org.argeo.app.ui/src/org/argeo/app/ui/DefaultLoginScreen.java b/org.argeo.app.ui/src/org/argeo/app/ui/DefaultLoginScreen.java index e9b466f..117d644 100644 --- a/org.argeo.app.ui/src/org/argeo/app/ui/DefaultLoginScreen.java +++ b/org.argeo.app.ui/src/org/argeo/app/ui/DefaultLoginScreen.java @@ -1,8 +1,6 @@ package org.argeo.app.ui; -import javax.jcr.Node; -import javax.jcr.RepositoryException; - +import org.argeo.api.acr.Content; import org.argeo.api.cms.CmsContext; import org.argeo.api.cms.CmsView; import org.argeo.cms.auth.CurrentUser; @@ -20,7 +18,7 @@ public class DefaultLoginScreen implements CmsUiProvider { private CmsContext cmsContext; @Override - public Control createUi(Composite parent, Node context) throws RepositoryException { + public Control createUiPart(Composite parent, Content context) { CmsView cmsView = CmsSwtUtils.getCmsView(parent); if (!cmsView.isAnonymous()) throw new IllegalStateException(CurrentUser.getUsername() + " is already logged in"); diff --git a/org.argeo.app.ui/src/org/argeo/app/ui/SuiteApp.java b/org.argeo.app.ui/src/org/argeo/app/ui/SuiteApp.java index 9bfec26..8bbe7d3 100644 --- a/org.argeo.app.ui/src/org/argeo/app/ui/SuiteApp.java +++ b/org.argeo.app.ui/src/org/argeo/app/ui/SuiteApp.java @@ -14,16 +14,13 @@ import java.util.TreeMap; import java.util.TreeSet; import javax.jcr.Node; -import javax.jcr.Repository; import javax.jcr.RepositoryException; -import javax.jcr.Session; import javax.jcr.nodetype.NodeType; import javax.naming.InvalidNameException; import javax.naming.ldap.LdapName; import org.argeo.api.acr.Content; import org.argeo.api.acr.ContentRepository; -import org.argeo.api.acr.ContentSession; import org.argeo.api.acr.spi.ProvidedSession; import org.argeo.api.cms.CmsConstants; import org.argeo.api.cms.CmsLog; @@ -42,13 +39,11 @@ import org.argeo.cms.LocaleUtils; import org.argeo.cms.Localized; import org.argeo.cms.jcr.CmsJcrUtils; import org.argeo.cms.jcr.acr.JcrContent; -import org.argeo.cms.jcr.acr.JcrContentProvider; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.swt.dialogs.CmsFeedback; import org.argeo.cms.ui.CmsUiProvider; import org.argeo.cms.ux.CmsUxUtils; import org.argeo.eclipse.ui.specific.UiContext; -import org.argeo.jcr.Jcr; import org.argeo.jcr.JcrException; import org.argeo.util.LangUtils; import org.eclipse.swt.SWT; @@ -99,10 +94,10 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { // ACR private ContentRepository contentRepository; - private JcrContentProvider jcrContentProvider; +// private JcrContentProvider jcrContentProvider; // JCR - private Repository repository; +// private Repository repository; public void init(Map properties) { if (log.isDebugEnabled()) @@ -192,7 +187,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { throw new IllegalStateException("UI name should not be null"); CmsView cmsView = CmsSwtUtils.getCmsView(ui); - ContentSession contentSession = CmsUxUtils.getContentSession(contentRepository, cmsView); + ProvidedSession contentSession = (ProvidedSession) CmsUxUtils.getContentSession(contentRepository, cmsView); CmsUiProvider headerUiProvider = findUiProvider(headerPid); CmsUiProvider footerUiProvider = findUiProvider(footerPid); @@ -231,16 +226,18 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { ui.setUserDir(userDir); // ui.initSessions(getRepository(), publicBasePath); } else { - Session adminSession = null; - try { - adminSession = CmsJcrUtils.openDataAdminSession(getRepository(), null); - Node userDirNode = SuiteUtils.getOrCreateCmsSessionNode(adminSession, cmsSession); - Content userDir = contentSession.get(CmsConstants.SYS_WORKSPACE + userDirNode.getPath()); - ui.setUserDir(userDir); -// ui.initSessions(getRepository(), userDirNode.getPath()); - } finally { - Jcr.logout(adminSession); - } +// Session adminSession = null; +// try { +// adminSession = CmsJcrUtils.openDataAdminSession(getRepository(), null); +// Node userDirNode = SuiteUtils.getOrCreateCmsSessionNode(adminSession, cmsSession); +// Content userDir = contentSession.get(CmsConstants.SYS_WORKSPACE + userDirNode.getPath()); +// ui.setUserDir(userDir); +//// ui.initSessions(getRepository(), userDirNode.getPath()); +// } finally { +// Jcr.logout(adminSession); +// } + Content userDir = contentSession.getSessionRunDir(); + ui.setUserDir(userDir); } } initLocale(cmsSession); @@ -297,63 +294,64 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { private T findByType(Map> byType, Content content) { if (content == null) throw new IllegalArgumentException("A node should be provided"); - - if(content instanceof JcrContent) { - Node context = ((JcrContent)content).getJcrNode(); - try { - // mixins - Set types = new TreeSet<>(); - for (NodeType mixinType : context.getMixinNodeTypes()) { - String mixinTypeName = mixinType.getName(); - if (byType.containsKey(mixinTypeName)) { - types.add(mixinTypeName); + + if (content instanceof JcrContent) { + Node context = ((JcrContent) content).getJcrNode(); + try { + // mixins + Set types = new TreeSet<>(); + for (NodeType mixinType : context.getMixinNodeTypes()) { + String mixinTypeName = mixinType.getName(); + if (byType.containsKey(mixinTypeName)) { + types.add(mixinTypeName); + } + for (NodeType superType : mixinType.getDeclaredSupertypes()) { + if (byType.containsKey(superType.getName())) { + types.add(superType.getName()); + } + } + } + // primary node type + NodeType primaryType = context.getPrimaryNodeType(); + String primaryTypeName = primaryType.getName(); + if (byType.containsKey(primaryTypeName)) { + types.add(primaryTypeName); } - for (NodeType superType : mixinType.getDeclaredSupertypes()) { + for (NodeType superType : primaryType.getDeclaredSupertypes()) { if (byType.containsKey(superType.getName())) { types.add(superType.getName()); } } - } - // primary node type - NodeType primaryType = context.getPrimaryNodeType(); - String primaryTypeName = primaryType.getName(); - if (byType.containsKey(primaryTypeName)) { - types.add(primaryTypeName); - } - for (NodeType superType : primaryType.getDeclaredSupertypes()) { - if (byType.containsKey(superType.getName())) { - types.add(superType.getName()); - } - } - // entity type - if (context.isNodeType(EntityType.entity.get())) { - if (context.hasProperty(EntityNames.ENTITY_TYPE)) { - String entityTypeName = context.getProperty(EntityNames.ENTITY_TYPE).getString(); - if (byType.containsKey(entityTypeName)) { - types.add(entityTypeName); + // entity type + if (context.isNodeType(EntityType.entity.get())) { + if (context.hasProperty(EntityNames.ENTITY_TYPE)) { + String entityTypeName = context.getProperty(EntityNames.ENTITY_TYPE).getString(); + if (byType.containsKey(entityTypeName)) { + types.add(entityTypeName); + } } } - } // if (context.getPath().equals("/")) {// root node // types.add("nt:folder"); // } - if (CmsJcrUtils.isUserHome(context) && byType.containsKey("nt:folder")) {// home node - types.add("nt:folder"); + if (CmsJcrUtils.isUserHome(context) && byType.containsKey("nt:folder")) {// home node + types.add("nt:folder"); + } + + if (types.size() == 0) + throw new IllegalArgumentException( + "No type found for " + context + " (" + listTypes(context) + ")"); + String type = types.iterator().next(); + if (!byType.containsKey(type)) + throw new IllegalArgumentException("No component found for " + context + " with type " + type); + return byType.get(type).get(); + } catch (RepositoryException e) { + throw new IllegalStateException(e); } - if (types.size() == 0) - throw new IllegalArgumentException("No type found for " + context + " (" + listTypes(context) + ")"); - String type = types.iterator().next(); - if (!byType.containsKey(type)) - throw new IllegalArgumentException("No component found for " + context + " with type " + type); - return byType.get(type).get(); - } catch (RepositoryException e) { - throw new IllegalStateException(e); - } - - }else { - throw new UnsupportedOperationException("Content "+content.getClass().getName()+" is not supported."); + } else { + throw new UnsupportedOperationException("Content " + content.getClass().getName() + " is not supported."); } } @@ -425,7 +423,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { if (state == null || !state.startsWith("/")) return null; - String path=state; + String path = state; // String path = state.substring(1); // String workspace; // if (path.equals("")) { @@ -542,8 +540,8 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { ProvidedSession contentSession = (ProvidedSession) CmsUxUtils.getContentSession(contentRepository, ui.getCmsView()); - String path = get(event,SuiteEvent.CONTENT_PATH); - + String path = get(event, SuiteEvent.CONTENT_PATH); + // String nodePath = get(event, SuiteEvent.NODE_PATH); if (path != null && path.equals(HOME_STATE)) return ui.getUserDir(); @@ -674,13 +672,13 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { this.cmsUserManager = cmsUserManager; } - protected Repository getRepository() { - return repository; - } - - public void setRepository(Repository repository) { - this.repository = repository; - } +// protected Repository getRepository() { +// return repository; +// } +// +// public void setRepository(Repository repository) { +// this.repository = repository; +// } protected ContentRepository getContentRepository() { return contentRepository; @@ -690,8 +688,8 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { this.contentRepository = contentRepository; } - public void setJcrContentProvider(JcrContentProvider jcrContentProvider) { - this.jcrContentProvider = jcrContentProvider; - } +// public void setJcrContentProvider(JcrContentProvider jcrContentProvider) { +// this.jcrContentProvider = jcrContentProvider; +// } } diff --git a/org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java b/org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java index af31ac5..8831641 100644 --- a/org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java +++ b/org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java @@ -10,11 +10,14 @@ import javax.jcr.Session; import javax.jcr.nodetype.NodeType; import javax.jcr.query.Query; +import org.argeo.api.acr.Content; +import org.argeo.api.cms.CmsConstants; import org.argeo.api.cms.CmsTheme; import org.argeo.app.api.EntityType; import org.argeo.app.ui.SuiteEvent; import org.argeo.app.ui.SuiteIcon; import org.argeo.app.ui.widgets.TreeOrSearchArea; +import org.argeo.cms.jcr.acr.JcrContentProvider; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.ui.CmsUiProvider; import org.argeo.jcr.Jcr; @@ -34,9 +37,10 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; public class ContentEntryArea implements CmsUiProvider { + private JcrContentProvider jcrContentProvider; @Override - public Control createUi(Composite parent, Node context) throws RepositoryException { + public Control createUiPart(Composite parent, Content context) { CmsTheme theme = CmsSwtUtils.getCmsTheme(parent); parent.setLayout(new GridLayout()); @@ -98,7 +102,8 @@ public class ContentEntryArea implements CmsUiProvider { }); ui.getTreeViewer().setContentProvider(new SpacesContentProvider()); - ui.getTreeViewer().setInput(context.getSession()); + Session session = jcrContentProvider.getJcrSession(context, CmsConstants.SYS_WORKSPACE); + ui.getTreeViewer().setInput(session); return ui; } @@ -107,6 +112,10 @@ public class ContentEntryArea implements CmsUiProvider { || Jcr.isNodeType(node, NodeType.NT_FILE); } + public void setJcrContentProvider(JcrContentProvider jcrContentProvider) { + this.jcrContentProvider = jcrContentProvider; + } + class Ui extends TreeOrSearchArea { public Ui(Composite parent, int style) { diff --git a/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/OverviewMap.java b/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/OverviewMap.java index dbb3119..e4e63b8 100644 --- a/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/OverviewMap.java +++ b/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/OverviewMap.java @@ -4,12 +4,16 @@ import java.util.List; import javax.jcr.Node; import javax.jcr.RepositoryException; +import javax.jcr.Session; import javax.jcr.observation.Event; import javax.jcr.observation.EventIterator; import javax.jcr.observation.EventListener; import javax.jcr.query.Query; +import org.argeo.api.acr.Content; +import org.argeo.api.cms.CmsConstants; import org.argeo.app.api.EntityType; +import org.argeo.cms.jcr.acr.JcrContentProvider; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.ui.CmsUiProvider; import org.argeo.jcr.JcrException; @@ -21,22 +25,24 @@ import org.eclipse.swt.widgets.Control; /** Displays an overview map. */ public class OverviewMap implements CmsUiProvider { + private JcrContentProvider jcrContentProvider; @Override - public Control createUi(Composite parent, Node context) throws RepositoryException { + public Control createUiPart(Composite parent, Content context) { parent.setLayout(new GridLayout()); - refreshUi(parent, context); + Session session = jcrContentProvider.getJcrSession(context, CmsConstants.SYS_WORKSPACE); try { + refreshUi(parent, session); String[] nodeTypes = { EntityType.geopoint.get() }; - context.getSession().getWorkspace().getObservationManager().addEventListener(new EventListener() { + session.getWorkspace().getObservationManager().addEventListener(new EventListener() { @Override public void onEvent(EventIterator events) { if (!parent.isDisposed()) parent.getDisplay().asyncExec(() -> { try { - refreshUi(parent, context); + refreshUi(parent, session); } catch (RepositoryException e) { throw new JcrException(e); } @@ -45,15 +51,15 @@ public class OverviewMap implements CmsUiProvider { }, Event.PROPERTY_CHANGED | Event.NODE_ADDED | Event.NODE_REMOVED | Event.PROPERTY_ADDED, "/", true, null, nodeTypes, false); } catch (RepositoryException e) { - throw new IllegalStateException("Cannot add JCR observer", e); + throw new JcrException("Cannot add JCR observer", e); } return parent; } - protected void refreshUi(Composite parent, Node context) throws RepositoryException { + protected void refreshUi(Composite parent, Session session) throws RepositoryException { CmsSwtUtils.clear(parent); - Query query = context.getSession().getWorkspace().getQueryManager() + Query query = session.getWorkspace().getQueryManager() .createQuery("SELECT * FROM [" + EntityType.geopoint.get() + "]", Query.JCR_SQL2); List geoPoints = JcrUtils.nodeIteratorToList(query.execute().getNodes()); OpenLayersMap map = new OpenLayersMap(parent, SWT.NONE, getClass().getResource("map-osm.html")); @@ -63,4 +69,9 @@ public class OverviewMap implements CmsUiProvider { // apafMap.setCenter(-2.472, 8.010); map.addPoints(geoPoints); } + + public void setJcrContentProvider(JcrContentProvider jcrContentProvider) { + this.jcrContentProvider = jcrContentProvider; + } + } -- 2.30.2