+ try {
+ Content context = null;
+ SwtAppUi ui = (SwtAppUi) cmsUi;
+ ui.updateLastAccess();
+
+ 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);
+
+ SwtUiProvider headerUiProvider = findStructuralUiProvider(SwtAppUi.Structural.header.name());
+ SwtUiProvider footerUiProvider = findStructuralUiProvider(SwtAppUi.Structural.footer.name());
+ SwtUiProvider leadPaneUiProvider;
+ if (adminUiName.equals(uiName)) {
+ leadPaneUiProvider = findStructuralUiProvider(SwtAppUi.Structural.adminLeadPane.name());
+ } else {
+ leadPaneUiProvider = findStructuralUiProvider(SwtAppUi.Structural.leadPane.name());
+ }
+
+ Localized appTitle = null;
+ if (headerUiProvider instanceof DefaultHeader) {
+ appTitle = ((DefaultHeader) headerUiProvider).getTitle();
+ }
+ ui.setTitle(appTitle);
+
+ if (cmsView.isAnonymous() && publicBasePath == null) {// internal app, must login
+ ui.logout();
+ ui.setLoginScreen(true);
+ if (headerUiProvider != null)
+ refreshPart(headerUiProvider, ui.getHeader(), context);
+ ui.refreshBelowHeader(false);
+ SwtUiProvider loginScreenUiProvider = findStructuralUiProvider(SwtAppUi.Structural.loginScreen.name());
+ refreshPart(loginScreenUiProvider, ui.getBelowHeader(), context);
+ if (footerUiProvider != null)
+ refreshPart(footerUiProvider, ui.getFooter(), context);
+ ui.layout(true, true);
+ setState(ui, LOGIN);
+ } else {
+ if (LOGIN.equals(state))
+ state = null;
+ if (ui.isLoginScreen()) {
+ ui.setLoginScreen(false);
+ }
+ CmsSession cmsSession = cmsView.getCmsSession();
+ if (ui.getUserDir() == null) {
+ // FIXME NPE on CMSSession when logging in from anonymous
+ if (cmsSession == null || cmsView.isAnonymous()) {
+ assert publicBasePath != null;
+ Content userDir = contentSession
+ .get(Content.ROOT_PATH + CmsConstants.SYS_WORKSPACE + publicBasePath);
+ ui.setUserDir(userDir);
+ } else {
+ Content userDir = appUserState.getOrCreateSessionDir(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);
+ context = stateToNode(ui, state);
+ if (context == null)
+ context = ui.getUserDir();
+
+ if (headerUiProvider != null)
+ refreshPart(headerUiProvider, ui.getHeader(), context);
+ ui.refreshBelowHeader(true);
+ for (String key : layersByPid.keySet()) {
+ SwtAppLayer layer = layersByPid.get(key).get();
+ ui.addLayer(key, layer);
+ }
+
+ if (leadPaneUiProvider != null)
+ refreshPart(leadPaneUiProvider, ui.getLeadPane(), context);
+ if (footerUiProvider != null)
+ refreshPart(footerUiProvider, ui.getFooter(), context);
+ ui.layout(true, true);
+ setState(ui, state != null ? state : defaultLayerPid);
+ }
+ } catch (Exception e) {
+ CmsFeedback.error("Unexpected exception", e);
+ }
+ }
+
+ private void initLocale(CmsSession cmsSession) {
+ if (cmsSession == null)
+ return;
+ Locale locale = cmsSession.getLocale();
+ UiContext.setLocale(locale);
+ LocaleUtils.setThreadLocale(locale);
+
+ }
+
+ private void refreshPart(SwtUiProvider uiProvider, Composite part, Content context) {
+ CmsSwtUtils.clear(part);
+ uiProvider.createUiPart(part, context);
+ }
+
+ private SwtUiProvider findStructuralUiProvider(String suffix) {
+ SwtUiProvider res = null;
+ if (pidPrefix != null)
+ res = findUiProvider(pidPrefix + "." + suffix);
+ if (res != null)
+ return res;
+ if (sharedPidPrefix != null)
+ res = findUiProvider(sharedPidPrefix + "." + suffix);
+ return res;
+ }
+
+ private SwtUiProvider findUiProvider(String pid) {
+ if (!uiProvidersByPid.containsKey(pid))
+ return null;
+ return uiProvidersByPid.get(pid).get();
+ }
+
+ private SwtAppLayer findLayer(String pid) {
+ if (!layersByPid.containsKey(pid))
+ return null;
+ return layersByPid.get(pid).get();
+ }
+
+ private <T> T findByType(Map<String, RankedObject<T>> byType, Content content) {
+ if (content == null)
+ throw new IllegalArgumentException("A node should be provided");
+
+// boolean checkJcr = false;
+// if (checkJcr && content instanceof JcrContent) {
+// Node context = ((JcrContent) content).getJcrNode();
+// try {
+// // mixins
+// Set<String> 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<String> 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);
+ }