package ilarkesto.ui; import ilarkesto.base.Reflect; import ilarkesto.base.Str; import ilarkesto.base.Tm; import ilarkesto.base.Url; import ilarkesto.core.logging.Log; import ilarkesto.di.BeanContainer; import ilarkesto.di.BeanProvider; import ilarkesto.di.MultiBeanProvider; import ilarkesto.di.ReflectionBeanProvider; import ilarkesto.locale.Localizer; import ilarkesto.persistence.AEntity; import ilarkesto.ui.action.AAction; import ilarkesto.ui.usermessage.UserMessageService; public abstract class AUi { private static final Log LOG = Log.get(AUi.class); public static final String PARENT_VIEW_ID_PARAMETER = "parentViewId"; public static final String VIEW_ID_PARAMETER = "viewId"; public static final String URI_EXTENSION = ".xhtml"; public static final long DEFAULT_DIALOG_TIMEOUT = 1 * Tm.HOUR; protected BeanProvider model; // --- dependencies --- private UserMessageService userMessageService; public void setUserMessageService(UserMessageService userMessageService) { this.userMessageService = userMessageService; } protected Localizer localizer; public final void setLocalizer(Localizer localizer) { this.localizer = localizer; } public abstract void showView(Class<? extends AView> view); @Deprecated protected abstract void showView(String viewId); protected abstract void showDialog(Class<? extends AView> view); @Deprecated protected abstract void showDialog(String viewId); protected abstract Class<? extends AView> getEntityView(); public abstract void showWebPage(Url url); public abstract boolean isViewSet(); // --- --- public final void showView(Class<? extends AView> view, Object model) { setModel(model); showView(view); } public final void showView(AEntity entity, Object model) { if (entity == null) throw new IllegalArgumentException("entity == null"); MultiBeanProvider multiBeanProvider = new MultiBeanProvider(); multiBeanProvider.addBeanProvider(new ReflectionBeanProvider(model)); multiBeanProvider.addBeanProvider(new BeanContainer().put("entity", entity)); showView(getEntityView(), multiBeanProvider); } @Deprecated public final void showView(String viewId, Object model) { setModel(model); showView(viewId); } public final void showDialog(Class<? extends AView> view, Object model, Object blocker) throws DialogTimeoutException, InterruptedException { showDialog(view, model, blocker, DEFAULT_DIALOG_TIMEOUT); } @Deprecated public final void showDialog(String viewId, Object model, Object blocker) throws DialogTimeoutException, InterruptedException { showDialog(viewId, model, blocker, DEFAULT_DIALOG_TIMEOUT); } public final void showDialog(Class<? extends AView> view, Object model, Object blocker, long timeout) throws InterruptedException, DialogTimeoutException { setModel(model); showDialog(view); if (blocker != null) { long waitStart = System.currentTimeMillis(); // block until actionProvider triggers notify() (by next request) synchronized (blocker) { // TODO while (blocker.isNotReady()) blocker.wait(timeout); } if (timeout != 0) { timeout = Math.round(timeout * 0.95); long duration = System.currentTimeMillis() - waitStart; if (duration >= timeout) { LOG.info("Dialog timeout:", view); throw new DialogTimeoutException(view.getSimpleName()); } } } } public final void showDialog(String viewId, Object model, Object blocker, long timeout) throws InterruptedException, DialogTimeoutException { setModel(model); showDialog(viewId); if (blocker != null) { long waitStart = System.currentTimeMillis(); // block until actionProvider triggers notify() (by next request) synchronized (blocker) { // TODO while (blocker.isNotReady()) blocker.wait(timeout); } if (timeout != 0) { timeout = Math.round(timeout * 0.95); long duration = System.currentTimeMillis() - waitStart; if (duration >= timeout) { LOG.info("Dialog timeout:", viewId); throw new DialogTimeoutException(viewId); } } } } private void setModel(Object model) { if (model != null) { this.model = model instanceof BeanProvider ? ((BeanProvider) model) : new ReflectionBeanProvider(model); } } public final BeanProvider getModel() { return model; } public final UserMessageService getUserMessageService() { if (userMessageService == null) { userMessageService = new UserMessageService(); } return userMessageService; } public final Localizer getLocalizer() { return localizer; } // --- helper --- public static String getViewId(AEntity entity) { return "entity:" + entity.getId(); } public static String getViewIcon(Class<? extends AView> viewClass) { String icon = (String) Reflect.getFieldValue(viewClass, "ICON"); if (icon != null) return icon; return getViewId(viewClass); } public static String getViewId(Class<? extends AView> viewClass) { String id = viewClass.getSimpleName(); id = Str.removeSuffix(id, "WebView"); id = Str.lowercaseFirstLetter(id); return id; } public static Url getViewUrl(Class<? extends AView> viewClass) { return new Url(getViewId(viewClass)); } @Deprecated public static Url getViewUrl(String viewId) { return new Url(viewId); } public static Url getViewUrl(AEntity entity) { return new Url(entity.getId()); } public static Url createViewUrl(AEntity entity, String invokingViewId, String invokingViewParentViewId) { Url url = AUi.getViewUrl(entity); return url; } public static Url createActionUrl(String actionId) { return new Url(actionId); } public static Url createActionUrl(Class<? extends AAction> actionClass, AEntity entity) { return createActionUrl(actionClass).put("entity", entity.getId()); } public static Url createActionUrl(Class<? extends AAction> actionClass) { return createActionUrl(actionClass.getName()); } }