From 5b7eb8ff423b0d9fe94aa823e0a844e4ffb0c27c Mon Sep 17 00:00:00 2001 From: bsinou Date: Tue, 31 Jan 2017 16:11:23 +0100 Subject: [PATCH] Enhance integration of the various apps --- org.argeo.suite.core/bnd.bnd | 2 + org.argeo.suite.core/pom.xml | 5 + .../src/org/argeo/suite/SuiteConstants.java | 5 + .../argeo/suite/documents/FsConstants.java | 4 + .../META-INF/spring/osgi.xml | 11 +- .../META-INF/spring/parts.xml | 5 +- org.argeo.suite.workbench.rap/bnd.bnd | 2 +- .../workbench/AsWorkbenchServiceImpl.java | 118 +++++++++++++----- .../suite/workbench/fs/FsAppService.java | 70 ----------- .../parts/AbstractSuiteDashboard.java | 12 +- .../parts/DefaultDashboardEditor.java | 10 +- .../suite/workbench/parts/MyFilesView.java | 46 ++++--- 12 files changed, 150 insertions(+), 140 deletions(-) create mode 100644 org.argeo.suite.core/src/org/argeo/suite/SuiteConstants.java create mode 100644 org.argeo.suite.core/src/org/argeo/suite/documents/FsConstants.java delete mode 100644 org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/fs/FsAppService.java diff --git a/org.argeo.suite.core/bnd.bnd b/org.argeo.suite.core/bnd.bnd index 68b918c..7537584 100644 --- a/org.argeo.suite.core/bnd.bnd +++ b/org.argeo.suite.core/bnd.bnd @@ -1,3 +1,5 @@ +Require-Capability: cms.datamodel; filter:="(name=people)",\ +cms.datamodel; filter:="(name=documents)" Import-Package:\ javax.jcr.nodetype,\ org.argeo.node,\ diff --git a/org.argeo.suite.core/pom.xml b/org.argeo.suite.core/pom.xml index a8eb095..65e450d 100644 --- a/org.argeo.suite.core/pom.xml +++ b/org.argeo.suite.core/pom.xml @@ -18,5 +18,10 @@ org.argeo.connect.people.core ${version.argeo-connect} + + org.argeo.connect + org.argeo.connect.documents + ${version.argeo-connect} + diff --git a/org.argeo.suite.core/src/org/argeo/suite/SuiteConstants.java b/org.argeo.suite.core/src/org/argeo/suite/SuiteConstants.java new file mode 100644 index 0000000..ee172ed --- /dev/null +++ b/org.argeo.suite.core/src/org/argeo/suite/SuiteConstants.java @@ -0,0 +1,5 @@ +package org.argeo.suite; + +public interface SuiteConstants { + +} diff --git a/org.argeo.suite.core/src/org/argeo/suite/documents/FsConstants.java b/org.argeo.suite.core/src/org/argeo/suite/documents/FsConstants.java new file mode 100644 index 0000000..ce5df78 --- /dev/null +++ b/org.argeo.suite.core/src/org/argeo/suite/documents/FsConstants.java @@ -0,0 +1,4 @@ +package org.argeo.suite.documents; + +public interface FsConstants { +} diff --git a/org.argeo.suite.workbench.rap/META-INF/spring/osgi.xml b/org.argeo.suite.workbench.rap/META-INF/spring/osgi.xml index 9b36c03..f026adb 100644 --- a/org.argeo.suite.workbench.rap/META-INF/spring/osgi.xml +++ b/org.argeo.suite.workbench.rap/META-INF/spring/osgi.xml @@ -9,15 +9,12 @@ - - + - - - - + + diff --git a/org.argeo.suite.workbench.rap/META-INF/spring/parts.xml b/org.argeo.suite.workbench.rap/META-INF/spring/parts.xml index f2ae1fd..932711f 100644 --- a/org.argeo.suite.workbench.rap/META-INF/spring/parts.xml +++ b/org.argeo.suite.workbench.rap/META-INF/spring/parts.xml @@ -16,7 +16,8 @@ scope="prototype"> - + + @@ -30,6 +31,6 @@ scope="prototype"> - + diff --git a/org.argeo.suite.workbench.rap/bnd.bnd b/org.argeo.suite.workbench.rap/bnd.bnd index 99121fc..17e6138 100644 --- a/org.argeo.suite.workbench.rap/bnd.bnd +++ b/org.argeo.suite.workbench.rap/bnd.bnd @@ -13,7 +13,7 @@ org.argeo.cms,\ org.argeo.cms.ui.workbench,\ org.argeo.connect,\ org.argeo.connect.people.workbench.rap.views,\ -org.argeo.connect.ui,\ +org.argeo.connect.ui.workbench,\ org.argeo.eclipse.spring,\ org.argeo.node,\ org.argeo.util,\ diff --git a/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/AsWorkbenchServiceImpl.java b/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/AsWorkbenchServiceImpl.java index b998287..dcc9aa1 100644 --- a/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/AsWorkbenchServiceImpl.java +++ b/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/AsWorkbenchServiceImpl.java @@ -1,40 +1,100 @@ package org.argeo.suite.workbench; -import org.argeo.connect.people.workbench.rap.PeopleWorkbenchService; -import org.argeo.connect.people.workbench.rap.PeopleWorkbenchServiceImpl; +import java.util.List; + +import javax.jcr.Node; + +import org.argeo.connect.ui.workbench.AppWorkbenchService; +import org.argeo.eclipse.ui.EclipseUiUtils; import org.argeo.suite.workbench.parts.DefaultDashboardEditor; +import org.eclipse.jface.wizard.Wizard; +import org.eclipse.swt.graphics.Image; /** Centralize workbench services from the various base apps */ -public class AsWorkbenchServiceImpl extends PeopleWorkbenchServiceImpl implements PeopleWorkbenchService { +public class AsWorkbenchServiceImpl implements AppWorkbenchService { + + // Injected known AppWorkbenchServices: order is important, first found + // result will be returned by the various methods. + private List knownAppWbServices; @Override public String getDefaultEditorId() { return DefaultDashboardEditor.ID; } -} -// extends PeopleWorkbenchServiceImpl { -// -// public String getDefaultEditorId() { -// return DefaultDashboardEditor.ID; -// } -// -// // -// // @Override -// // public Image getIconForType(Node entity) { -// // try { -// // if (entity.isNodeType(AoTypes.OFFICE_ACCOUNT)) -// // return AoImages.ICON_ACCOUNT; -// // else if (entity.isNodeType(TrackerTypes.TRACKER_ISSUE)) -// // return AoImages.ICON_ISSUE; -// // else if (entity.isNodeType(TrackerTypes.TRACKER_PROJECT)) -// // return AoImages.ICON_PROJECT; -// // else if (entity.isNodeType(AoTypes.OFFICE_PROSPECT)) -// // return AoImages.ICON_PROSPECT; -// // else -// // return super.getIconForType(entity); -// // } catch (RepositoryException re) { -// // throw new PeopleException("Unable to get image for node", re); -// // } -// // } -// } + @Override + public String getOpenEntityEditorCmdId() { + String result = null; + for (AppWorkbenchService appWbService : knownAppWbServices) { + result = appWbService.getOpenEntityEditorCmdId(); + if (EclipseUiUtils.notEmpty(result)) + return result; + } + return null; + } + + @Override + public String getOpenSearchEntityEditorCmdId() { + String result = null; + for (AppWorkbenchService appWbService : knownAppWbServices) { + result = appWbService.getOpenSearchEntityEditorCmdId(); + if (EclipseUiUtils.notEmpty(result)) + return result; + } + return null; + } + + @Override + public String getEntityEditorId(Node entity) { + String result = null; + for (AppWorkbenchService appWbService : knownAppWbServices) { + result = appWbService.getEntityEditorId(entity); + if (EclipseUiUtils.notEmpty(result)) + return result; + } + return null; + } + + @Override + public String getSearchEntityEditorId(String nodeType) { + String result = null; + for (AppWorkbenchService appWbService : knownAppWbServices) { + result = appWbService.getSearchEntityEditorId(nodeType); + if (EclipseUiUtils.notEmpty(result)) + return result; + } + return null; + } + + @Override + public Image getIconForType(Node entity) { + Image result = null; + for (AppWorkbenchService appWbService : knownAppWbServices) { + result = appWbService.getIconForType(entity); + if (result != null) + return result; + } + return null; + } + + @Override + public Wizard getCreationWizard(Node node) { + Wizard result = null; + for (AppWorkbenchService appWbService : knownAppWbServices) { + result = appWbService.getCreationWizard(node); + if (result != null) + return result; + } + return null; + } + + @Override + public String getOpenFileCmdId() { + return null; + } + + /* DEPENDENCY INJECTION */ + public void setKnownAppWbServices(List knownAppWbServices) { + this.knownAppWbServices = knownAppWbServices; + } +} diff --git a/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/fs/FsAppService.java b/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/fs/FsAppService.java deleted file mode 100644 index fc9563d..0000000 --- a/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/fs/FsAppService.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.argeo.suite.workbench.fs; - -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.file.FileSystem; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.spi.FileSystemProvider; -import java.security.PrivilegedActionException; - -import javax.jcr.Session; - -import org.argeo.cms.auth.CurrentUser; -import org.argeo.node.NodeUtils; -import org.argeo.suite.SuiteException; - -public class FsAppService { - private final static String NODE_PREFIX = "node://"; - - private String getCurrentHomePath(Session session) { - try { - // Make in a do as if not from the workbench - // Repository repo = session.getRepository(); - // session = CurrentUser.tryAs(() -> repo.login()); - String homepath = NodeUtils.getUserHome(session).getPath(); - return homepath; - } catch (Exception e) { - throw new SuiteException("Cannot retrieve Current User Home Path", e); - // } finally { - // JcrUtils.logoutQuietly(session); - } - } - - public Path[] getMyFilesPath(FileSystemProvider nodeFileSystemProvider, Session session) { - // return Paths.get(System.getProperty("user.dir")); - String currHomeUriStr = NODE_PREFIX + getCurrentHomePath(session); - try { - URI uri = new URI(currHomeUriStr); - FileSystem fileSystem = nodeFileSystemProvider.getFileSystem(uri); - if (fileSystem == null) { - fileSystem = CurrentUser.tryAs(() -> nodeFileSystemProvider.newFileSystem(uri, null)); - // PrivilegedExceptionAction pea = new - // PrivilegedExceptionAction() { - // @Override - // public FileSystem run() throws Exception { - // return nodeFileSystemProvider.newFileSystem(uri, null); - // } - // - // }; - // fileSystem = CurrentUser.tryAs(pea); - } - Path[] paths = { fileSystem.getPath(getCurrentHomePath(session)), fileSystem.getPath("/") }; - return paths; - } catch (URISyntaxException | PrivilegedActionException e) { - throw new RuntimeException("unable to initialise home file system for " + currHomeUriStr, e); - } - } - - public Path[] getMyGroupsFilesPath(FileSystemProvider nodeFileSystemProvider, Session session) { - // TODO - Path[] paths = { Paths.get(System.getProperty("user.dir")), Paths.get("/tmp") }; - return paths; - } - - public Path[] getMyBookmarks(FileSystemProvider nodeFileSystemProvider, Session session) { - // TODO - Path[] paths = { Paths.get(System.getProperty("user.dir")), Paths.get("/tmp"), Paths.get("/opt") }; - return paths; - } -} diff --git a/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/parts/AbstractSuiteDashboard.java b/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/parts/AbstractSuiteDashboard.java index 6cf2bd3..1b0b950 100644 --- a/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/parts/AbstractSuiteDashboard.java +++ b/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/parts/AbstractSuiteDashboard.java @@ -6,8 +6,8 @@ import javax.jcr.Session; import org.argeo.cms.util.CmsUtils; import org.argeo.connect.people.PeopleService; import org.argeo.connect.people.workbench.rap.PeopleStyles; -import org.argeo.connect.people.workbench.rap.PeopleWorkbenchService; import org.argeo.connect.people.workbench.rap.editors.util.EntityEditorInput; +import org.argeo.connect.ui.workbench.AppWorkbenchService; import org.argeo.connect.util.ConnectJcrUtils; import org.argeo.eclipse.ui.EclipseUiUtils; import org.argeo.jcr.JcrUtils; @@ -30,7 +30,7 @@ public abstract class AbstractSuiteDashboard extends EditorPart { // DEPENDENCY INJECTION private Repository repository; private PeopleService peopleService; - private PeopleWorkbenchService peopleWorkbenchService; + private AppWorkbenchService appWorkbenchService; private Session session; @@ -153,8 +153,8 @@ public abstract class AbstractSuiteDashboard extends EditorPart { return peopleService; } - protected PeopleWorkbenchService getPeopleWorkbenchService() { - return peopleWorkbenchService; + protected AppWorkbenchService getAppWorkbenchService() { + return appWorkbenchService; } protected Session getSession() { @@ -174,8 +174,8 @@ public abstract class AbstractSuiteDashboard extends EditorPart { this.repository = repository; } - public void setPeopleWorkbenchService(PeopleWorkbenchService peopleWorkbenchService) { - this.peopleWorkbenchService = peopleWorkbenchService; + public void setAppWorkbenchService(AppWorkbenchService appWorkbenchService) { + this.appWorkbenchService = appWorkbenchService; } public void setPeopleService(PeopleService peopleService) { diff --git a/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/parts/DefaultDashboardEditor.java b/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/parts/DefaultDashboardEditor.java index cfbe2ee..40726cd 100644 --- a/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/parts/DefaultDashboardEditor.java +++ b/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/parts/DefaultDashboardEditor.java @@ -78,24 +78,24 @@ public class DefaultDashboardEditor extends AbstractSuiteDashboard { createGadgetTitleCmp(parent, "Contacts"); Composite bodyCmp = createGadgetBodyCmp(parent); - PeopleRapUtils.createOpenSearchEditorLink(getPeopleWorkbenchService(), bodyCmp, "Persons", + PeopleRapUtils.createOpenSearchEditorLink(getAppWorkbenchService(), bodyCmp, "Persons", PeopleTypes.PEOPLE_PERSON, getPeopleService().getBasePath(PeopleTypes.PEOPLE_PERSON)); - PeopleRapUtils.createOpenSearchEditorLink(getPeopleWorkbenchService(), bodyCmp, "Organisations", + PeopleRapUtils.createOpenSearchEditorLink(getAppWorkbenchService(), bodyCmp, "Organisations", PeopleTypes.PEOPLE_ORG, getPeopleService().getBasePath(PeopleTypes.PEOPLE_ORG)); Node tagParent = getPeopleService().getResourceService().getTagLikeResourceParent(getSession(), PeopleTypes.PEOPLE_MAILING_LIST); - PeopleRapUtils.createOpenSearchEditorLink(getPeopleWorkbenchService(), bodyCmp, "Mailing lists", + PeopleRapUtils.createOpenSearchEditorLink(getAppWorkbenchService(), bodyCmp, "Mailing lists", PeopleTypes.PEOPLE_MAILING_LIST, ConnectJcrUtils.getPath(tagParent)); - PeopleRapUtils.createOpenSearchEditorLink(getPeopleWorkbenchService(), bodyCmp, "Tasks", + PeopleRapUtils.createOpenSearchEditorLink(getAppWorkbenchService(), bodyCmp, "Tasks", PeopleTypes.PEOPLE_TASK, getPeopleService().getBasePath(null)); tagParent = getPeopleService().getResourceService().getTagLikeResourceParent(getSession(), PeopleConstants.RESOURCE_TAG); - PeopleRapUtils.createOpenSearchEditorLink(getPeopleWorkbenchService(), bodyCmp, "Tags", + PeopleRapUtils.createOpenSearchEditorLink(getAppWorkbenchService(), bodyCmp, "Tags", PeopleTypes.PEOPLE_TAG_INSTANCE, ConnectJcrUtils.getPath(tagParent)); } diff --git a/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/parts/MyFilesView.java b/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/parts/MyFilesView.java index d89a228..f69710c 100644 --- a/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/parts/MyFilesView.java +++ b/org.argeo.suite.workbench.rap/src/org/argeo/suite/workbench/parts/MyFilesView.java @@ -23,24 +23,24 @@ import javax.jcr.NodeIterator; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; -import javax.jcr.nodetype.NodeType; import javax.jcr.query.Query; import javax.jcr.query.QueryManager; import javax.jcr.query.QueryResult; import org.argeo.cms.util.CmsUtils; import org.argeo.connect.ConnectConstants; +import org.argeo.connect.documents.DocumentsService; import org.argeo.connect.people.PeopleException; import org.argeo.connect.people.workbench.rap.providers.BasicNodeListContentProvider; import org.argeo.connect.ui.ConnectUiConstants; import org.argeo.connect.ui.widgets.DelayedText; +import org.argeo.connect.ui.workbench.AppWorkbenchService; import org.argeo.connect.util.ConnectJcrUtils; import org.argeo.connect.util.XPathUtils; import org.argeo.eclipse.ui.EclipseUiUtils; import org.argeo.eclipse.ui.fs.FsTableViewer; import org.argeo.jcr.JcrUtils; import org.argeo.suite.workbench.AsUiPlugin; -import org.argeo.suite.workbench.fs.FsAppService; import org.argeo.suite.workbench.fs.FsSingleColumnLabelProvider; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ColumnWeightData; @@ -68,10 +68,11 @@ import org.eclipse.ui.part.ViewPart; public class MyFilesView extends ViewPart implements IDoubleClickListener { public final static String ID = AsUiPlugin.PLUGIN_ID + ".myFilesView"; - private FileSystemProvider nodeFileSystemProvider; - private FsAppService fsAppService; private Repository repository; private Session session; + private AppWorkbenchService appWorkbenchService; + private FileSystemProvider nodeFileSystemProvider; + private DocumentsService documentsService; private DelayedText filterTxt; private TableViewer searchResultsViewer; @@ -150,21 +151,19 @@ public class MyFilesView extends ViewPart implements IDoubleClickListener { parent.setLayout(new GridLayout()); Composite tableComposite = new Composite(parent, SWT.NONE); - GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_VERTICAL - | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL); - tableComposite.setLayoutData(gd); + tableComposite.setLayoutData(EclipseUiUtils.fillAll()); TableViewer v = new TableViewer(tableComposite); v.setLabelProvider(labelProvider); TableColumn singleColumn = new TableColumn(v.getTable(), SWT.V_SCROLL); TableColumnLayout tableColumnLayout = new TableColumnLayout(); - tableColumnLayout.setColumnData(singleColumn, new ColumnWeightData(85)); + tableColumnLayout.setColumnData(singleColumn, new ColumnWeightData(100)); tableComposite.setLayout(tableColumnLayout); // Corresponding table & style Table table = v.getTable(); - table.setLinesVisible(true); + table.setLinesVisible(false); table.setHeaderVisible(false); CmsUtils.markup(table); CmsUtils.setItemHeight(table, 26); @@ -183,14 +182,11 @@ public class MyFilesView extends ViewPart implements IDoubleClickListener { protected int refreshFilteredList() { try { String filter = filterTxt.getText(); - // Prevents the query on the full repository if (EclipseUiUtils.isEmpty(filter)) { searchResultsViewer.setInput(null); return 0; } - QueryManager queryManager = session.getWorkspace().getQueryManager(); - // XPATH Query // TODO manage cleanly jcr: prefix // String xpathQueryStr = "//element(*, " + NodeType.NT_FILE + ")"; @@ -199,11 +195,10 @@ public class MyFilesView extends ViewPart implements IDoubleClickListener { if (notEmpty(xpathFilter)) xpathQueryStr += "[" + xpathFilter + "]"; + QueryManager queryManager = session.getWorkspace().getQueryManager(); Query xpathQuery = queryManager.createQuery(xpathQueryStr, ConnectConstants.QUERY_XPATH); - // xpathQuery.setLimit(TrackerUiConstants.SEARCH_DEFAULT_LIMIT); QueryResult result = xpathQuery.execute(); - NodeIterator nit = result.getNodes(); searchResultsViewer.setInput(JcrUtils.nodeIteratorToList(nit)); @@ -216,7 +211,6 @@ public class MyFilesView extends ViewPart implements IDoubleClickListener { private void populateBookmarks(Composite parent) { CmsUtils.clear(parent); parent.setLayout(new GridLayout()); - int bookmarkColWith = 200; FsTableViewer homeViewer = new FsTableViewer(parent, SWT.SINGLE | SWT.NO_SCROLL); @@ -225,7 +219,7 @@ public class MyFilesView extends ViewPart implements IDoubleClickListener { gd.horizontalIndent = 10; table.setLayoutData(gd); homeViewer.addDoubleClickListener(this); - homeViewer.setPathsInput(fsAppService.getMyFilesPath(nodeFileSystemProvider, session)); + homeViewer.setPathsInput(documentsService.getMyDocumentsPath(nodeFileSystemProvider, session)); appendTitle(parent, "Shared files"); FsTableViewer groupsViewer = new FsTableViewer(parent, SWT.SINGLE | SWT.NO_SCROLL); @@ -234,7 +228,7 @@ public class MyFilesView extends ViewPart implements IDoubleClickListener { gd.horizontalIndent = 10; table.setLayoutData(gd); groupsViewer.addDoubleClickListener(this); - groupsViewer.setPathsInput(fsAppService.getMyGroupsFilesPath(nodeFileSystemProvider, session)); + groupsViewer.setPathsInput(documentsService.getMyGroupsFilesPath(nodeFileSystemProvider, session)); appendTitle(parent, "My bookmarks"); FsTableViewer bookmarksViewer = new FsTableViewer(parent, SWT.SINGLE | SWT.NO_SCROLL); @@ -243,7 +237,7 @@ public class MyFilesView extends ViewPart implements IDoubleClickListener { gd.horizontalIndent = 10; table.setLayoutData(gd); bookmarksViewer.addDoubleClickListener(this); - bookmarksViewer.setPathsInput(fsAppService.getMyBookmarks(nodeFileSystemProvider, session)); + bookmarksViewer.setPathsInput(documentsService.getMyBookmarks(nodeFileSystemProvider, session)); } private Label appendTitle(Composite parent, String value) { @@ -263,6 +257,14 @@ public class MyFilesView extends ViewPart implements IDoubleClickListener { if (selection.isEmpty()) return; else { + + // currNode = ConnectJcrUtils.getNodeFromElement(obj, selectorName); + // if (currNode != null) + // CommandUtils + // .callCommand(peopleWorkbenchService + // .getOpenEntityEditorCmdId(), + // OpenEntityEditor.PARAM_JCR_ID, currNode + // .getIdentifier()); System.out.println("Double clicked"); // TODO open corresponding editor // Path newSelected = (Path) selection.getFirstElement(); @@ -283,11 +285,15 @@ public class MyFilesView extends ViewPart implements IDoubleClickListener { this.repository = repository; } + public void setAppWorkbenchService(AppWorkbenchService appWorkbenchService) { + this.appWorkbenchService = appWorkbenchService; + } + public void setNodeFileSystemProvider(FileSystemProvider nodeFileSystemProvider) { this.nodeFileSystemProvider = nodeFileSystemProvider; } - public void setFsAppService(FsAppService fsAppService) { - this.fsAppService = fsAppService; + public void setDocumentsService(DocumentsService documentsService) { + this.documentsService = documentsService; } } -- 2.30.2