X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.app.ui%2Fsrc%2Forg%2Fargeo%2Fapp%2Fui%2FSuiteApp.java;h=8bbe7d3aceb15e9f51c17d1eff3d93a4c8f4e657;hb=97286adeb9f00e02c4a245674ff45628f8aaa9de;hp=f6770dbac1302d30915f1bdb04bd22a721273fe4;hpb=a4d521418275922723b18b5966ccbcac5624c098;p=gpl%2Fargeo-suite.git 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 f6770db..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,13 +14,16 @@ 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.spi.ProvidedSession; +import org.argeo.api.cms.CmsConstants; +import org.argeo.api.cms.CmsLog; import org.argeo.api.cms.CmsSession; import org.argeo.api.cms.CmsTheme; import org.argeo.api.cms.CmsUi; @@ -30,17 +33,17 @@ import org.argeo.app.api.EntityNames; import org.argeo.app.api.EntityType; import org.argeo.app.api.RankedObject; import org.argeo.app.core.SuiteUtils; -import org.argeo.api.cms.CmsLog; import org.argeo.cms.AbstractCmsApp; import org.argeo.cms.CmsUserManager; 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.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; @@ -89,7 +92,12 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { // TODO make more optimal or via CmsSession/CmsView private Map managedUis = new HashMap<>(); - private Repository repository; + // ACR + private ContentRepository contentRepository; +// private JcrContentProvider jcrContentProvider; + + // JCR +// private Repository repository; public void init(Map properties) { if (log.isDebugEnabled()) @@ -171,13 +179,16 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { @Override public void refreshUi(CmsUi cmsUi, String state) { try { - Node context = null; + Content context = null; SuiteUi ui = (SuiteUi) cmsUi; String uiName = Objects.toString(ui.getParent().getData(UI_NAME_PROPERTY), null); if (uiName == null) throw new IllegalStateException("UI name should not be null"); CmsView cmsView = CmsSwtUtils.getCmsView(ui); + + ProvidedSession contentSession = (ProvidedSession) CmsUxUtils.getContentSession(contentRepository, cmsView); + CmsUiProvider headerUiProvider = findUiProvider(headerPid); CmsUiProvider footerUiProvider = findUiProvider(footerPid); CmsUiProvider leadPaneUiProvider; @@ -207,26 +218,32 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { if (LOGIN.equals(state)) state = null; CmsSession cmsSession = cmsView.getCmsSession(); - if (ui.getUserDir() == null) { + if (ui.getUserDirNode() == null) { // FIXME NPE on CMSSession when logging in from anonymous if (cmsSession == null || cmsView.isAnonymous()) { assert publicBasePath != null; - ui.initSessions(getRepository(), publicBasePath); + Content userDir = contentSession.get(CmsConstants.SYS_WORKSPACE + publicBasePath); + ui.setUserDir(userDir); +// ui.initSessions(getRepository(), publicBasePath); } else { - Session adminSession = null; - try { - adminSession = CmsJcrUtils.openDataAdminSession(getRepository(), null); - Node userDir = SuiteUtils.getOrCreateCmsSessionNode(adminSession, cmsSession); - ui.initSessions(getRepository(), userDir.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); context = stateToNode(ui, state); if (context == null) - context = ui.getUserDir(); + context = ui.getUserDirNode(); if (headerUiProvider != null) refreshPart(headerUiProvider, ui.getHeader(), context); @@ -257,7 +274,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { } - private void refreshPart(CmsUiProvider uiProvider, Composite part, Node context) { + private void refreshPart(CmsUiProvider uiProvider, Composite part, Content context) { CmsSwtUtils.clear(part); uiProvider.createUiPart(part, context); } @@ -274,59 +291,67 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { return layersByPid.get(pid).get(); } - private T findByType(Map> byType, Node context) { - if (context == null) + private T findByType(Map> byType, Content content) { + if (content == null) throw new IllegalArgumentException("A node should be provided"); - 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."); } } @@ -378,7 +403,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { return; } SuiteUi suiteUi = (SuiteUi) cmsUi; - Node node = stateToNode(suiteUi, state); + Content node = stateToNode(suiteUi, state); if (node == null) { suiteUi.getCmsView().navigateTo(HOME_STATE); } else { @@ -388,40 +413,46 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { } // TODO move it to an internal package? - static String nodeToState(Node node) { - return '/' + Jcr.getWorkspaceName(node) + Jcr.getPath(node); + static String nodeToState(Content node) { + return node.getPath(); } - private Node stateToNode(SuiteUi suiteUi, String state) { + private Content stateToNode(SuiteUi suiteUi, String state) { if (suiteUi == null) return null; if (state == null || !state.startsWith("/")) return null; - String path = state.substring(1); - String workspace; - if (path.equals("")) { - workspace = null; - path = "/"; - } else { - int index = path.indexOf('/'); - if (index == 0) { - log.error("Cannot interpret " + state); -// cmsView.navigateTo("~"); - return null; - } else if (index > 0) { - workspace = path.substring(0, index); - path = path.substring(index); - } else {// index<0, assuming root node - workspace = path; - path = "/"; - } - } - Session session = suiteUi.getSession(workspace); - if (session == null) - return null; - Node node = Jcr.getNode(session, path); - return node; + String path = state; +// String path = state.substring(1); +// String workspace; +// if (path.equals("")) { +// workspace = null; +// path = "/"; +// } else { +// int index = path.indexOf('/'); +// if (index == 0) { +// log.error("Cannot interpret " + state); +//// cmsView.navigateTo("~"); +// return null; +// } else if (index > 0) { +// workspace = path.substring(0, index); +// path = path.substring(index); +// } else {// index<0, assuming root node +// workspace = path; +// path = "/"; +// } +// } + + ProvidedSession contentSession = (ProvidedSession) CmsUxUtils.getContentSession(contentRepository, + suiteUi.getCmsView()); + return contentSession.get(path); +// Session session = jcrContentProvider.getJcrSession(contentSession, workspace); +//// Session session = suiteUi.getSession(workspace); +// if (session == null) +// return null; +// Node node = Jcr.getNode(session, path); +// return node; } /* @@ -443,23 +474,23 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { // String currentLayerId = ui.getCurrentLayerId(); // SuiteLayer currentLayer = currentLayerId != null ? layersByPid.get(currentLayerId).get() : null; if (SuiteUiUtils.isTopic(event, SuiteEvent.refreshPart)) { - Node node = getNode(ui, event); + Content node = getNode(ui, event); if (node == null) return; CmsUiProvider uiProvider = findByType(uiProvidersByType, node); SuiteLayer layer = findByType(layersByType, node); ui.switchToLayer(layer, node); ui.getCmsView().runAs(() -> layer.view(uiProvider, ui.getCurrentWorkArea(), node)); - ui.getCmsView().stateChanged(nodeToState(node), appTitle + Jcr.getTitle(node)); + ui.getCmsView().stateChanged(nodeToState(node), appTitle + CmsUxUtils.getTitle(node)); } else if (SuiteUiUtils.isTopic(event, SuiteEvent.openNewPart)) { - Node node = getNode(ui, event); + Content node = getNode(ui, event); if (node == null) return; CmsUiProvider uiProvider = findByType(uiProvidersByType, node); SuiteLayer layer = findByType(layersByType, node); ui.switchToLayer(layer, node); ui.getCmsView().runAs(() -> layer.open(uiProvider, ui.getCurrentWorkArea(), node)); - ui.getCmsView().stateChanged(nodeToState(node), appTitle + Jcr.getTitle(node)); + ui.getCmsView().stateChanged(nodeToState(node), appTitle + CmsUxUtils.getTitle(node)); } else if (SuiteUiUtils.isTopic(event, SuiteEvent.switchLayer)) { String layerId = get(event, SuiteEvent.LAYER); if (layerId != null) { @@ -469,29 +500,29 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { throw new IllegalArgumentException("No layer '" + layerId + "' available."); Localized layerTitle = suiteLayer.getTitle(); // FIXME make sure we don't rebuild the work area twice - Composite workArea = ui.getCmsView().doAs(() -> ui.switchToLayer(layerId, ui.getUserDir())); + Composite workArea = ui.getCmsView().doAs(() -> ui.switchToLayer(layerId, ui.getUserDirNode())); String title = null; if (layerTitle != null) title = layerTitle.lead(); - Node nodeFromState = getNode(ui, event); - if (nodeFromState != null && nodeFromState.getPath().equals(ui.getUserDir().getPath())) { + Content nodeFromState = getNode(ui, event); + if (nodeFromState != null && nodeFromState.getPath().equals(ui.getUserDirNode().getPath())) { // default layer view is forced String state = defaultLayerPid.equals(layerId) ? "~" : layerId; ui.getCmsView().stateChanged(state, appTitle + title); suiteLayer.view(null, workArea, nodeFromState); } else { - Node layerCurrentContext = suiteLayer.getCurrentContext(workArea); + Content layerCurrentContext = suiteLayer.getCurrentContext(workArea); if (layerCurrentContext != null) { // layer was already showing a context so we set the state to it ui.getCmsView().stateChanged(nodeToState(layerCurrentContext), - appTitle + Jcr.getTitle(layerCurrentContext)); + appTitle + CmsUxUtils.getTitle(layerCurrentContext)); } else { // no context was shown ui.getCmsView().stateChanged(layerId, appTitle + title); } } } else { - Node node = getNode(ui, event); + Content node = getNode(ui, event); if (node != null) { SuiteLayer layer = findByType(layersByType, node); ui.getCmsView().runAs(() -> ui.switchToLayer(layer, node)); @@ -505,14 +536,21 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { } - private Node getNode(SuiteUi ui, Event event) { - String nodePath = get(event, SuiteEvent.NODE_PATH); - if (nodePath != null && nodePath.equals(HOME_STATE)) + private Content getNode(SuiteUi ui, Event event) { + ProvidedSession contentSession = (ProvidedSession) CmsUxUtils.getContentSession(contentRepository, + ui.getCmsView()); + + String path = get(event, SuiteEvent.CONTENT_PATH); + +// String nodePath = get(event, SuiteEvent.NODE_PATH); + if (path != null && path.equals(HOME_STATE)) return ui.getUserDir(); - String workspaceName = get(event, SuiteEvent.WORKSPACE); - Session session = ui.getSession(workspaceName); - Node node; - if (nodePath == null) { +// String workspace = get(event, SuiteEvent.WORKSPACE); + +// Session session = jcrContentProvider.getJcrSession(contentSession, workspace); +//// Session session = ui.getSession(workspace); + Content node; + if (path == null) { // look for a user String username = get(event, SuiteEvent.USERNAME); if (username == null) @@ -527,20 +565,22 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { throw new IllegalArgumentException("Badly formatted username", e); } String userNodePath = SuiteUtils.getUserNodePath(userDn); - if (Jcr.itemExists(session, userNodePath)) - node = Jcr.getNode(session, userNodePath); - else { - Session adminSession = null; - try { - adminSession = CmsJcrUtils.openDataAdminSession(getRepository(), workspaceName); - SuiteUtils.getOrCreateUserNode(adminSession, userDn); - } finally { - Jcr.logout(adminSession); - } - node = Jcr.getNode(session, userNodePath); - } + // FIXME deal with home path + return null; +// if (Jcr.itemExists(session, userNodePath)) +// node = Jcr.getNode(session, userNodePath); +// else { +// Session adminSession = null; +// try { +// adminSession = CmsJcrUtils.openDataAdminSession(getRepository(), workspace); +// SuiteUtils.getOrCreateUserNode(adminSession, userDn); +// } finally { +// Jcr.logout(adminSession); +// } +// node = Jcr.getNode(session, userNodePath); +// } } else { - node = Jcr.getNode(session, nodePath); + node = contentSession.get(path); } return node; } @@ -620,7 +660,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { List types = LangUtils.toStringList(properties.get(EntityConstants.TYPE)); for (String type : types) { if (layersByType.containsKey(type)) { - if (layersByType.get(type).equals(new RankedObject(layer, properties))) { + if (layersByType.get(type).equals(new RankedObject(layer, properties))) { layersByType.remove(type); } } @@ -632,12 +672,24 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { this.cmsUserManager = cmsUserManager; } - public Repository getRepository() { - return repository; +// protected Repository getRepository() { +// return repository; +// } +// +// public void setRepository(Repository repository) { +// this.repository = repository; +// } + + protected ContentRepository getContentRepository() { + return contentRepository; } - public void setRepository(Repository repository) { - this.repository = repository; + public void setContentRepository(ContentRepository contentRepository) { + this.contentRepository = contentRepository; } +// public void setJcrContentProvider(JcrContentProvider jcrContentProvider) { +// this.jcrContentProvider = jcrContentProvider; +// } + }