X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=swt%2Forg.argeo.app.ui%2Fsrc%2Forg%2Fargeo%2Fapp%2Fui%2FSuiteApp.java;h=8e3f9da6ad686839ca2d2bbadf5f83914bc16f3e;hb=429d8b4a26d3ca458d8e800fbec05e3ee23b65a5;hp=12dceb88c786bf853c9ab5eabb48cb53ec0ba0a0;hpb=2362aefd312e04eea437824f37cb6e63389cd361;p=gpl%2Fargeo-suite.git diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteApp.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteApp.java index 12dceb8..8e3f9da 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteApp.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteApp.java @@ -13,9 +13,6 @@ import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; -import javax.jcr.Node; -import javax.jcr.RepositoryException; -import javax.jcr.nodetype.NodeType; import javax.xml.namespace.QName; import org.argeo.api.acr.Content; @@ -28,28 +25,28 @@ import org.argeo.api.cms.CmsSession; import org.argeo.api.cms.ux.CmsTheme; import org.argeo.api.cms.ux.CmsUi; import org.argeo.api.cms.ux.CmsView; +import org.argeo.app.api.AppUserState; import org.argeo.app.api.EntityConstants; -import org.argeo.app.api.EntityNames; +import org.argeo.app.api.EntityName; import org.argeo.app.api.EntityType; import org.argeo.app.api.RankedObject; +import org.argeo.app.swt.ux.SwtAppLayer; +import org.argeo.app.swt.ux.SwtAppUi; +import org.argeo.app.ux.AppUi; +import org.argeo.app.ux.SuiteUxEvent; import org.argeo.cms.AbstractCmsApp; -import org.argeo.cms.CmsUserManager; import org.argeo.cms.LocaleUtils; import org.argeo.cms.Localized; import org.argeo.cms.acr.ContentUtils; -import org.argeo.cms.jcr.CmsJcrUtils; -import org.argeo.cms.jcr.acr.JcrContent; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.swt.acr.SwtUiProvider; import org.argeo.cms.swt.dialogs.CmsFeedback; +import org.argeo.cms.util.LangUtils; import org.argeo.cms.ux.CmsUxUtils; import org.argeo.eclipse.ui.specific.UiContext; -import org.argeo.jcr.JcrException; -import org.argeo.util.LangUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.osgi.framework.Constants; -import org.osgi.service.useradmin.User; /** The Argeo Suite App. */ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { @@ -83,18 +80,17 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { // TODO use QName as key for byType private Map> uiProvidersByPid = Collections.synchronizedMap(new HashMap<>()); private Map> uiProvidersByType = Collections.synchronizedMap(new HashMap<>()); - private Map> layersByPid = Collections.synchronizedSortedMap(new TreeMap<>()); - private Map> layersByType = Collections.synchronizedSortedMap(new TreeMap<>()); + private Map> layersByPid = Collections.synchronizedSortedMap(new TreeMap<>()); + private Map> layersByType = Collections.synchronizedSortedMap(new TreeMap<>()); - private CmsUserManager cmsUserManager; +// private CmsUserManager cmsUserManager; // TODO make more optimal or via CmsSession/CmsView - private Map managedUis = new HashMap<>(); + private Map managedUis = new HashMap<>(); // ACR private ContentRepository contentRepository; -// private JcrContentProvider jcrContentProvider; - + private AppUserState appUserState; // JCR // private Repository repository; @@ -132,7 +128,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { } public void destroy(Map properties) { - for (SuiteUi ui : managedUis.values()) + for (SwtAppUi ui : managedUis.values()) if (!ui.isDisposed()) { ui.getDisplay().syncExec(() -> ui.dispose()); } @@ -160,7 +156,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { CmsTheme theme = getTheme(uiName); if (theme != null) CmsSwtUtils.registerCmsTheme(uiParent.getShell(), theme); - SuiteUi argeoSuiteUi = new SuiteUi(uiParent, SWT.INHERIT_DEFAULT); + SwtAppUi argeoSuiteUi = new SwtAppUi(uiParent, SWT.INHERIT_DEFAULT); String uid = cmsView.getUid(); managedUis.put(uid, argeoSuiteUi); argeoSuiteUi.addDisposeListener((e) -> { @@ -183,7 +179,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { public void refreshUi(CmsUi cmsUi, String state) { try { Content context = null; - SuiteUi ui = (SuiteUi) cmsUi; + SwtAppUi ui = (SwtAppUi) cmsUi; String uiName = Objects.toString(ui.getParent().getData(UI_NAME_PROPERTY), null); if (uiName == null) @@ -233,8 +229,15 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { .get(ContentUtils.SLASH + CmsConstants.SYS_WORKSPACE + publicBasePath); ui.setUserDir(userDir); } else { - Content userDir = contentSession.getSessionRunDir(); + Content userDir = appUserState.getOrCreateSessionDir(contentSession, cmsSession); ui.setUserDir(userDir); +// Node userDirNode = jcrContentProvider.doInAdminSession((adminSession) -> { +// Node node = SuiteUtils.getOrCreateCmsSessionNode(adminSession, cmsSession); +// return node; +// }); +// Content userDir = contentSession +// .get(ContentUtils.SLASH + CmsConstants.SYS_WORKSPACE + userDirNode.getPath()); +// ui.setUserDir(userDir); } } initLocale(cmsSession); @@ -246,7 +249,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { refreshPart(headerUiProvider, ui.getHeader(), context); ui.refreshBelowHeader(true); for (String key : layersByPid.keySet()) { - SuiteLayer layer = layersByPid.get(key).get(); + SwtAppLayer layer = layersByPid.get(key).get(); ui.addLayer(key, layer); } @@ -282,7 +285,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { return uiProvidersByPid.get(pid).get(); } - private SuiteLayer findLayer(String pid) { + private SwtAppLayer findLayer(String pid) { if (!layersByPid.containsKey(pid)) return null; return layersByPid.get(pid).get(); @@ -292,143 +295,151 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { 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); - } - 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 : 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); - } - } - } - - 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); - } - - } else { - List objectClasses = content.getContentClasses(); - Set types = new TreeSet<>(); - for (QName cc : objectClasses) { - String type = cc.getPrefix() + ":" + cc.getLocalPart(); - if (byType.containsKey(type)) - types.add(type); - } - if (types.size() == 0) { - throw new IllegalArgumentException("No type found for " + content + " (" + objectClasses + ")"); - } - String type = types.iterator().next(); - if (!byType.containsKey(type)) - throw new IllegalArgumentException("No component found for " + content + " with type " + type); - return byType.get(type).get(); +// boolean checkJcr = false; +// if (checkJcr && 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 : 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); +// } +// } +// } +// +// 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); +// } +// +// } else { + Set types = new TreeSet<>(); + if (content.hasContentClass(EntityType.entity.qName())) { + String type = content.attr(EntityName.type.qName()); + if (type != null && byType.containsKey(type)) + types.add(type); } - } - - private static String listTypes(Node context) { - try { - StringBuilder sb = new StringBuilder(); - sb.append(context.getPrimaryNodeType().getName()); - for (NodeType superType : context.getPrimaryNodeType().getDeclaredSupertypes()) { - sb.append(' '); - sb.append(superType.getName()); - } - for (NodeType nodeType : context.getMixinNodeTypes()) { - sb.append(' '); - sb.append(nodeType.getName()); - if (nodeType.getName().equals(EntityType.local.get())) - sb.append('/').append(context.getProperty(EntityNames.ENTITY_TYPE).getString()); - for (NodeType superType : nodeType.getDeclaredSupertypes()) { - sb.append(' '); - sb.append(superType.getName()); - } - } - return sb.toString(); - } catch (RepositoryException e) { - throw new JcrException(e); + List objectClasses = content.getContentClasses(); + for (QName cc : objectClasses) { + String type = cc.getPrefix() + ":" + cc.getLocalPart(); + if (byType.containsKey(type)) + types.add(type); } + if (types.size() == 0) { + throw new IllegalArgumentException("No type found for " + content + " (" + objectClasses + ")"); + } + String type = types.iterator().next(); + if (!byType.containsKey(type)) + throw new IllegalArgumentException("No component found for " + content + " with type " + type); + return byType.get(type).get(); +// } } +// private static String listTypes(Node context) { +// try { +// StringBuilder sb = new StringBuilder(); +// sb.append(context.getPrimaryNodeType().getName()); +// for (NodeType superType : context.getPrimaryNodeType().getDeclaredSupertypes()) { +// sb.append(' '); +// sb.append(superType.getName()); +// } +// +// for (NodeType nodeType : context.getMixinNodeTypes()) { +// sb.append(' '); +// sb.append(nodeType.getName()); +// if (nodeType.getName().equals(EntityType.local.get())) +// sb.append('/').append(context.getProperty(EntityNames.ENTITY_TYPE).getString()); +// for (NodeType superType : nodeType.getDeclaredSupertypes()) { +// sb.append(' '); +// sb.append(superType.getName()); +// } +// } +// return sb.toString(); +// } catch (RepositoryException e) { +// throw new JcrException(e); +// } +// } + @Override public void setState(CmsUi cmsUi, String state) { + AppUi ui = (AppUi) cmsUi; if (state == null) return; if (!state.startsWith("/")) { - if (cmsUi instanceof SuiteUi) { - SuiteUi ui = (SuiteUi) cmsUi; - if (LOGIN.equals(state)) { - String appTitle = ""; - if (ui.getTitle() != null) - appTitle = ui.getTitle().lead(); - ui.getCmsView().stateChanged(state, appTitle); - return; - } - Map properties = new HashMap<>(); - String layerId = HOME_STATE.equals(state) ? defaultLayerPid : state; - properties.put(SuiteUxEvent.LAYER, layerId); - properties.put(SuiteUxEvent.CONTENT_PATH, HOME_STATE); - ui.getCmsView().sendEvent(SuiteUxEvent.switchLayer.topic(), properties); +// if (cmsUi instanceof SwtAppUi) { +// SwtAppUi ui = (SwtAppUi) cmsUi; + if (LOGIN.equals(state)) { + String appTitle = ""; + if (ui.getTitle() != null) + appTitle = ui.getTitle().lead(); + ui.getCmsView().stateChanged(state, appTitle); + return; } + Map properties = new HashMap<>(); + String layerId = HOME_STATE.equals(state) ? defaultLayerPid : state; + properties.put(SuiteUxEvent.LAYER, layerId); + properties.put(SuiteUxEvent.CONTENT_PATH, HOME_STATE); + ui.getCmsView().sendEvent(SuiteUxEvent.switchLayer.topic(), properties); +// } return; } - SuiteUi suiteUi = (SuiteUi) cmsUi; - if (suiteUi.isLoginScreen()) { +// SwtAppUi suiteUi = (SwtAppUi) cmsUi; + if (ui.isLoginScreen()) { return; } - Content node = stateToNode(suiteUi, state); + Content node = stateToNode(ui, state); if (node == null) { - suiteUi.getCmsView().navigateTo(HOME_STATE); + ui.getCmsView().navigateTo(HOME_STATE); } else { - suiteUi.getCmsView().sendEvent(SuiteUxEvent.switchLayer.topic(), SuiteUxEvent.eventProperties(node)); - suiteUi.getCmsView().sendEvent(SuiteUxEvent.refreshPart.topic(), SuiteUxEvent.eventProperties(node)); + ui.getCmsView().sendEvent(SuiteUxEvent.switchLayer.topic(), SuiteUxEvent.eventProperties(node)); + ui.getCmsView().sendEvent(SuiteUxEvent.refreshPart.topic(), SuiteUxEvent.eventProperties(node)); } } // TODO move it to an internal package? - static String nodeToState(Content node) { + public static String nodeToState(Content node) { return node.getPath(); } - private Content stateToNode(SuiteUi suiteUi, String state) { + private Content stateToNode(CmsUi suiteUi, String state) { if (suiteUi == null) return null; if (state == null || !state.startsWith("/")) @@ -449,7 +460,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { public void onEvent(String topic, Map event) { // Specific UI related events - SuiteUi ui = getRelatedUi(event); + SwtAppUi ui = getRelatedUi(event); if (ui == null) return; ui.getCmsView().runAs(() -> { @@ -459,27 +470,27 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { appTitle = ui.getTitle().lead() + " - "; if (SuiteUiUtils.isTopic(topic, SuiteUxEvent.refreshPart)) { - Content node = getNode(ui, event); + Content node = getContentFromEvent(ui, event); if (node == null) return; SwtUiProvider uiProvider = findByType(uiProvidersByType, node); - SuiteLayer layer = findByType(layersByType, node); + SwtAppLayer layer = findByType(layersByType, node); ui.switchToLayer(layer, node); layer.view(uiProvider, ui.getCurrentWorkArea(), node); ui.getCmsView().stateChanged(nodeToState(node), appTitle + CmsUxUtils.getTitle(node)); } else if (SuiteUiUtils.isTopic(topic, SuiteUxEvent.openNewPart)) { - Content node = getNode(ui, event); + Content node = getContentFromEvent(ui, event); if (node == null) return; SwtUiProvider uiProvider = findByType(uiProvidersByType, node); - SuiteLayer layer = findByType(layersByType, node); + SwtAppLayer layer = findByType(layersByType, node); ui.switchToLayer(layer, node); layer.open(uiProvider, ui.getCurrentWorkArea(), node); ui.getCmsView().stateChanged(nodeToState(node), appTitle + CmsUxUtils.getTitle(node)); } else if (SuiteUiUtils.isTopic(topic, SuiteUxEvent.switchLayer)) { String layerId = get(event, SuiteUxEvent.LAYER); if (layerId != null) { - SuiteLayer suiteLayer = findLayer(layerId); + SwtAppLayer suiteLayer = findLayer(layerId); if (suiteLayer == null) throw new IllegalArgumentException("No layer '" + layerId + "' available."); Localized layerTitle = suiteLayer.getTitle(); @@ -488,7 +499,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { String title = null; if (layerTitle != null) title = layerTitle.lead(); - Content nodeFromState = getNode(ui, event); + Content nodeFromState = getContentFromEvent(ui, event); if (nodeFromState != null && nodeFromState.getPath().equals(ui.getUserDir().getPath())) { // default layer view is forced String state = defaultLayerPid.equals(layerId) ? "~" : layerId; @@ -506,9 +517,9 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { } } } else { - Content node = getNode(ui, event); + Content node = getContentFromEvent(ui, event); if (node != null) { - SuiteLayer layer = findByType(layersByType, node); + SwtAppLayer layer = findByType(layersByType, node); ui.switchToLayer(layer, node); } } @@ -520,31 +531,32 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { }); } - private Content getNode(SuiteUi ui, Map event) { + protected Content getContentFromEvent(SwtAppUi ui, Map event) { ProvidedSession contentSession = (ProvidedSession) CmsUxUtils.getContentSession(contentRepository, ui.getCmsView()); String path = get(event, SuiteUxEvent.CONTENT_PATH); - if (path != null && path.equals(HOME_STATE)) + if (path != null && (path.equals(HOME_STATE) || path.equals(""))) return ui.getUserDir(); Content node; if (path == null) { - // look for a user - String username = get(event, SuiteUxEvent.USERNAME); - if (username == null) - return null; - User user = cmsUserManager.getUser(username); - if (user == null) - return null; - node = ContentUtils.roleToContent(cmsUserManager, contentSession, user); + return null; +// // look for a user +// String username = get(event, SuiteUxEvent.USERNAME); +// if (username == null) +// return null; +// User user = cmsUserManager.getUser(username); +// if (user == null) +// return null; +// node = ContentUtils.roleToContent(cmsUserManager, contentSession, user); } else { node = contentSession.get(path); } return node; } - private SuiteUi getRelatedUi(Map eventProperties) { + private SwtAppUi getRelatedUi(Map eventProperties) { return managedUis.get(get(eventProperties, CMS_VIEW_UID_PROPERTY)); } @@ -594,7 +606,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { } } - public void addLayer(SuiteLayer layer, Map properties) { + public void addLayer(SwtAppLayer layer, Map properties) { if (properties.containsKey(Constants.SERVICE_PID)) { String pid = (String) properties.get(Constants.SERVICE_PID); RankedObject.putIfHigherRank(layersByPid, pid, layer, properties); @@ -606,11 +618,11 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { } } - public void removeLayer(SuiteLayer layer, Map properties) { + public void removeLayer(SwtAppLayer layer, Map properties) { if (properties.containsKey(Constants.SERVICE_PID)) { String pid = (String) properties.get(Constants.SERVICE_PID); if (layersByPid.containsKey(pid)) { - if (layersByPid.get(pid).equals(new RankedObject(layer, properties))) { + if (layersByPid.get(pid).equals(new RankedObject(layer, properties))) { layersByPid.remove(pid); } } @@ -619,7 +631,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { 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); } } @@ -627,15 +639,20 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { } } - public void setCmsUserManager(CmsUserManager cmsUserManager) { - this.cmsUserManager = cmsUserManager; - } +// public void setCmsUserManager(CmsUserManager cmsUserManager) { +// this.cmsUserManager = cmsUserManager; +// } - protected ContentRepository getContentRepository() { - return contentRepository; - } +// protected ContentRepository getContentRepository() { +// return contentRepository; +// } public void setContentRepository(ContentRepository contentRepository) { this.contentRepository = contentRepository; } + + public void setAppUserState(AppUserState appUserState) { + this.appUserState = appUserState; + } + }