X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms.ui.rap%2Fsrc%2Forg%2Fargeo%2Fcms%2Fweb%2FCmsWebEntryPoint.java;h=b1691cb0536f0d725e5d8217bcb1c60c831b142f;hb=fad8d9f09e9ba262c2f807db6c3cb46e170031e1;hp=2961eead9c386951f21b2156d62f909a77f6b90b;hpb=94bd4b03ff3ca9d1875bf6424383d648e604b93a;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java b/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java index 2961eead9..b1691cb05 100644 --- a/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java +++ b/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java @@ -4,6 +4,7 @@ import static org.eclipse.rap.rwt.internal.service.ContextProvider.getApplicatio import java.security.PrivilegedAction; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import java.util.UUID; @@ -14,6 +15,8 @@ import javax.security.auth.login.LoginException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.api.NodeConstants; +import org.argeo.cms.LocaleUtils; +import org.argeo.cms.auth.CmsSession; import org.argeo.cms.auth.CurrentUser; import org.argeo.cms.auth.HttpRequestCallbackHandler; import org.argeo.cms.ui.CmsApp; @@ -32,6 +35,7 @@ import org.eclipse.rap.rwt.client.service.BrowserNavigationEvent; import org.eclipse.rap.rwt.client.service.BrowserNavigationListener; import org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle; import org.eclipse.swt.SWT; +import org.eclipse.swt.SWTError; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; @@ -39,6 +43,7 @@ import org.osgi.service.event.Event; import org.osgi.service.event.EventAdmin; /** The {@link CmsView} for a {@link CmsWebApp}. */ +@SuppressWarnings("restriction") public class CmsWebEntryPoint implements EntryPoint, CmsView, BrowserNavigationListener { private static final long serialVersionUID = 7733510691684570402L; private final static Log log = LogFactory.getLog(CmsWebEntryPoint.class); @@ -101,9 +106,20 @@ public class CmsWebEntryPoint implements EntryPoint, CmsView, BrowserNavigationL try { uxContext = new SimpleUxContext(); imageManager = new DefaultImageManager(); + CmsSession cmsSession = getCmsSession(); + if (cmsSession != null) { + UiContext.setLocale(cmsSession.getLocale()); + LocaleUtils.setThreadLocale(cmsSession.getLocale()); + } else { + Locale rwtLocale = RWT.getUISession().getLocale(); + LocaleUtils.setThreadLocale(rwtLocale); + } + parent.setData(CmsApp.UI_NAME_PROPERTY, uiName); ui = cmsWebApp.getCmsApp().initUi(parent); - ui.setData(CmsApp.UI_NAME_PROPERTY, uiName); ui.setLayoutData(CmsUiUtils.fillAll()); + // we need ui to be set before refresh so that CmsView can store UI context data + // in it. + cmsWebApp.getCmsApp().refreshUi(ui, null); } catch (Exception e) { throw new IllegalStateException("Cannot create entrypoint contents", e); } @@ -116,6 +132,10 @@ public class CmsWebEntryPoint implements EntryPoint, CmsView, BrowserNavigationL return loginContext.getSubject(); } + public T doAs(PrivilegedAction action) { + return Subject.doAs(getSubject(), action); + } + @Override public boolean isAnonymous() { return CurrentUser.isAnonymous(getSubject()); @@ -153,9 +173,17 @@ public class CmsWebEntryPoint implements EntryPoint, CmsView, BrowserNavigationL @Override public void exception(final Throwable e) { - exception = e; - log.error("Unexpected exception in CMS", e); - doRefresh(); + if (e instanceof SWTError) { + SWTError swtError = (SWTError) e; + if (swtError.code == SWT.ERROR_FUNCTION_DISPOSED) + return; + } + ui.getDisplay().syncExec(() -> { +// CmsFeedback.show("Unexpected exception in CMS", e); + exception = e; +// log.error("Unexpected exception in CMS", e); + doRefresh(); + }); } protected synchronized void doRefresh() { @@ -196,7 +224,8 @@ public class CmsWebEntryPoint implements EntryPoint, CmsView, BrowserNavigationL public void navigateTo(String state) { exception = null; String title = setState(state); - doRefresh(); + if (title != null) + doRefresh(); if (browserNavigation != null) browserNavigation.pushState(state, title); } @@ -209,7 +238,7 @@ public class CmsWebEntryPoint implements EntryPoint, CmsView, BrowserNavigationL @Override public void navigated(BrowserNavigationEvent event) { setState(event.getState()); - doRefresh(); + // doRefresh(); } @Override @@ -223,6 +252,35 @@ public class CmsWebEntryPoint implements EntryPoint, CmsView, BrowserNavigationL eventAdmin.sendEvent(new Event(topic, properties)); } + @Override + public void stateChanged(String state, String title) { + browserNavigation.pushState(state, title); + } + + @Override + public CmsSession getCmsSession() { + CmsSession cmsSession = CmsSession.getCmsSession(cmsWebApp.getBundleContext(), getSubject()); + return cmsSession; + } + + @Override + public Object getData(String key) { + if (ui != null) { + return ui.getData(key); + } else { + throw new IllegalStateException("UI is not initialized"); + } + } + + @Override + public void setData(String key, Object value) { + if (ui != null) { + ui.setData(key, value); + } else { + throw new IllegalStateException("UI is not initialized"); + } + } + /* * EntryPoint IMPLEMENTATION */ @@ -242,12 +300,34 @@ public class CmsWebEntryPoint implements EntryPoint, CmsView, BrowserNavigationL // } shell.open(); if (getApplicationContext().getLifeCycleFactory().getLifeCycle() instanceof RWTLifeCycle) { - while (!shell.isDisposed()) { - if (!display.readAndDispatch()) { - display.sleep(); + eventLoop: while (!shell.isDisposed()) { + try { + if (!display.readAndDispatch()) { + display.sleep(); + } + } catch (Throwable e) { + if (e instanceof SWTError) { + SWTError swtError = (SWTError) e; + if (swtError.code == SWT.ERROR_FUNCTION_DISPOSED) { + log.error("Unexpected SWT error in event loop, ignoring it. " + e.getMessage()); + continue eventLoop; + } else { + log.error("Unexpected SWT error in event loop, shutting down...", e); + break eventLoop; + } + } else if (e instanceof ThreadDeath) { + throw (ThreadDeath) e; + } else if (e instanceof Error) { + log.error("Unexpected error in event loop, shutting down...", e); + break eventLoop; + } else { + log.error("Unexpected exception in event loop, ignoring it. " + e.getMessage()); + continue eventLoop; + } } } - display.dispose(); + if (!display.isDisposed()) + display.dispose(); } return 0; }