X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=swt%2Forg.argeo.app.ui%2Fsrc%2Forg%2Fargeo%2Fapp%2Fui%2FSuiteApp.java;h=da32c1a2ee1aa6adf7a8b1f2110f059455cfd9ee;hb=563457d2ad28f2587b0bc42a1153c9a5e5230ca6;hp=b387ac17ce23c827ae4608401bc172e87c493450;hpb=6f8eb0aefe75025ee896498615cb1275f53d7f5b;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 b387ac1..da32c1a 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,31 +25,31 @@ 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.cms.AbstractCmsApp; -import org.argeo.cms.CmsUserManager; +import org.argeo.app.swt.ux.SwtAppLayer; +import org.argeo.app.swt.ux.SwtAppUi; +import org.argeo.app.ux.AbstractArgeoApp; +import org.argeo.app.ux.AppUi; +import org.argeo.app.ux.SuiteUxEvent; 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.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 { +public class SuiteApp extends AbstractArgeoApp implements CmsEventSubscriber { private final static CmsLog log = CmsLog.getLog(SuiteApp.class); public final static String PUBLIC_BASE_PATH_PROPERTY = "publicBasePath"; @@ -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(() -> { @@ -463,7 +474,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { 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)); @@ -472,14 +483,14 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { 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(); @@ -508,7 +519,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { } else { Content node = getContentFromEvent(ui, event); if (node != null) { - SuiteLayer layer = findByType(layersByType, node); + SwtAppLayer layer = findByType(layersByType, node); ui.switchToLayer(layer, node); } } @@ -520,7 +531,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { }); } - protected Content getContentFromEvent(SuiteUi ui, Map event) { + protected Content getContentFromEvent(SwtAppUi ui, Map event) { ProvidedSession contentSession = (ProvidedSession) CmsUxUtils.getContentSession(contentRepository, ui.getCmsView()); @@ -530,21 +541,22 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { 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; + } + }