diff --git a/Jenkinsfile b/Jenkinsfile index 4ffe65e24..0d0d293c8 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -8,7 +8,7 @@ pipeline { } agent { docker { - image 'silverpeas/silverbuild' + image 'silverpeas/silverbuild:6.3' args '-v $HOME/.m2:/home/silverbuild/.m2 -v $HOME/.gitconfig:/home/silverbuild/.gitconfig -v $HOME/.ssh:/home/silverbuild/.ssh -v $HOME/.gnupg:/home/silverbuild/.gnupg' } } diff --git a/mobile-configuration/pom.xml b/mobile-configuration/pom.xml index 37b798771..afa604f36 100644 --- a/mobile-configuration/pom.xml +++ b/mobile-configuration/pom.xml @@ -28,7 +28,7 @@ <parent> <groupId>org.silverpeas.components</groupId> <artifactId>mobile</artifactId> - <version>6.3-SNAPSHOT</version> + <version>6.3.7-SNAPSHOT</version> </parent> <groupId>org.silverpeas.components.mobile</groupId> diff --git a/mobile-configuration/src/main/config/properties/org/silverpeas/mobile/mobileSettings.properties b/mobile-configuration/src/main/config/properties/org/silverpeas/mobile/mobileSettings.properties index e16ec9889..95f0aa07c 100644 --- a/mobile-configuration/src/main/config/properties/org/silverpeas/mobile/mobileSettings.properties +++ b/mobile-configuration/src/main/config/properties/org/silverpeas/mobile/mobileSettings.properties @@ -25,6 +25,8 @@ defaultDomainId=0 homepage.lastpublications=true # display upcomming events or not on main home page homepage.lastevents=true +# display lasts news or not on main home page +homepage.lastnews=true # display free zone on main home page homepage.freezone=true # display free zone thin on main home page @@ -33,6 +35,10 @@ homepage.freezonethin=true spacehomepage.lastpublications=true # display last events or not on spaces home page spacehomepage.lastevents=true +# display last news or not on spaces home page +spacehomepage.lastnews=true + +spacehomepage.displayUrlType=true # home page zones order homepage.zone.changeorder=false @@ -102,6 +108,7 @@ chat.enable=false # external url for help help.url= +help.target= # specials parameters ios.link.open.in.iframe=true @@ -122,4 +129,7 @@ manifest.json.path= #footer custom buttons #customButtonUrl1= -#customButtonUrl2= \ No newline at end of file +#customButtonUrl2= + +# maintain http session (store ids in local storage) +maintain.session=true \ No newline at end of file diff --git a/mobile-war/pom.xml b/mobile-war/pom.xml index 95a547512..5ecdd213a 100644 --- a/mobile-war/pom.xml +++ b/mobile-war/pom.xml @@ -30,7 +30,7 @@ <parent> <groupId>org.silverpeas.components</groupId> <artifactId>mobile</artifactId> - <version>6.3-SNAPSHOT</version> + <version>6.3.7-SNAPSHOT</version> </parent> <groupId>org.silverpeas.components.mobile</groupId> diff --git a/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java b/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java index c6504d919..176311cff 100644 --- a/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java +++ b/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java @@ -43,6 +43,7 @@ import org.silverpeas.core.util.SettingBundle; import org.silverpeas.core.util.URLUtil; import org.silverpeas.core.web.mvc.controller.MainSessionController; +import org.silverpeas.mobile.shared.dto.ContentsTypes; import javax.servlet.Filter; import javax.servlet.FilterChain; @@ -102,10 +103,13 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) if (isMobile && !url.contains("sso") && !url.contains("services") && !url.contains("spmobile") && !url.contains(URLUtil.getApplicationURL() + "/chat/") && + !url.contains(URLUtil.getApplicationURL() + "/media/") && !url.contains(URLUtil.getApplicationURL() + "/visio/") && !url.contains(URLUtil.getApplicationURL() + "/util/") && (!tablet) && !url.contains("attached_file") && !url.contains("Ticket") && - !url.contains("LinkFile/Key") && redirect) { + !url.contains("LinkFile/Key") && + !url.contains("Logout") && + !url.contains("FileServer/thumbnail") && redirect) { String params = ""; if (url.contains("Publication")) { String id = url.substring(url.lastIndexOf("/") + 1); @@ -113,6 +117,16 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) String appId = pub.getInstanceId(); params = "?shortcutContentType=Publication&shortcutContentId=" + id + "&shortcutAppId=" + appId; + } else if (url.contains("/Topic/")) { + // sample : /silverpeas/Topic/6278?ComponentId=kmelia2431 + String id = url.substring(url.lastIndexOf("/")+1); + String appId = ((HttpServletRequest) req).getParameter("ComponentId"); + params = "?shortcutContentType=Folder&shortcutContentId=" + id + "&shortcutAppId=" + appId; + } else if (url.contains("Form")) { + // sample : /silverpeas/Form/1?ComponentId=formsOnline1 + String id = url.substring(url.lastIndexOf("/") + 1); + String appId = req.getParameter("ComponentId"); + params = "?shortcutContentType=Form&shortcutContentId=" + id + "&shortcutAppId=" + appId; } else if (url.contains("Media")) { String id = url.substring(url.lastIndexOf("/") + 1); Media media = getGalleryService().getMedia(new MediaPK(id)); @@ -172,6 +186,12 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) } else if (url.contains("Component")) { String appId = url.substring(url.lastIndexOf("/") + 1); params = "?shortcutContentType=Component&shortcutAppId=" + appId; + } else if (url.contains("Space")) { + String spaceId = url.substring(url.lastIndexOf("/") + 1); + params = "?shortcutContentType=Space&shortcutAppId=" + spaceId; + } else if (url.contains("/needSession")) { + String appId = url.replaceAll("/needSession",""); + params = "?shortcutContentType=Url&shortcutAppId=" + appId; } else if (!url.contains("AuthenticationServlet") && (url.endsWith("silverpeas") || url.endsWith("silverpeas/") || url.contains("/silverpeas/"))) { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/SpMobil.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/SpMobil.java index e38c969c1..f6f573eb2 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/SpMobil.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/SpMobil.java @@ -34,6 +34,7 @@ import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; @@ -72,9 +73,11 @@ import org.silverpeas.mobile.client.common.event.authentication.AuthenticationEventHandler; import org.silverpeas.mobile.client.common.mobil.MobilUtils; import org.silverpeas.mobile.client.common.mobil.Orientation; +import org.silverpeas.mobile.client.common.navigation.LinksManager; import org.silverpeas.mobile.client.common.navigation.PageHistory; import org.silverpeas.mobile.client.common.network.MethodCallbackOnlineOnly; import org.silverpeas.mobile.client.common.network.NetworkHelper; +import org.silverpeas.mobile.client.common.resources.ResourcesManager; import org.silverpeas.mobile.client.common.storage.CacheStorageHelper; import org.silverpeas.mobile.client.common.storage.LocalStorageHelper; import org.silverpeas.mobile.client.components.base.Page; @@ -117,6 +120,9 @@ public class SpMobil implements EntryPoint, AuthenticationEventHandler { private static Orientation orientation = null; private static List<App> apps = new ArrayList<App>(); + private static int nbRetryLogin = 0; + private static boolean SSO = false; + public static DetailUserDTO getUser() { return user; } @@ -138,6 +144,7 @@ public static void setUser(final DetailUserDTO user) { * Init. spmobile. */ public void onModuleLoad() { + exportNativeFunctions(); // init connexion supervision NetworkHelper.getInstance(); @@ -173,6 +180,8 @@ public void onModuleLoad() { EventBus.getInstance().addHandler(ExceptionEvent.TYPE, new ErrorManager()); EventBus.getInstance().addHandler(AbstractAuthenticationErrorEvent.TYPE, this); + SSO = !ResourcesManager.getSSOPath().isEmpty(); + loadIds(null); NodeList<Element> tags = Document.get().getElementsByTagName("meta"); @@ -258,15 +267,18 @@ public static void displayMainPage() { } getMainPage().setUser(user); RootPanel.get().clear(); + PageHistory.getInstance().clear(); RootPanel.get().add(getMainPage()); PageHistory.getInstance().goTo(new HomePage()); if ((shortcutAppId != null && shortcutContentType != null && shortcutContentId != null) || shortcutContributionId != null || - (shortcutContentType != null && shortcutContentType.equals("Component") && + (shortcutContentType != null && (shortcutContentType.equals("Component") || shortcutContentType.equals("Space")) && shortcutAppId != null)) { ShortCutRouter.route(user, shortcutAppId, shortcutContentType, shortcutContentId, - shortcutContributionId, shortcutRole); + shortcutContributionId, shortcutRole); + } else if (shortcutContentType != null && shortcutContentType.equalsIgnoreCase("Url") && shortcutAppId != null) { + LinksManager.openIframePage(shortcutAppId); } else { MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<HomePageDTO>() { @@ -308,9 +320,19 @@ public void attempt() { super.attempt(); FullUserDTO u = AuthentificationManager.getInstance().loadUser(); if (u != null) { + nbRetryLogin = 0; ServicesLocator.getServiceNavigation().getUser(u.getLogin(), u.getDomainId(), this); } else { - tryToRelogin(attempt); + String login = Cookies.getCookie("svpLogin"); + String domainId = Cookies.getCookie("defaultDomain"); + if (login != null && domainId != null && !login.isEmpty() && !domainId.isEmpty()) { + ServicesLocator.getServiceNavigation().getUser(login, domainId, this); + } else { + if (nbRetryLogin < 5) { + tryToRelogin(attempt); + nbRetryLogin++; + } + } } } @@ -320,6 +342,17 @@ public void onSuccess(final Method method, final DetailUserDTO detailUserDTO) { setUser(detailUserDTO); setUserProfile(UserProfileDTO.getBean( LocalStorageHelper.load(AuthentificationManager.USER_PROFIL, IUserProfile.class))); + if (getUserProfile() == null) { + UserProfileDTO p = new UserProfileDTO(); + p.setFullName(detailUserDTO.getFirstName() + " " + detailUserDTO.getLastName()); + p.setAvatar(detailUserDTO.getAvatar()); + p.setFirstName(detailUserDTO.getFirstName()); + p.setLastName(detailUserDTO.getLastName()); + p.setLanguage(detailUserDTO.getLanguage()); + p.setId(detailUserDTO.getId()); + p.seteMail(detailUserDTO.geteMail()); + setUserProfile(p); + } ServicesLocator.getServiceTermsOfService().show(new MethodCallback<Boolean>() { @Override @@ -345,6 +378,7 @@ public void onFailure(final Method method, final Throwable t) { tryToRelogin(attempt); } }; + action.attempt(); } else { //Login @@ -353,6 +387,10 @@ public void onFailure(final Method method, final Throwable t) { } } + public static boolean isSSO() { + return SSO; + } + private void tryToRelogin(final Command attempt) { FullUserDTO user = AuthentificationManager.getInstance().loadUser(); if (user != null) { @@ -503,4 +541,8 @@ public static Config getConfiguration() { public void onAuthenticationError(final AbstractAuthenticationErrorEvent event) { displayLoginPage(((AuthenticationException) event.getException())); } + + public static native void exportNativeFunctions()/*-{ + $wnd.navigateTo = $entry(@org.silverpeas.mobile.client.common.navigation.LinksManager::navigateToPermalink(*)); + }-*/; } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/comments/CommentsApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/comments/CommentsApp.java index 4720da6ed..2c03d528f 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/comments/CommentsApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/comments/CommentsApp.java @@ -97,7 +97,6 @@ public void addComment(final AddCommentEvent event) { dto.setComponentId(event.getInstanceId()); dto.setResourceId(event.getContentId()); dto.setResourceType(event.getContentType()); - dto.setTextForHtml(event.getMessage()); MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<CommentDTO>() { @Override diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/contacts/pages/widgets/ContactItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/contacts/pages/widgets/ContactItem.java index 2bf0d4e7b..8ad5da7b3 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/contacts/pages/widgets/ContactItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/contacts/pages/widgets/ContactItem.java @@ -39,6 +39,7 @@ import org.silverpeas.mobile.client.common.resources.ResourcesManager; import org.silverpeas.mobile.client.resources.ApplicationResources; import org.silverpeas.mobile.shared.dto.DetailUserDTO; +import org.silverpeas.mobile.shared.dto.PropertyDTO; public class ContactItem extends Composite { @@ -122,31 +123,32 @@ public void setData(DetailUserDTO userData) { nbTel++; } if (nbTel == 0) { - tel.add(new InlineHTML(" ")); + tel.setVisible(false); } - for (String prop :userData.getProperties()) { - - String value = userData.getPropertieValue(prop); - if (isPhoneNumber(value)) { - HTMLPanel field = new HTMLPanel(""); - Anchor tel = new Anchor(); - tel.setStyleName("tel-link"); - tel.setText(value); - tel.setHref("tel:" + value); - field.add(tel); - - Anchor sms = new Anchor(); - sms.setHref("sms:" + value); - Image smsImg = new Image(resourcesContact.sms()); - sms.getElement().appendChild(smsImg.getElement()); - field.add(sms); - - container.add(field); - } else { - HTML field = new HTML(value); - field.setStylePrimaryName(prop); - container.add(field); + for (PropertyDTO prop :userData.getProperties()) { + String value = prop.getValue(); + if (value != null & !value.isEmpty()) { + if (isPhoneNumber(value)) { + HTMLPanel field = new HTMLPanel(""); + Anchor tel = new Anchor(); + tel.setStyleName("tel-link"); + tel.setText(value); + tel.setHref("tel:" + value); + field.add(tel); + + Anchor sms = new Anchor(); + sms.setHref("sms:" + value); + Image smsImg = new Image(resourcesContact.sms()); + sms.getElement().appendChild(smsImg.getElement()); + field.add(sms); + + container.add(field); + } else { + HTML field = new HTML(value); + field.setStylePrimaryName(prop.getKey()); + container.add(field); + } } } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/DocumentsApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/DocumentsApp.java index d04337447..a2adc5335 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/DocumentsApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/DocumentsApp.java @@ -129,6 +129,12 @@ private void displayContent(final ContentDTO content) { setMainPage(page); page.show(); EventBus.getInstance().fireEvent(new DocumentsLoadPublicationEvent(content)); + } else if (content.getType().equals(ContentsTypes.Component.toString())) { + ApplicationInstanceDTO data = new ApplicationInstanceDTO(); + data.setId(content.getInstanceId()); + data.setType(Apps.kmelia.name()); + NavigationAppInstanceChangedEvent event = new NavigationAppInstanceChangedEvent(data); + appInstanceChanged(event); } else if (content.getType().equals(ContentsTypes.Attachment.toString())) { final DocumentsApp app = this; diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.java index be249fea6..9c72af6e0 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.java @@ -147,6 +147,16 @@ public void onLoadedPublication(PublicationLoadedEvent event) { @Override public void onLoadedPublicationAttachments(final PublicationAttachmentsLoadedEvent event) { for (SimpleDocumentDTO attachment : event.getAttachments()) { + if (!publication.getNotAllowedDownloads().isEmpty()) { + attachment.setDownloadable(true); + for (String idNotAllowed : publication.getNotAllowedDownloads()) { + if (idNotAllowed.equals(attachment.getId())) { + attachment.setDownloadable(false); + } + } + } else { + attachment.setDownloadable(true); + } Attachment a = new Attachment(); a.setAttachment(attachment); attachments.add(a); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/FavoritesApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/FavoritesApp.java index 0fd34baf3..d8b51d45e 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/FavoritesApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/FavoritesApp.java @@ -25,7 +25,6 @@ package org.silverpeas.mobile.client.apps.favorites; import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.rpc.AsyncCallback; import org.fusesource.restygwt.client.Method; import org.silverpeas.mobile.client.apps.favorites.events.app.AbstractFavoritesAppEvent; import org.silverpeas.mobile.client.apps.favorites.events.app.AddFavoriteEvent; @@ -39,7 +38,6 @@ import org.silverpeas.mobile.client.apps.navigation.events.app.external.NavigationEventHandler; import org.silverpeas.mobile.client.apps.navigation.events.app.external.NavigationShowContentEvent; import org.silverpeas.mobile.client.common.EventBus; -import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.ServicesLocator; import org.silverpeas.mobile.client.common.app.App; import org.silverpeas.mobile.client.common.event.ErrorEvent; @@ -115,7 +113,6 @@ public void attempt() { @Override public void gotoApp(final GotoAppEvent event) { - MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<ApplicationInstanceDTO>() { @Override public void attempt() { @@ -136,6 +133,7 @@ public void onSuccess(final Method method, EventBus.getInstance().fireEvent(new NavigationAppInstanceChangedEvent(applicationInstanceDTO)); } }; + action.attempt(); } @Override diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/FormsOnlineApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/FormsOnlineApp.java index 59f4bbfcf..9e2d1396e 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/FormsOnlineApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/FormsOnlineApp.java @@ -177,7 +177,7 @@ public void saveForm(final FormSaveEvent formSaveEvent) { } private static native void saveForm(FormsOnlineApp app, JavaScriptObject fd, String token, String stkn, String instanceId, String formId) /*-{ - var url = "/silverpeas/services/formsOnline/"+instanceId+"/saveForm/" + formId; + var url = "/silverpeas/services/mobile/formsOnline/"+instanceId+"/saveForm/" + formId; var xhr = new XMLHttpRequest(); xhr.open("POST", url, false); xhr.setRequestHeader("X-Silverpeas-Session", token); @@ -367,6 +367,20 @@ public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) { @Override public void showContent(final NavigationShowContentEvent event) { + if (event.getContent().getType().equals("Form")) { + ApplicationInstanceDTO appInst = new ApplicationInstanceDTO(); + appInst.setId(event.getContent().getInstanceId()); + this.setApplicationInstance(appInst); + + String id = event.getContent().getId(); + FormOnlineLoadEvent ev = new FormOnlineLoadEvent(); + FormDTO form = new FormDTO(); + form.setXmlFormName(id); + ev.setForm(form); + ev.getForm().setId(id); + loadFormOnline(ev); + } + if (event.getContent().getType().equals("Component") && event.getContent().getInstanceId().startsWith(Apps.formsOnline.name())) { ApplicationInstanceDTO appInst = new ApplicationInstanceDTO(); appInst.setId(event.getContent().getInstanceId()); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineEditPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineEditPage.java index 20227e000..3b97de5bb 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineEditPage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineEditPage.java @@ -98,6 +98,7 @@ public void onFormsOnlineLoad(final FormsOnlineLoadedEvent event) {} @Override public void onFormLoaded(final FormLoadedEvent formLoadedEvent) { data = formLoadedEvent.getFormFields(); + fields.clear(); for (FormFieldDTO f : formLoadedEvent.getFormFields()) { FieldEditable field = new FieldEditable(); field.setData(f); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlinePage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlinePage.java index 7c6f4a670..295eedcf7 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlinePage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlinePage.java @@ -112,7 +112,6 @@ public FormsOnlinePage() { msg = GWT.create(FormsOnlineMessages.class); setPageTitle(msg.title()); initWidget(uiBinder.createAndBindUi(this)); - container.getElement().getStyle().setHeight(12, Style.Unit.EM); EventBus.getInstance().addHandler(AbstractFormsOnlinePagesEvent.TYPE, this); EventBus.getInstance().fireEvent(new FormsOnlineLoadEvent()); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/hyperlink/HyperLinkApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/hyperlink/HyperLinkApp.java index be4f2a28a..d4a061a0a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/hyperlink/HyperLinkApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/hyperlink/HyperLinkApp.java @@ -25,6 +25,7 @@ package org.silverpeas.mobile.client.apps.hyperlink; import org.fusesource.restygwt.client.Method; +import org.fusesource.restygwt.client.MethodCallback; import org.fusesource.restygwt.client.TextCallback; import org.silverpeas.mobile.client.apps.navigation.events.app.external.AbstractNavigationEvent; import org.silverpeas.mobile.client.apps.navigation.events.app.external.NavigationAppInstanceChangedEvent; @@ -37,6 +38,7 @@ import org.silverpeas.mobile.client.common.event.ErrorEvent; import org.silverpeas.mobile.client.common.navigation.LinksManager; import org.silverpeas.mobile.client.common.network.NetworkHelper; +import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO; import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; import org.silverpeas.mobile.shared.dto.navigation.Apps; @@ -64,21 +66,21 @@ public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) { if (event.getInstance().getType().equals(Apps.hyperlink.name())) { this.instance = event.getInstance(); - ServicesLocator.getServiceHyperLink().getUrl(instance.getId(), new TextCallback() { + ServicesLocator.getServiceHyperLink().getUrl(instance.getId(), new MethodCallback<HyperLinkDTO>() { @Override public void onFailure(final Method method, final Throwable t) { EventBus.getInstance().fireEvent(new ErrorEvent(t)); } @Override - public void onSuccess(final Method method, final String url) { - openLink(url); + public void onSuccess(Method method, HyperLinkDTO hyperLinkDTO) { + openLink(hyperLinkDTO); } }); } } - private void openLink(String url) { + private void openLink(HyperLinkDTO url) { Notification.activityStop(); NetworkHelper.hideOfflineIndicator(); LinksManager.processLink(url); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/MediaApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/MediaApp.java index c9c280286..8b9fcc831 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/MediaApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/MediaApp.java @@ -26,7 +26,10 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Window; import org.fusesource.restygwt.client.Method; +import org.silverpeas.mobile.client.apps.documents.DocumentsApp; import org.silverpeas.mobile.client.apps.media.events.app.AbstractMediaAppEvent; import org.silverpeas.mobile.client.apps.media.events.app.MediaAppEventHandler; import org.silverpeas.mobile.client.apps.media.events.app.MediaPreviewLoadEvent; @@ -215,10 +218,30 @@ public void appInstanceChanged(NavigationAppInstanceChangedEvent event) { } } + private void loadAppInstance(final ContentDTO content) { + MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<ApplicationInstanceDTO>() { + + @Override + public void attempt() { + ServicesLocator.getServiceNavigation() + .getApp(content.getInstanceId(), content.getId(), content.getType(), this); + } + + @Override + public void onSuccess(final Method method, + final ApplicationInstanceDTO app) { + super.onSuccess(method, app); + setApplicationInstance(app); + appInstanceChanged(new NavigationAppInstanceChangedEvent(app)); + } + }; + action.attempt(); + } + @Override public void showContent(final NavigationShowContentEvent event) { if (event.getContent().getType().equals("Component") && event.getContent().getInstanceId().startsWith(Apps.gallery.name())) { - super.showContent(event); + loadAppInstance(event.getContent()); } else if (event.getContent().getType().equals(ContentsTypes.Media.name()) || event.getContent().getType().equals(ContentsTypes.Photo.name()) || event.getContent().getType().equals(ContentsTypes.Sound.name()) || diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.java index 7aa2e16f0..3486efd17 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.java @@ -103,7 +103,7 @@ public void mediaNotUploaded(int codeError) { @UiHandler("link") void upload(ClickEvent event) { - if (!NetworkHelper.isOnline()) { + if (NetworkHelper.isOnline()) { clickOnInputFile(file.getElement()); } else { Notification.alert(globalMsg.needToBeOnline()); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/NavigationApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/NavigationApp.java index 941fc22b5..b03234e0d 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/NavigationApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/NavigationApp.java @@ -26,6 +26,7 @@ import com.google.gwt.core.client.GWT; import org.fusesource.restygwt.client.Method; +import org.silverpeas.mobile.client.SpMobil; import org.silverpeas.mobile.client.apps.navigation.events.app.AbstractNavigationAppEvent; import org.silverpeas.mobile.client.apps.navigation.events.app.LoadSpacesAndAppsEvent; import org.silverpeas.mobile.client.apps.navigation.events.app.NavigationAppEventHandler; @@ -37,11 +38,14 @@ import org.silverpeas.mobile.client.apps.navigation.pages.NavigationPage; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.common.ServicesLocator; +import org.silverpeas.mobile.client.common.ShortCutRouter; import org.silverpeas.mobile.client.common.app.App; import org.silverpeas.mobile.client.common.network.MethodCallbackOnlineOnly; import org.silverpeas.mobile.client.resources.ApplicationMessages; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.HomePageDTO; +import org.silverpeas.mobile.shared.dto.navigation.HomePages; +import org.silverpeas.mobile.shared.dto.navigation.SpaceDTO; public class NavigationApp extends App implements NavigationAppEventHandler,NavigationEventHandler { @@ -100,10 +104,26 @@ public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) { @Override public void showContent(final NavigationShowContentEvent event) { - if (event.getContent().getType().equals(ContentsTypes.Space.name())) { - NavigationPage page = new NavigationPage(); - page.setRootSpaceId(event.getContent().getId()); - page.show(); - } + if (event.getContent().getType().equals(ContentsTypes.Space.name())) { + MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<SpaceDTO>() { + @Override + public void attempt() { + String id = event.getContent().getInstanceId(); + if (id == null || id.isEmpty()) id = event.getContent().getId(); + ServicesLocator.getServiceNavigation().getSpace(id, this); + } + @Override + public void onSuccess(Method method, SpaceDTO space) { + if (space.getHomePageType() == HomePages.APP.getValue()) { + ShortCutRouter.route(SpMobil.getUser(), space.getHomePageParameter(), "Component", null, null, null); + } else { + NavigationPage page = new NavigationPage(); + page.setRootSpaceId(event.getContent().getInstanceId()); + page.show(); + } + } + }; + action.attempt(); + } } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.java index 098d63234..62a5f7cd3 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.java @@ -35,6 +35,7 @@ import org.silverpeas.mobile.client.common.navigation.LinksManager; import org.silverpeas.mobile.client.resources.ApplicationMessages; import org.silverpeas.mobile.shared.dto.MyLinkDTO; +import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO; public class FavoriteItem extends Composite { @@ -68,7 +69,9 @@ public void setData(MyLinkDTO data) { @UiHandler("link") protected void onClick(ClickEvent event) { - LinksManager.processLink(data.getUrl()); + HyperLinkDTO link = new HyperLinkDTO(); + link.setUrl(data.getUrl()); + LinksManager.processLink(link); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/ShortCutItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/ShortCutItem.java index cc255de5f..4f453de39 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/ShortCutItem.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/ShortCutItem.java @@ -36,6 +36,7 @@ import org.silverpeas.mobile.client.common.navigation.LinksManager; import org.silverpeas.mobile.client.resources.ApplicationMessages; import org.silverpeas.mobile.shared.dto.ShortCutLinkDTO; +import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO; public class ShortCutItem extends Composite { @@ -71,7 +72,9 @@ public void setData(ShortCutLinkDTO data) { @UiHandler("link") protected void onClick(ClickEvent event) { - LinksManager.processLink(data.getUrl()); + HyperLinkDTO link = new HyperLinkDTO(); + link.setUrl(data.getUrl()); + LinksManager.processLink(link); } public void setCssId(String id) { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/NewsApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/NewsApp.java index bdd87828a..62a080b3f 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/NewsApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/NewsApp.java @@ -40,6 +40,7 @@ import org.silverpeas.mobile.client.common.ServicesLocator; import org.silverpeas.mobile.client.common.app.App; import org.silverpeas.mobile.client.common.network.MethodCallbackOnlineOnly; +import org.silverpeas.mobile.shared.dto.ContentDTO; import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; import org.silverpeas.mobile.shared.dto.navigation.Apps; import org.silverpeas.mobile.shared.dto.news.NewsDTO; @@ -100,10 +101,30 @@ public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) { } } + private void loadAppInstance(final ContentDTO content) { + MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<ApplicationInstanceDTO>() { + + @Override + public void attempt() { + ServicesLocator.getServiceNavigation() + .getApp(content.getInstanceId(), content.getId(), content.getType(), this); + } + + @Override + public void onSuccess(final Method method, + final ApplicationInstanceDTO app) { + super.onSuccess(method, app); + setApplicationInstance(app); + appInstanceChanged(new NavigationAppInstanceChangedEvent(app)); + } + }; + action.attempt(); + } + @Override public void showContent(final NavigationShowContentEvent event) { if (event.getContent().getType().equals("Component") && event.getContent().getInstanceId().startsWith(Apps.quickinfo.name())) { - super.showContent(event); + loadAppInstance(event.getContent()); } else { // actually manage by document app } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/NotificationsBoxApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/NotificationsBoxApp.java index 35b07176e..0f9b400a0 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/NotificationsBoxApp.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/NotificationsBoxApp.java @@ -100,7 +100,7 @@ public void onSuccess(final Method method, EventBus.getInstance() .fireEvent(new NotificationsLoadedEvent(notificationReceivedDTOS)); if (notificationReceivedDTOS.getMoreElement()) { - loadNotifications(event, nbCall); + loadNotifications(event, nbCall+1); } } }; diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/AuthentificationManager.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/AuthentificationManager.java index bba1bca91..9e46ccd19 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/AuthentificationManager.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/AuthentificationManager.java @@ -24,6 +24,7 @@ package org.silverpeas.mobile.client.common; +import com.google.gwt.core.client.GWT; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; @@ -42,6 +43,7 @@ import org.silverpeas.mobile.client.common.navigation.PageHistory; import org.silverpeas.mobile.client.common.network.MethodCallbackOnlineOnly; import org.silverpeas.mobile.client.common.network.NetworkHelper; +import org.silverpeas.mobile.client.common.resources.ResourcesManager; import org.silverpeas.mobile.client.common.storage.LocalStorageHelper; import org.silverpeas.mobile.client.pages.connexion.ConnexionPage; import org.silverpeas.mobile.shared.dto.DetailUserDTO; @@ -93,8 +95,11 @@ public void storeUser(final DetailUserDTO user, final UserProfileDTO profil, Str SpMobil.setUser(user); FullUserDTO u = new FullUserDTO(login, encryptedPassword, domainId, user); - LocalStorageHelper.store(USER_CONNECTED_KEY, u.getAutoBean()); - LocalStorageHelper.store(USER_PROFIL, profil.getAutoBean()); + String maintainSession = ResourcesManager.getParam("maintain.session"); + if (maintainSession.equalsIgnoreCase("true")) { + LocalStorageHelper.store(USER_CONNECTED_KEY, u.getAutoBean()); + LocalStorageHelper.store(USER_PROFIL, profil.getAutoBean()); + } } public void updateAvatarInCache(final String avatarData) { @@ -102,8 +107,11 @@ public void updateAvatarInCache(final String avatarData) { SpMobil.getUserProfile().setAvatar(avatarData); FullUserDTO user = FullUserDTO.getBean(LocalStorageHelper.load(USER_CONNECTED_KEY, IFullUser.class)); user.setAvatar(avatarData); - LocalStorageHelper.store(USER_CONNECTED_KEY, user.getAutoBean()); - LocalStorageHelper.store(USER_PROFIL, SpMobil.getUserProfile().getAutoBean()); + String maintainSession = ResourcesManager.getParam("maintain.session"); + if (maintainSession.equalsIgnoreCase("true")) { + LocalStorageHelper.store(USER_CONNECTED_KEY, user.getAutoBean()); + LocalStorageHelper.store(USER_PROFIL, SpMobil.getUserProfile().getAutoBean()); + } } /** @@ -256,9 +264,7 @@ public void onSuccess(final Method method, final Boolean showTermsOfServices) { @Override public void onFailure(final Method method, final Throwable t) { //super.onFailure(method, t); - Window.alert( - "Normaly never happen !!! " + t.getClass().getName() + " " + t.getMessage()); - + GWT.log("Normaly never happen !!! " + t.getClass().getName() + " " + t.getMessage()); if (t instanceof AuthenticationException) { EventBus.getInstance().fireEvent(new AuthenticationErrorEvent(t)); } else { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/LinksManager.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/LinksManager.java index 6de2ed037..b22424e9a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/LinksManager.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/LinksManager.java @@ -24,6 +24,7 @@ package org.silverpeas.mobile.client.common.navigation; +import com.google.gwt.core.client.JsArrayString; import com.google.gwt.user.client.Window; import org.silverpeas.mobile.client.SpMobil; import org.silverpeas.mobile.client.apps.contacts.events.app.ContactsFilteredLoadEvent; @@ -35,6 +36,7 @@ import org.silverpeas.mobile.client.components.IframePage; import org.silverpeas.mobile.shared.dto.ContentsTypes; import org.silverpeas.mobile.shared.dto.contact.ContactScope; +import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO; /** * @author svu @@ -43,7 +45,16 @@ public class LinksManager { private static Boolean iosShowIframe = Boolean.parseBoolean(ResourcesManager.getParam("ios.link.open.in.iframe")); - public static void processLink(String url) { + public static void navigateToPermalink(String url) { + HyperLinkDTO dto = new HyperLinkDTO(); + dto.setUrl(url); + dto.setInternalLink(true); + dto.setOpenNewWindow(false); + processLink(dto); + } + + public static void processLink(HyperLinkDTO hyperLinkDTO) { + String url = hyperLinkDTO.getUrl(); if(sameContext(url)) { String shortcutContentType = ""; String shortcutAppId = null; @@ -91,7 +102,7 @@ public static void processLink(String url) { } EventBus.getInstance().fireEvent(new ContactsFilteredLoadEvent(type, filter)); } else { - openExternalLink(url); + openExternalLink(url, hyperLinkDTO.getOpenNewWindow(), hyperLinkDTO.getInternalLink()); return; } @@ -99,7 +110,7 @@ public static void processLink(String url) { .route(SpMobil.getUser(), shortcutAppId, shortcutContentType, shortcutContentId, null, null); return; } - openExternalLink(url); + openExternalLink(url, hyperLinkDTO.getOpenNewWindow(), hyperLinkDTO.getInternalLink()); } private static boolean sameContext(String url) { @@ -113,18 +124,33 @@ private static boolean sameContext(String url) { return ((url.startsWith("/") || url.startsWith(context))); } - public static void openExternalLink(String url) { + public static void openExternalLink(String url, boolean openNewWindow, boolean internalLink) { if (MobilUtils.isIOS()) { if (iosShowIframe) { - IframePage page = new IframePage(url); - page.setPageTitle(""); - page.show(); + openIframePage(url); } else { - //Window.Location.assign(url); - Window.open(url, "_self", ""); + openExternalLinkStandard(url, openNewWindow, internalLink); } } else { - Window.open(url, "_blank", ""); + openExternalLinkStandard(url, openNewWindow, internalLink); + } + } + + public static void openIframePage(String url) { + IframePage page = new IframePage(url); + page.setPageTitle(""); + page.show(); + } + + private static void openExternalLinkStandard(String url, boolean openNewWindow, boolean internalLink) { + if (internalLink) { + openIframePage(url); + } else { + if (openNewWindow) { + Window.open(url, "_blank", ""); + } else { + Window.open(url, "_self", ""); + } } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineBackground.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineBackground.java index 1a87c3704..a6f02643a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineBackground.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineBackground.java @@ -26,12 +26,14 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Window; import org.fusesource.restygwt.client.Method; import org.fusesource.restygwt.client.MethodCallback; import org.silverpeas.mobile.client.SpMobil; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.event.ErrorEvent; +import org.silverpeas.mobile.client.common.resources.ResourcesManager; import org.silverpeas.mobile.client.resources.ApplicationMessages; /** @@ -49,12 +51,16 @@ public void attempt() { public void onFailure(final Method method, final Throwable t) { if (method.getResponse().getStatusCode() == 403 || method.getResponse().getStatusCode() == 401) { // Session expired, need to re-authent - SpMobil.getInstance().loadIds(new Command() { - @Override - public void execute() { - attempt(); - } - }); + if (SpMobil.isSSO()) { + Window.Location.assign(ResourcesManager.getSSOPath()); + } else { + SpMobil.getInstance().loadIds(new Command() { + @Override + public void execute() { + attempt(); + } + }); + } } else { if (NetworkHelper.needToGoOffine(t)) { // Lost connexion during requesting diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineOnly.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineOnly.java index c0faa2217..02dc28f59 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineOnly.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineOnly.java @@ -26,12 +26,15 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Window; import org.fusesource.restygwt.client.Method; import org.fusesource.restygwt.client.MethodCallback; import org.silverpeas.mobile.client.SpMobil; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.event.ErrorEvent; +import org.silverpeas.mobile.client.common.resources.ResourcesManager; +import org.silverpeas.mobile.client.components.Popin; import org.silverpeas.mobile.client.resources.ApplicationMessages; /** @@ -51,12 +54,18 @@ public void onFailure(final Method method, final Throwable t) { Notification.activityStop(); if (method.getResponse().getStatusCode() == 403 || method.getResponse().getStatusCode() == 401) { // Session expired, need to re-authent - SpMobil.getInstance().loadIds(new Command() { - @Override - public void execute() { - attempt(); - } - }); + if (SpMobil.isSSO()) { + Window.Location.assign(ResourcesManager.getSSOPath()); + } else { + SpMobil.getInstance().loadIds(new Command() { + @Override + public void execute() { + attempt(); + } + }); + } + } else if (method.getResponse().getStatusCode() == 404) { + new Popin(msg.notfoundError()).show(); } else { if (NetworkHelper.needToGoOffine(t)) { // Lost connexion during requesting @@ -72,6 +81,4 @@ public void execute() { public void onSuccess(final Method method, final T t) { Notification.activityStop(); } - - } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/TextCallbackOnlineOnly.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/TextCallbackOnlineOnly.java index a0c54a3f0..55164fe1d 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/TextCallbackOnlineOnly.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/TextCallbackOnlineOnly.java @@ -26,12 +26,14 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Window; import org.fusesource.restygwt.client.Method; import org.fusesource.restygwt.client.TextCallback; import org.silverpeas.mobile.client.SpMobil; import org.silverpeas.mobile.client.common.EventBus; import org.silverpeas.mobile.client.common.Notification; import org.silverpeas.mobile.client.common.event.ErrorEvent; +import org.silverpeas.mobile.client.common.resources.ResourcesManager; import org.silverpeas.mobile.client.resources.ApplicationMessages; /** @@ -56,12 +58,16 @@ public void onFailure(final Method method, final Throwable t) { Notification.activityStop(); if (method.getResponse().getStatusCode() == 403 || method.getResponse().getStatusCode() == 401) { // Session expired, need to re-authent - SpMobil.getInstance().loadIds(new Command() { - @Override - public void execute() { - attempt(); - } - }); + if (SpMobil.isSSO()) { + Window.Location.assign(ResourcesManager.getSSOPath()); + } else { + SpMobil.getInstance().loadIds(new Command() { + @Override + public void execute() { + attempt(); + } + }); + } } else { if (NetworkHelper.needToGoOffine(t)) { // Lost connexion during requesting diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/resources/ResourcesManager.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/resources/ResourcesManager.java index 154d62fdc..04f25dab2 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/resources/ResourcesManager.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/resources/ResourcesManager.java @@ -26,8 +26,10 @@ import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsonUtils; +import com.google.gwt.dom.client.Document; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONParser; +import org.silverpeas.mobile.client.apps.documents.DocumentsApp; /** * @author: svu @@ -63,6 +65,10 @@ public static String getParam(String key) { return param; } + public static String getSSOPath() { + return Document.get().getElementById("ssoPath").getAttribute("value"); + } + public static native JavaScriptObject getLabels() /*-{ return $wnd.labels; }-*/; diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/IframePage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/IframePage.java index 8acefe203..894b041e9 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/IframePage.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/IframePage.java @@ -55,6 +55,7 @@ private void init() { frame.getElement().getStyle().setTop(SpMobil.getMainPage().getHeaderHeight(), Style.Unit.PX); setViewport(); initWidget(frame); + setSize("100vw", "100vh"); EventBus.getInstance().addHandler(AbstractWindowEvent.TYPE, this); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.java index 67383d171..65ee2070f 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.java @@ -45,6 +45,7 @@ import org.silverpeas.mobile.client.common.navigation.UrlUtils; import org.silverpeas.mobile.client.common.network.NetworkHelper; import org.silverpeas.mobile.client.common.storage.CacheStorageHelper; +import org.silverpeas.mobile.client.components.IframePage; import org.silverpeas.mobile.client.resources.ApplicationMessages; import org.silverpeas.mobile.shared.dto.documents.SimpleDocumentDTO; @@ -81,9 +82,9 @@ public void setAttachment(SimpleDocumentDTO data) { private void render() { Image img = null; String sizeValue; - /*if (!data..isDownloadAllowed()) { - link.setStylePrimaryName("not-downloadable"); - }*/ + if (!data.isDownloadable()) { + link.setStylePrimaryName("not-downloadable"); + } if (data.getSize() < 1024 * 1024) { sizeValue = String.valueOf(data.getSize() / 1024); size.setInnerHTML(msg.sizeK(sizeValue)); @@ -121,43 +122,68 @@ private void render() { // link generation try { String url = UrlUtils.getAttachedFileLocation(); - url += "componentId/"; - url += data.getInstanceId(); - url += "/attachmentId/"; - url += data.getId(); - url += "/lang/"; - url += data.getLang(); - url += "/name/"; - url += data.getFileName(); - + if (data.isDownloadable()) { + url += "componentId/"; + url += data.getInstanceId(); + url += "/attachmentId/"; + url += data.getId(); + url += "/lang/"; + url += data.getLang(); + url += "/name/"; + url += data.getFileName(); + } else { + url = "#"; + } link.setHref(url); if (MobilUtils.isIOS()) { - //link.setTarget("_blank"); - link.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent clickEvent) { - String u = ((Anchor) clickEvent.getSource()).getHref(); - if (NetworkHelper.isOnline()) { - CacheStorageHelper.store(u); + if (data.isDownloadable()) { + link.addClickHandler(new ClickHandler() { + @Override + public void onClick(final ClickEvent clickEvent) { + String u = ((Anchor) clickEvent.getSource()).getHref(); + if (NetworkHelper.isOnline()) { + CacheStorageHelper.store(u); + } + Window.open(u, "_blank", "fullscreen=yes"); } - Window.open(u, "_blank", "fullscreen=yes"); - } - }); + }); + } else { + link.addClickHandler(new ClickHandler() { + @Override + public void onClick(final ClickEvent clickEvent) { + viewDocument(); + } + }); + } } else { - link.setTarget("_self"); - link.getElement().setAttribute("download", data.getFileName()); - link.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent clickEvent) { - if (NetworkHelper.isOnline()) { - CacheStorageHelper.store(((Anchor) clickEvent.getSource()).getHref()); + if (data.isDownloadable()) { + link.setTarget("_self"); + link.getElement().setAttribute("download", data.getFileName()); + link.addClickHandler(new ClickHandler() { + @Override + public void onClick(final ClickEvent clickEvent) { + if (NetworkHelper.isOnline()) { + CacheStorageHelper.store(((Anchor) clickEvent.getSource()).getHref()); + } + } + }); + } else { + link.addClickHandler(new ClickHandler() { + @Override + public void onClick(final ClickEvent clickEvent) { + viewDocument(); } - } - }); + }); + } } } catch (JavaScriptException e) { Notification.alert(e.getMessage()); } } + +private void viewDocument() { + IframePage page = new IframePage("/silverpeas/services/media/viewer/embed/pdf?documentId="+data.getId()+"&documentType=attachment&language="+data.getLang()+"&embedPlayer=true"); + page.show(); + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.java index a0d51b46f..106659320 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.java @@ -93,8 +93,13 @@ public NavigationMenu() { user.getElement().setId("user"); String url = ResourcesManager.getParam("help.url"); if (url != null && !url.isEmpty()) { + String target = ResourcesManager.getParam("help.target"); help.setHref(url); - help.setTarget("_self"); + if (target != null && !target.isEmpty()) { + help.setTarget(target); + } else { + help.setTarget("_blank"); + } } EventBus.getInstance().addHandler(AbstractPageEvent.TYPE, this); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/forms/FieldEditable.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/forms/FieldEditable.java index c0bbcb2d7..a5f9c55c8 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/forms/FieldEditable.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/forms/FieldEditable.java @@ -165,7 +165,7 @@ public void setData(FormFieldDTO data) { t.setReadOnly(data.isReadOnly()); t.addChangeHandler(this); w = t; - } else if(type.equalsIgnoreCase("text") || type.equalsIgnoreCase("simpletext")) { + } else if(type.equalsIgnoreCase("text") || type.equalsIgnoreCase("simpletext") || type.equalsIgnoreCase("map")) { TextBox t = new TextBox(); t.setText(data.getValue()); t.setReadOnly(data.isReadOnly()); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages.java index 138717225..40512753a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages.java @@ -45,7 +45,7 @@ public interface ApplicationMessages extends Messages { @DefaultMessage("Corriger") String correctBtnLabel(); - @DefaultMessage("© 2001-2020 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a> - Tous droits réservés") + @DefaultMessage("© 2001-2023 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a> - Tous droits réservés") SafeHtml copyright(); @DefaultMessage("Parcourir la plateforme") @@ -186,4 +186,7 @@ public interface ApplicationMessages extends Messages { @DefaultMessage("Envoyées") SafeHtml sended(); + @DefaultMessage("Ressource non trouvée") + String notfoundError(); + } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_en.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_en.properties index 355e02b4d..3948f3666 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_en.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_en.properties @@ -30,7 +30,7 @@ confirmBtnLabel=Confirm cancelBtnLabel=Cancel correctBtnLabel=Correct -copyright=© 2001-2016 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a> - All rights reserved +copyright=© 2001-2023 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a> - All rights reserved infoTitle=Information ok=OK @@ -80,4 +80,6 @@ showPwd=Show password hidePwd=Hide password received=Received -sended=Sended \ No newline at end of file +sended=Sended + +notfoundError=Ressource not found \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_fr.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_fr.properties index a7b654cf2..2b050fc99 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_fr.properties +++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_fr.properties @@ -29,7 +29,7 @@ confirmBtnLabel=Confirmer cancelBtnLabel=Annuler correctBtnLabel=Corriger -copyright=© 2001-2016 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a> - Tous droits réservés +copyright=© 2001-2023 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a> - Tous droits réservés infoTitle=Information ok=OK @@ -83,4 +83,6 @@ showPwd=Afficher le mot de passe hidePwd=Masquer le mot de passe received=Reçues -sended=Envoyées \ No newline at end of file +sended=Envoyées + +notfoundError=Ressource non trouv�e \ No newline at end of file diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/UserNotificationServerEventMobileListener.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/UserNotificationServerEventMobileListener.java index 4d4ff5c4c..5dc7d34e7 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/UserNotificationServerEventMobileListener.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/UserNotificationServerEventMobileListener.java @@ -25,8 +25,11 @@ package org.silverpeas.mobile.server; import com.fasterxml.jackson.databind.ObjectMapper; +import org.jsoup.Jsoup; import org.silverpeas.core.notification.sse.CDIServerEventListener; import org.silverpeas.core.notification.user.UserNotificationServerEvent; +import org.silverpeas.core.notification.user.server.channel.silvermail.SILVERMAILMessage; +import org.silverpeas.core.notification.user.server.channel.silvermail.SILVERMAILPersistence; import org.silverpeas.core.util.logging.SilverLogger; import org.silverpeas.mobile.server.services.helpers.NotificationsPushHelper; @@ -48,7 +51,11 @@ public void on(final UserNotificationServerEvent event) { String json = event.getData("", null); Map<String, Object> data = mapper.readValue(json, Map.class); Boolean isCreation = (Boolean) data.get("isCreation"); + String id = (String) data.get("id"); if (Boolean.TRUE.equals(isCreation)) { + SILVERMAILMessage msg = SILVERMAILPersistence.getMessage(event.getEmitterUserId(), Long.valueOf(id)); + data.put("body", Jsoup.parse(msg.getBody()).wholeText()); + data.put("notificationId", (String) id); NotificationsPushHelper.getInstance().sendNotification(emitterUserId, data); } } catch(Exception e) { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/AbstractRestWebService.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/AbstractRestWebService.java index 0c3940eb8..fb02aa517 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/AbstractRestWebService.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/AbstractRestWebService.java @@ -4,10 +4,15 @@ import org.silverpeas.core.security.authentication.AuthenticationCredential; import org.silverpeas.core.security.authentication.AuthenticationService; import org.silverpeas.core.security.authentication.AuthenticationServiceProvider; +import org.silverpeas.core.security.session.SessionInfo; +import org.silverpeas.core.security.session.SessionManagement; +import org.silverpeas.core.security.session.SessionManagementProvider; import org.silverpeas.core.util.ResourceLocator; import org.silverpeas.core.util.SettingBundle; +import org.silverpeas.core.util.logging.SilverLogger; import org.silverpeas.core.web.mvc.controller.MainSessionController; import org.silverpeas.core.web.rs.RESTWebService; +import org.silverpeas.core.web.util.viewgenerator.html.GraphicElementFactory; import org.silverpeas.mobile.server.common.CommandCreateList; import org.silverpeas.mobile.shared.StreamingList; import org.silverpeas.mobile.shared.dto.BaseDTO; @@ -43,6 +48,33 @@ protected void setMainsessioncontroller(String login, String password, String do new MainSessionController(key, getHttpRequest().getSession()); } + protected void initSilverpeasSession(HttpServletRequest request) { + MainSessionController controller = (MainSessionController) request.getSession() + .getAttribute(MainSessionController.MAIN_SESSION_CONTROLLER_ATT); + if (controller == null) { + SessionManagement sessionManagement = SessionManagementProvider.getSessionManagement(); + SessionInfo sessionInfo = sessionManagement.validateSession(request.getSession().getId()); + if (sessionInfo.getSessionId() == null) { + sessionInfo = sessionManagement.openSession(getUser(), request); + } + + try { + controller = new MainSessionController(sessionInfo, request.getSession()); + } catch (SilverpeasException e) { + SilverLogger.getLogger(this).error(e); + } + request.getSession() + .setAttribute(MainSessionController.MAIN_SESSION_CONTROLLER_ATT, controller); + } + + GraphicElementFactory gef = (GraphicElementFactory) request.getSession() + .getAttribute(GraphicElementFactory.GE_FACTORY_SESSION_ATT); + if (gef == null && controller != null) { + gef = new GraphicElementFactory(controller); + request.getSession().setAttribute(GraphicElementFactory.GE_FACTORY_SESSION_ATT, gef); + } + } + protected StreamingList createStreamingList(CommandCreateList command, int callNumber, int callSize, String cacheKey) throws Exception { List list; if (callNumber == 0) { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceConnection.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceConnection.java index 4f03332f3..50b931f58 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceConnection.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceConnection.java @@ -40,8 +40,14 @@ import org.silverpeas.core.security.authentication.exception.AuthenticationPwdNotAvailException; import org.silverpeas.core.security.authentication.exception.AuthenticationUserAccountBlockedException; import org.silverpeas.core.security.authentication.exception.AuthenticationUserAccountDeactivatedException; +import org.silverpeas.core.security.session.SessionInfo; +import org.silverpeas.core.security.session.SessionManagement; +import org.silverpeas.core.security.session.SessionManagementProvider; +import org.silverpeas.core.util.logging.SilverLogger; import org.silverpeas.core.web.chat.listeners.ChatUserAuthenticationListener; +import org.silverpeas.core.web.mvc.controller.MainSessionController; import org.silverpeas.core.web.rs.UserPrivilegeValidation; +import org.silverpeas.core.web.util.viewgenerator.html.GraphicElementFactory; import org.silverpeas.mobile.server.helpers.DataURLHelper; import org.silverpeas.mobile.server.services.helpers.UserHelper; import org.silverpeas.mobile.shared.dto.DetailUserDTO; @@ -137,6 +143,8 @@ public DetailUserDTO login(List<String> ids) { throw new WebApplicationException(AuthenticationError.CanCreateMainSessionController.name()); } + initSilverpeasSession(); + DetailUserDTO userDTO = new DetailUserDTO(); userDTO = UserHelper.getInstance().populate(user); @@ -154,6 +162,33 @@ public DetailUserDTO login(List<String> ids) { return userDTO; } + private void initSilverpeasSession() { + MainSessionController controller = (MainSessionController) request.getSession() + .getAttribute(MainSessionController.MAIN_SESSION_CONTROLLER_ATT); + if (controller == null) { + SessionManagement sessionManagement = SessionManagementProvider.getSessionManagement(); + SessionInfo sessionInfo = sessionManagement.validateSession(request.getSession().getId()); + if (sessionInfo.getSessionId() == null) { + sessionInfo = sessionManagement.openSession(getUser(), request); + } + + try { + controller = new MainSessionController(sessionInfo, request.getSession()); + } catch (SilverpeasException e) { + SilverLogger.getLogger(this).error(e); + } + request.getSession() + .setAttribute(MainSessionController.MAIN_SESSION_CONTROLLER_ATT, controller); + } + + GraphicElementFactory gef = (GraphicElementFactory) request.getSession() + .getAttribute(GraphicElementFactory.GE_FACTORY_SESSION_ATT); + if (gef == null && controller != null) { + gef = new GraphicElementFactory(controller); + request.getSession().setAttribute(GraphicElementFactory.GE_FACTORY_SESSION_ATT, gef); + } + } + @GET @Produces(MediaType.APPLICATION_JSON) @Path("userExist/{login}/{domainId}") diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceContact.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceContact.java index f833cff1d..c30596ee0 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceContact.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceContact.java @@ -132,7 +132,8 @@ public List<DetailUserDTO> getContacts(@PathParam("type") String type, List tabUserDetail = getUsersByQuery(filter, "UserFull"); for (int i = 0; i < tabUserDetail.size(); i++) { if (i >= startIndex && i < startIndex + pageSize) { - listUsers.add(populate(tabUserDetail.get(i))); + DetailUserDTO dto = populate(tabUserDetail.get(i)); + if (dto != null) listUsers.add(dto); } } } else if (type.equals(ContactFilters.ALL_EXT)) { @@ -320,19 +321,20 @@ private DetailUserDTO populate(Object user) { SilverLogger.getLogger(this).debug(SpMobileLogModule.getName(), "ServiceContact.populate", "User id=" + userDetail.getId()); UserFull userFull = UserFull.getById(userDetail.getId()); - DetailUserDTO dto = new DetailUserDTO(); - dto.setId(userFull.getId()); - dto.setFirstName(userFull.getFirstName()); - dto.setLastName(userFull.getLastName()); - dto.seteMail(userFull.geteMail()); - dto.setStatus(userFull.getStatus()); - dto.setAvatar(userFull.getAvatar()); - dto.setLanguage(userFull.getUserPreferences().getLanguage()); - dto.setConnected(userFull.isConnected()); - String avatar = DataURLHelper.convertAvatarToUrlData(userDetail.getAvatarFileName(), - getSettings().getString("avatar.size", "24x")); - dto.setAvatar(avatar); + DetailUserDTO dto = null; if (userFull != null) { + dto = new DetailUserDTO(); + dto.setId(userFull.getId()); + dto.setFirstName(userFull.getFirstName()); + dto.setLastName(userFull.getLastName()); + dto.seteMail(userFull.geteMail()); + dto.setStatus(userFull.getStatus()); + dto.setAvatar(userFull.getAvatar()); + dto.setLanguage(userFull.getUserPreferences().getLanguage()); + dto.setConnected(userFull.isConnected()); + String avatar = DataURLHelper.convertAvatarToUrlData(userDetail.getAvatarFileName(), + getSettings().getString("avatar.size", "24x")); + dto.setAvatar(avatar); for (String prop : getUserProperties()) { dto.addProperty(prop, userFull.getValue(prop)); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceDocuments.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceDocuments.java index 5ba98fe69..8ac52841f 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceDocuments.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceDocuments.java @@ -40,6 +40,7 @@ import org.silverpeas.core.contribution.attachment.AttachmentServiceProvider; import org.silverpeas.core.contribution.attachment.model.SimpleDocument; import org.silverpeas.core.contribution.attachment.model.SimpleDocumentPK; +import org.silverpeas.core.contribution.attachment.util.SimpleDocumentList; import org.silverpeas.core.contribution.publication.model.CompletePublication; import org.silverpeas.core.contribution.publication.model.PublicationDetail; import org.silverpeas.core.contribution.publication.model.PublicationLink; @@ -444,6 +445,18 @@ public PublicationDTO getPublication(@PathParam("id") String id, } catch (Exception e) { SilverLogger.getLogger(this).warn("Unable to get views number", e); } + + // List all attachements not downloadable for readers + ResourceReference foreignKey = new ResourceReference(id, componentId); + SimpleDocumentList<SimpleDocument> attachements = AttachmentServiceProvider.getAttachmentService().listAllDocumentsByForeignKey(foreignKey, null); + ArrayList<String> notAllowedDownloads = new ArrayList<>(); + for (SimpleDocument attachement : attachements) { + if (!attachement.isDownloadAllowedForReaders() && !attachement.canBeModifiedBy(getUser())) { + notAllowedDownloads.add(attachement.getId()); + } + } + dto.setNotAllowedDownloads(notAllowedDownloads); + } else if (type.equals(ContentsTypes.News.toString())) { dto.setViewsNumber(QuickInfoService.get().getNews(contributionId).getNbAccess()); } else { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceFormsOnline.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceFormsOnline.java index 162fcd486..cd3bc7022 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceFormsOnline.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceFormsOnline.java @@ -25,6 +25,7 @@ package org.silverpeas.mobile.server.services; import org.apache.commons.fileupload.FileItem; +import org.apache.commons.lang3.math.NumberUtils; import org.silverpeas.components.formsonline.FormsOnlineComponentSettings; import org.silverpeas.components.formsonline.model.FormDetail; import org.silverpeas.components.formsonline.model.FormInstance; @@ -47,6 +48,7 @@ import org.silverpeas.core.contribution.content.form.Form; import org.silverpeas.core.contribution.content.form.FormException; import org.silverpeas.core.contribution.content.form.RecordSet; +import org.silverpeas.core.contribution.content.form.form.HtmlForm; import org.silverpeas.core.contribution.content.form.form.XmlForm; import org.silverpeas.core.contribution.content.form.record.GenericFieldTemplate; import org.silverpeas.core.contribution.template.publication.PublicationTemplate; @@ -247,16 +249,30 @@ private FormRequestDTO populate(final FormInstance f) dto.setStateLabel(formsOnlineBundle.getString("formsOnline.stateUnread")); break; } - XmlForm formXml = ((XmlForm) f.getFormWithData()); - if (formXml != null) { - DataRecord record = formXml.getData(); - List<FormFieldDTO> dataForm = new ArrayList<>(); - for (String name : record.getFieldNames()) { - Field field = record.getField(name); - FormFieldDTO fieldDTO = populateField(f, field); - dataForm.add(fieldDTO); + if (f.getFormWithData() instanceof XmlForm) { + XmlForm formXml = ((XmlForm) f.getFormWithData()); + if (formXml != null) { + DataRecord record = formXml.getData(); + List<FormFieldDTO> dataForm = new ArrayList<>(); + for (String name : record.getFieldNames()) { + Field field = record.getField(name); + FormFieldDTO fieldDTO = populateField(f, field); + dataForm.add(fieldDTO); + } + dto.setData(dataForm); + } + } else { + HtmlForm formHTML = ((HtmlForm) f.getFormWithData()); + if (formHTML != null) { + DataRecord record = formHTML.getData(); + List<FormFieldDTO> dataForm = new ArrayList<>(); + for (String name : record.getFieldNames()) { + Field field = record.getField(name); + FormFieldDTO fieldDTO = populateField(f, field); + dataForm.add(fieldDTO); + } + dto.setData(dataForm); } - dto.setData(dataForm); } return dto; } @@ -281,8 +297,10 @@ private FormFieldDTO populateField(final FormInstance f, final Field field) { fieldDTO.setValueId(field.getValue()); } else { int index = Arrays.asList(keys).indexOf(field.getValue()); - fieldDTO.setValue(values[index]); - fieldDTO.setValueId(field.getValue()); + if (index != -1) { + fieldDTO.setValue(values[index]); + fieldDTO.setValueId(field.getValue()); + } } } else { @@ -352,6 +370,12 @@ public List<FormFieldDTO> getForm(@PathParam("formName") String formName) { List<FormFieldDTO> fields = new ArrayList<>(); try { + if (NumberUtils.isDigits(formName)) { + FormPK pk = new FormPK(formName, componentId); + FormDetail fd = FormsOnlineService.get().loadForm(pk); + formName = fd.getXmlFormName(); + } + PublicationTemplate template = getPublicationTemplate(formName, true); Form formUpdate = getEmptyForm(template); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceHyperLink.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceHyperLink.java index 7e2ee9400..186e7f6e5 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceHyperLink.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceHyperLink.java @@ -29,6 +29,7 @@ import org.silverpeas.core.admin.service.Administration; import org.silverpeas.core.annotation.WebService; import org.silverpeas.core.web.rs.annotation.Authorized; +import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -47,23 +48,27 @@ public class ServiceHyperLink extends AbstractRestWebService { @Context HttpServletRequest request; - @PathParam("mobile/appId") + @PathParam("appId") private String componentId; - static final String PATH = "hyperlink"; + static final String PATH = "mobile/hyperlink"; @GET - @Produces(MediaType.TEXT_PLAIN) + @Produces(MediaType.APPLICATION_JSON) @Path("/") - public String getUrl() { - String url = ""; + public HyperLinkDTO getUrl() { + HyperLinkDTO dto = new HyperLinkDTO(); try { ComponentInstLight app = Administration.get().getComponentInstLight(componentId); - url = app.getParameterValue("URL"); + dto.setUrl(app.getParameterValue("URL")); + String v = app.getParameterValue("openNewWindow"); + dto.setOpenNewWindow(v.equalsIgnoreCase("yes")); + v = app.getParameterValue("isInternalLink"); + dto.setInternalLink(v.equalsIgnoreCase("yes")); } catch (AdminException e) { throw new WebApplicationException(e); } - return url; + return dto; } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceMedia.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceMedia.java index 9242b31cc..c8d846b16 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceMedia.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceMedia.java @@ -400,7 +400,7 @@ public VideoStreamingDTO getVideoStreaming(@PathParam("appId") String instanceId */ @GET @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON) - @Path("videostream/{pictureId}") + @Path("photo/{pictureId}") public PhotoDTO getPreviewPicture(@PathParam("appId") String instanceId, @PathParam("pictureId") String pictureId) { PhotoDTO picture = null; diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNavigation.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNavigation.java index 7f05dc493..7f0a958b0 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNavigation.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNavigation.java @@ -25,14 +25,10 @@ package org.silverpeas.mobile.server.services; import org.apache.commons.lang3.EnumUtils; -import org.jsoup.Connection; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; import org.silverpeas.components.gallery.model.Media; import org.silverpeas.components.gallery.model.MediaPK; import org.silverpeas.components.gallery.service.MediaServiceProvider; import org.silverpeas.components.quickinfo.model.News; -import org.silverpeas.core.SilverpeasException; import org.silverpeas.core.admin.component.model.ComponentInst; import org.silverpeas.core.admin.component.model.ComponentInstLight; import org.silverpeas.core.admin.service.AdminException; @@ -47,15 +43,11 @@ import org.silverpeas.core.contribution.publication.model.PublicationPK; import org.silverpeas.core.contribution.publication.service.PublicationService; import org.silverpeas.core.mylinks.model.LinkDetail; -import org.silverpeas.core.security.session.SessionInfo; -import org.silverpeas.core.security.session.SessionManagement; -import org.silverpeas.core.security.session.SessionManagementProvider; import org.silverpeas.core.security.token.synchronizer.SynchronizerToken; import org.silverpeas.core.util.SettingBundle; import org.silverpeas.core.util.StringUtil; import org.silverpeas.core.util.logging.SilverLogger; import org.silverpeas.core.web.look.PublicationHelper; -import org.silverpeas.core.web.mvc.controller.MainSessionController; import org.silverpeas.core.web.rs.UserPrivilegeValidation; import org.silverpeas.core.web.rs.annotation.Authorized; import org.silverpeas.core.web.util.viewgenerator.html.GraphicElementFactory; @@ -66,31 +58,15 @@ import org.silverpeas.mobile.server.services.helpers.UserHelper; import org.silverpeas.mobile.server.services.helpers.events.EventsHelper; import org.silverpeas.mobile.server.services.helpers.events.NextEvents; -import org.silverpeas.mobile.shared.dto.ContentsTypes; -import org.silverpeas.mobile.shared.dto.DetailUserDTO; -import org.silverpeas.mobile.shared.dto.HomePageDTO; -import org.silverpeas.mobile.shared.dto.RightDTO; -import org.silverpeas.mobile.shared.dto.ShortCutLinkDTO; +import org.silverpeas.mobile.shared.dto.*; import org.silverpeas.mobile.shared.dto.almanach.CalendarEventDTO; import org.silverpeas.mobile.shared.dto.documents.PublicationDTO; -import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; -import org.silverpeas.mobile.shared.dto.navigation.Apps; -import org.silverpeas.mobile.shared.dto.navigation.HomePages; -import org.silverpeas.mobile.shared.dto.navigation.SilverpeasObjectDTO; -import org.silverpeas.mobile.shared.dto.navigation.SpaceDTO; +import org.silverpeas.mobile.shared.dto.navigation.*; import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; +import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; -import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -199,34 +175,6 @@ private DetailUserDTO initSession(DetailUserDTO user) { return null; } } - - private void initSilverpeasSession() { - MainSessionController controller = (MainSessionController) request.getSession() - .getAttribute(MainSessionController.MAIN_SESSION_CONTROLLER_ATT); - if (controller == null) { - SessionManagement sessionManagement = SessionManagementProvider.getSessionManagement(); - SessionInfo sessionInfo = sessionManagement.validateSession(request.getSession().getId()); - if (sessionInfo.getSessionId() == null) { - sessionInfo = sessionManagement.openSession(getUser(), request); - } - - try { - controller = new MainSessionController(sessionInfo, request.getSession()); - } catch (SilverpeasException e) { - SilverLogger.getLogger(this).error(e); - } - request.getSession() - .setAttribute(MainSessionController.MAIN_SESSION_CONTROLLER_ATT, controller); - } - - GraphicElementFactory gef = (GraphicElementFactory) request.getSession() - .getAttribute(GraphicElementFactory.GE_FACTORY_SESSION_ATT); - if (gef == null && controller != null) { - gef = new GraphicElementFactory(controller); - request.getSession().setAttribute(GraphicElementFactory.GE_FACTORY_SESSION_ATT, gef); - } - } - protected void setUserInSession(UserDetail user) { request.getSession().setAttribute(AbstractAuthenticateService.USER_ATTRIBUT_NAME, user); } @@ -241,7 +189,8 @@ protected UserDetail getUserInSession() { public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) { if (spaceId.equals("null")) spaceId = null; - initSilverpeasSession(); + initSilverpeasSession(request); + request.getSession().setAttribute("Silverpeas_Portlet_SpaceId", spaceId); String look = ""; try { @@ -280,14 +229,14 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) { if (spaceId == null) { maxNews = settings.getInteger("home.news.size", 3); } else { - maxNews = settings.getInteger("home.news.size", 3); - } - List<News> lastNews = NewsHelper.getInstance().getLastNews(getUser().getId(), spaceId); - if (lastNews != null && lastNews.size() > maxNews) { - lastNews = lastNews.subList(0, maxNews); + maxNews = settings.getInteger("space.homepage.news.nb", 3); } - data.setNews(NewsHelper.getInstance().populate(lastNews, false)); + if ((spaceId == null && getSettings().getBoolean("homepage.lastnews", true)) || + (spaceId != null && getSettings().getBoolean("spacehomepage.lastnews", true))) { + List<News> lastNews = NewsHelper.getInstance().getLastNews(getUser().getId(), spaceId, maxNews); + data.setNews(NewsHelper.getInstance().populate(lastNews, false)); + } if (spaceId == null || spaceId.isEmpty()) { List<LinkDetail> links = @@ -407,12 +356,13 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) { } } else if (spaceId != null) { SpaceInst space = Administration.get().getSpaceInstById(spaceId); - if (space.getFirstPageType() == HomePages.URL.getValue()) { + if (space.getFirstPageType() == HomePages.URL.getValue() && + getSettings().getBoolean("spacehomepage.displayUrlType")) { + String url = space.getFirstPageExtraParam(); + if (url.startsWith("/") && !url.startsWith("/silverpeas") && !url.startsWith("$")) url = "/silverpeas" + url; String html = - "<iframe frameborder='0' onLoad='javaScript:this.height = this.contentWindow" + - ".document.body" + - ".scrollHeight ;' style='width:100%;' src='" + space.getFirstPageExtraParam() + - "'></iframe>"; + "<iframe frameborder='0' style='width:100vw;height:100vh' src='" + url + + "'></iframe>"; data.setHtmlFreeZone(html); } } @@ -514,6 +464,22 @@ public Boolean isWorkflowApp(@PathParam("instanceId") String intanceId) { } } + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("space/{spaceId}/") + public SpaceDTO getSpace(@PathParam("spaceId") String spaceId) { + try { + SpaceInst space = Administration.get().getSpaceInstById(spaceId); + SpaceDTO dto = new SpaceDTO(); + dto.setHomePageType(space.getFirstPageType()); + dto.setHomePageParameter(space.getFirstPageExtraParam()); + return dto; + } catch (AdminException e) { + SilverLogger.getLogger(this).error(e); + throw new WebApplicationException(e); + } + } + //TODO : remove appType @GET @Produces(MediaType.APPLICATION_JSON) @@ -523,7 +489,7 @@ public List<SilverpeasObjectDTO> getSpacesAndApps(@PathParam("rootSpaceId") Stri if (rootSpaceId !=null && rootSpaceId.equals("null")) rootSpaceId = null; try { if (rootSpaceId == null) { - String[] spaceIds = Administration.get().getAllSpaceIds(getUser().getId()); + String[] spaceIds = Administration.get().getAllRootSpaceIds(getUser().getId()); for (String spaceId : spaceIds) { SpaceInst space = Administration.get().getSpaceInstById(spaceId); if (!space.isRemoved()) { @@ -580,18 +546,22 @@ public ApplicationInstanceDTO getApp(@PathParam("instanceId") String instanceId, if (instanceId == null) { if (contentType.equals(ContentsTypes.Publication.name())) { PublicationDetail pub = PublicationService.get().getDetail(new PublicationPK(contentId)); + if (pub == null) throw new NotFoundException(); instanceId = pub.getInstanceId(); } else if (contentType.equals(ContentsTypes.Media.name())) { Media media = MediaServiceProvider.getMediaService().getMedia(new MediaPK(contentId)); + if (media == null) throw new NotFoundException(); instanceId = media.getInstanceId(); } else if (contentType.equals(ContentsTypes.Event.name())) { ContributionIdentifier contributionId = ContributionIdentifier.decode(new String(StringUtil.fromBase64(contentId))); localId = contributionId.getLocalId(); instanceId = contributionId.getComponentInstanceId(); + if (instanceId.equals("?")) throw new NotFoundException(); } } ApplicationInstanceDTO dto = getApplicationInstanceDTO(instanceId); + if (dto == null) throw new NotFoundException(); dto.setExtraId(localId); return dto; } @@ -621,7 +591,6 @@ private boolean containApp(SpaceInst space) throws Exception { private String[] getUserRoles(String componentId, String userId) { return organizationController.getUserProfiles(userId, componentId); } - private SpaceDTO populate(SpaceInst space) { SpaceDTO dto = new SpaceDTO(); dto.setId(space.getId()); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNotifications.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNotifications.java index fb1d8114a..a9e3d7dd4 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNotifications.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNotifications.java @@ -355,7 +355,7 @@ public void delete(List<NotificationBoxDTO> selection) { if (selection.get(0) instanceof NotificationSendedDTO) { for (NotificationBoxDTO dto : selection) { try { - SentNotificationInterface.get().deleteNotif((int) dto.getIdNotif(), getUser().getId()); + SentNotificationInterface.get().deleteNotif(String.valueOf(dto.getIdNotif()), Integer.parseInt(getUser().getId())); } catch (NotificationException e) { SilverLogger.getLogger(this).error(e); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NewsHelper.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NewsHelper.java index 988e1f1b6..1d656df19 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NewsHelper.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NewsHelper.java @@ -36,18 +36,13 @@ import org.silverpeas.core.admin.service.AdminException; import org.silverpeas.core.admin.service.Administration; import org.silverpeas.core.admin.service.OrganizationController; +import org.silverpeas.core.admin.user.model.UserDetail; import org.silverpeas.core.contribution.publication.model.PublicationDetail; -import org.silverpeas.core.contribution.publication.service.PublicationService; import org.silverpeas.core.io.file.ImageResizingProcessor; import org.silverpeas.core.io.file.SilverpeasFileProcessor; -import org.silverpeas.core.util.CollectionUtil; -import org.silverpeas.core.util.ResourceLocator; -import org.silverpeas.core.util.ServiceProvider; -import org.silverpeas.core.util.SettingBundle; -import org.silverpeas.core.util.StringUtil; +import org.silverpeas.core.util.*; import org.silverpeas.core.util.file.FileRepositoryManager; import org.silverpeas.core.util.logging.SilverLogger; -import org.silverpeas.core.web.look.PublicationUpdateDateComparator; import org.silverpeas.core.web.util.viewgenerator.html.GraphicElementFactory; import org.silverpeas.mobile.shared.dto.news.NewsDTO; @@ -55,12 +50,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.MissingResourceException; +import java.util.*; /** * @author: svu @@ -80,8 +70,8 @@ public static NewsHelper getInstance() { return instance; } - public List<News> getLastNews(String userId, String spaceId) throws Exception { - if(spaceId != null) { + public List<News> getLastNews(String userId, String spaceId, int maxNews) throws Exception { + if (spaceId != null) { List<String> appIds = new ArrayList<String>(); String[] cIds = organizationController.getAvailCompoIds(spaceId, userId); for (String id : cIds) { @@ -94,7 +84,7 @@ public List<News> getLastNews(String userId, String spaceId) throws Exception { for (String appId : appIds) { news.addAll(service.getVisibleNews(appId)); } - Collections.sort(news, (o1, o2) -> o1.getUpdateDate().compareTo(o2.getUpdateDate())); + news = sortAndTruncate(maxNews, news); return news; } else { // News on main page @@ -106,15 +96,15 @@ public List<News> getLastNews(String userId, String spaceId) throws Exception { } catch (MissingResourceException e) {} if (newsSource != null && newsSource.isEmpty() == false) { if (newsSource.trim().startsWith("quickinfo")) { - news = getNewsByComponentId(newsSource, false, userId); + news = getNewsByComponentId(newsSource, false, userId, maxNews); + news = sortAndTruncate(maxNews, news); } else if (newsSource.trim().equals("*")) { - news = getAllNews(userId); + news = getAllNews(userId, maxNews); + news = sortAndTruncate(maxNews, news); } else { - news = getDelegatedNews(userId); + news = getDelegatedNews(userId, maxNews); } } - Collections.sort(news, (o1, o2) -> o1.getUpdateDate().compareTo(o2.getUpdateDate())); - Collections.reverse(news); return news; } } @@ -123,21 +113,39 @@ private boolean isVisibleNews(PublicationDetail news) { return news.isValid() && news.isVisible(); } - private List<News> getDelegatedNews(String userId) throws Exception { + private List<News> getDelegatedNews(String userId, int maxNews) throws Exception { List<News> news = new ArrayList(); List<DelegatedNews> delegatedNews = DelegatedNewsServiceProvider.getDelegatedNewsService().getAllValidDelegatedNews(); - + UserDetail u = Administration.get().getUserDetail(userId); + Date now = new Date(); + int count = 0; for (DelegatedNews delegated : delegatedNews) { - PublicationDetail pub = delegated.getPublicationDetail(); - if (pub.canBeAccessedBy(Administration.get().getUserDetail(userId))) { - News aNews = QuickInfoService.get().getNewsByForeignId(delegated.getPubId()); + if (count >= maxNews) break; + News aNews = null; + if (delegated.getBeginDate() == null && delegated.getEndDate() == null) { + aNews = getNews(delegated, u); + } else if (delegated.getBeginDate() != null && now.after(delegated.getBeginDate()) + && delegated.getEndDate() != null && now.before(delegated.getEndDate())) { + aNews = getNews(delegated, u); + } else if (delegated.getBeginDate() != null && now.after(delegated.getBeginDate()) && delegated.getEndDate() == null) { + aNews = getNews(delegated, u); + } else if (delegated.getEndDate() != null && now.before(delegated.getEndDate())) { + aNews = getNews(delegated, u); + } + if (aNews != null) { news.add(aNews); + count++; } } - return news; } + private News getNews(DelegatedNews delegated, UserDetail u) { + News aNews = QuickInfoService.get().getNewsByForeignId(delegated.getPubId()); + if (!aNews.canBeAccessedBy(u)) aNews = null; + return aNews; + } + public List<News> getNewsByAppId(String appId, boolean managerAccess) { QuickInfoService service = QuickInfoServiceProvider.getQuickInfoService(); List<News> news; @@ -150,19 +158,19 @@ public List<News> getNewsByAppId(String appId, boolean managerAccess) { return news; } - private List<News> getAllNews(String userId) throws AdminException { + private List<News> getAllNews(String userId, int maxNews) throws AdminException { List<News> news = new ArrayList<>(); List<String> apps = CollectionUtil .asList(organizationController.getComponentIdsForUser(userId, "quickinfo")); for (String appId : apps) { - news.addAll(getNewsByComponentId(appId, false, userId)); + news.addAll(getNewsByComponentId(appId, false, userId, maxNews)); } - //TODO sort list + news = sortAndTruncate(maxNews, news); return news; } - private List<News> getNewsByComponentId(String appId, boolean managerAccess, String userId) throws AdminException { + private List<News> getNewsByComponentId(String appId, boolean managerAccess, String userId, int maxNews) throws AdminException { QuickInfoService service = QuickInfoServiceProvider.getQuickInfoService(); List<News> news = new ArrayList<>(); @@ -173,6 +181,17 @@ private List<News> getNewsByComponentId(String appId, boolean managerAccess, Str news = service.getVisibleNews(appId); } } + news = sortAndTruncate(maxNews, news); + + return news; + } + + private static List<News> sortAndTruncate(int maxNews, List<News> news) { + Collections.sort(news, (o1, o2) -> o1.getUpdateDate().compareTo(o2.getUpdateDate())); + //Collections.reverse(news); + if (news != null && news.size() > maxNews) { + news = news.subList(0, maxNews); + } return news; } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NotificationsPushHelper.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NotificationsPushHelper.java index 8eb22cfec..5a6128e46 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NotificationsPushHelper.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NotificationsPushHelper.java @@ -130,11 +130,13 @@ public String sendToToken(final String userId, String token, Map<String, Object> // This registration token comes from the client FCM SDKs. // See documentation on defining a message payload. - response = getNotificationPermalink(String.valueOf(notifData.get("id"))) + response = getNotificationPermalink(userId, String.valueOf(notifData.get("id"))) // No push if no permalink .map(l -> Message.builder() .putData("subject", String.valueOf(notifData.get("subject"))) .putData("sender", String.valueOf(notifData.get("sender"))) + .putData("body", String.valueOf(notifData.get("body"))) + .putData("notificationId", String.valueOf(notifData.get("notificationId"))) .putData("permalink", l)) .map(m -> m.setToken(token)) .map(Message.Builder::build) @@ -156,10 +158,8 @@ public String sendToToken(final String userId, String token, Map<String, Object> return response; } - private Optional<String> getNotificationPermalink(String id) { - return ofNullable(id) - .map(Long::decode) - .map(SILVERMAILPersistence::getMessage) - .map(SILVERMAILMessage::getUrl); + private Optional<String> getNotificationPermalink(String userId, String id) { + SILVERMAILMessage m = SILVERMAILPersistence.getMessage(userId, Long.valueOf(id)); + return ofNullable(m.getUrl()); } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/PublicationContentServlet.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/PublicationContentServlet.java index 679c872d7..083924f12 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/PublicationContentServlet.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/PublicationContentServlet.java @@ -185,6 +185,17 @@ private void displayWysiwyg(String html, HttpServletRequest request, HttpServlet } img.attr("src", newSource); } + Elements anchors = doc.getElementsByTag("a"); + for (Element a : anchors) { + String href = a.attr("href"); + String target = a.attr("target"); + if (!target.equalsIgnoreCase("_blank")) { + if (href.contains("/silverpeas/") && !href.contains(".jsp")) { + a.attr("href", "#"); + a.attr("onclick", "parent.navigate('" + href + "');"); + } + } + } html = doc.outerHtml(); OutputStreamWriter out = new OutputStreamWriter(response.getOutputStream(), "UTF-8"); diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/DetailUserDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/DetailUserDTO.java index 63bb3288c..3048f86d4 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/DetailUserDTO.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/DetailUserDTO.java @@ -25,7 +25,9 @@ package org.silverpeas.mobile.shared.dto; import java.io.Serializable; +import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.List; import java.util.Set; public class DetailUserDTO implements Serializable{ @@ -46,18 +48,19 @@ public class DetailUserDTO implements Serializable{ private String sessionKey; private boolean connected; private boolean notificationBox; - private LinkedHashMap<String, String> properties = new LinkedHashMap<String, String>(); + private List<PropertyDTO> properties = new ArrayList<>(); public void addProperty(String key, String value) { - properties.put(key, value); + PropertyDTO dto = new PropertyDTO(); + dto.setKey(key); + dto.setValue(value); + this.properties.add(dto); } - - public Set<String> getProperties() { - return properties.keySet(); + public void setProperties(List<PropertyDTO> properties) { + this.properties = properties; } - - public String getPropertieValue(String key) { - return properties.get(key); + public List<PropertyDTO> getProperties() { + return properties; } public String getId() { diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/PropertyDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/PropertyDTO.java new file mode 100644 index 000000000..cea66b17f --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/PropertyDTO.java @@ -0,0 +1,24 @@ +package org.silverpeas.mobile.shared.dto; + +import java.io.Serializable; + +public class PropertyDTO implements Serializable { + private String key; + private String value; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/authentication/UserProfileDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/authentication/UserProfileDTO.java index cc0054f92..08e10e925 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/authentication/UserProfileDTO.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/authentication/UserProfileDTO.java @@ -249,29 +249,31 @@ public AutoBean<IUserProfile> getAutoBean () { } public static UserProfileDTO getBean (AutoBean<IUserProfile> b) { - UserProfileDTO user = new UserProfileDTO(); - user.setAnonymous(b.as().isAnonymous()); - user.setAccessLevel(b.as().getAccessLevel()); - user.setAvatar(b.as().getAvatar()); - user.setId(b.as().getId()); - user.setConnected(b.as().isConnected()); - user.setApiToken(b.as().getApiToken()); - user.setContactsUri(b.as().getContactsUri()); - user.setDeletedState(b.as().isDeletedState()); - user.setDomainId(b.as().getDomainId()); - user.seteMail(b.as().geteMail()); - user.setLanguage(b.as().getLanguage()); - user.setLogin(b.as().getLogin()); - user.setFirstName(b.as().getFirstName()); - user.setDomainName(b.as().getDomainName()); - user.setFullName(b.as().getFullName()); - user.setStatus(b.as().getStatus()); - user.setUri(b.as().getUri()); - user.setLastName(b.as().getLastName()); - user.setSpecificId(b.as().getSpecificId()); - user.setWebPage(b.as().getWebPage()); - user.setDeactivatedState(b.as().isDeactivatedState()); - + UserProfileDTO user = null; + if (b!= null) { + user = new UserProfileDTO(); + user.setAnonymous(b.as().isAnonymous()); + user.setAccessLevel(b.as().getAccessLevel()); + user.setAvatar(b.as().getAvatar()); + user.setId(b.as().getId()); + user.setConnected(b.as().isConnected()); + user.setApiToken(b.as().getApiToken()); + user.setContactsUri(b.as().getContactsUri()); + user.setDeletedState(b.as().isDeletedState()); + user.setDomainId(b.as().getDomainId()); + user.seteMail(b.as().geteMail()); + user.setLanguage(b.as().getLanguage()); + user.setLogin(b.as().getLogin()); + user.setFirstName(b.as().getFirstName()); + user.setDomainName(b.as().getDomainName()); + user.setFullName(b.as().getFullName()); + user.setStatus(b.as().getStatus()); + user.setUri(b.as().getUri()); + user.setLastName(b.as().getLastName()); + user.setSpecificId(b.as().getSpecificId()); + user.setWebPage(b.as().getWebPage()); + user.setDeactivatedState(b.as().isDeactivatedState()); + } return user; } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/comments/CommentDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/comments/CommentDTO.java index b742b9643..59264111a 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/comments/CommentDTO.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/comments/CommentDTO.java @@ -98,16 +98,16 @@ public String getText() { public void setText(final String text) { this.text = text; + this.textForHtml = ""; } public String getTextForHtml() { + if (textForHtml.isEmpty()) { + textForHtml = text; + } return textForHtml; } - public void setTextForHtml(final String textForHtml) { - this.textForHtml = textForHtml; - } - public UserProfileDTO getAuthor() { return author; } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/PublicationDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/PublicationDTO.java index 7592f3829..4c223c998 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/PublicationDTO.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/PublicationDTO.java @@ -47,6 +47,8 @@ public class PublicationDTO extends BaseDTO implements Serializable, Comparable< private String vignette; private int viewsNumber; + private List<String> notAllowedDownloads; + public String getName() { return name; } @@ -136,4 +138,11 @@ public void setCreationDate(final String creationDate) { public int getViewsNumber() { return viewsNumber; } public void setViewsNumber(final int viewsNumber) { this.viewsNumber = viewsNumber; } + + public void setNotAllowedDownloads(List<String> notAllowedDownloads) { + this.notAllowedDownloads = notAllowedDownloads; + } + public List<String> getNotAllowedDownloads() { + return notAllowedDownloads; + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/SimpleDocumentDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/SimpleDocumentDTO.java index ca0a4ac17..24116573b 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/SimpleDocumentDTO.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/SimpleDocumentDTO.java @@ -48,6 +48,10 @@ public class SimpleDocumentDTO implements Serializable { private String comment; private long size, creationDate, updateDate; + private String spId; + + private boolean downloadable; + public String getId() { return id; @@ -184,4 +188,11 @@ public long getUpdateDate() { public void setUpdateDate(final long updateDate) { this.updateDate = updateDate; } + +public void setDownloadable(boolean downloadable) { + this.downloadable = downloadable; + } + public boolean isDownloadable() { + return this.downloadable; + } } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/hyperlink/HyperLinkDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/hyperlink/HyperLinkDTO.java new file mode 100644 index 000000000..14513eca2 --- /dev/null +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/hyperlink/HyperLinkDTO.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2000 - 2022 Silverpeas + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * As a special exception to the terms and conditions of version 3.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * Open Source Software ("FLOSS") applications as described in Silverpeas's + * FLOSS exception. You should have received a copy of the text describing + * the FLOSS exception, and it is also available here: + * "https://www.silverpeas.org/legal/floss_exception.html" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.silverpeas.mobile.shared.dto.hyperlink; + +import org.silverpeas.mobile.shared.dto.BaseDTO; + +import java.io.Serializable; + +public class HyperLinkDTO implements Serializable { + + private String url; + private boolean openNewWindow; + private boolean internalLink; + + public HyperLinkDTO() { + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public boolean getOpenNewWindow() { + return openNewWindow; + } + + public void setOpenNewWindow(boolean openNewWindow) { + this.openNewWindow = openNewWindow; + } + + public boolean getInternalLink() { + return internalLink; + } + + public void setInternalLink(boolean internalLink) { + this.internalLink = internalLink; + } +} diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceHyperLink.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceHyperLink.java index e08837d6d..1000c1ada 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceHyperLink.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceHyperLink.java @@ -24,8 +24,9 @@ package org.silverpeas.mobile.shared.services.rest; +import org.fusesource.restygwt.client.MethodCallback; import org.fusesource.restygwt.client.RestService; -import org.fusesource.restygwt.client.TextCallback; +import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO; import javax.ws.rs.GET; import javax.ws.rs.Path; @@ -39,5 +40,5 @@ public interface ServiceHyperLink extends RestService { @GET @Path("{appId}/") - public void getUrl(@PathParam("appId") String appId, TextCallback callback); + public void getUrl(@PathParam("appId") String appId, MethodCallback<HyperLinkDTO> callback); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMedia.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMedia.java index 0d2674a6d..5ef688498 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMedia.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMedia.java @@ -92,6 +92,6 @@ public void getAllQuestions(@PathParam("appId") String appId, @GET @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON) - @Path("{appId}/videostream/{pictureId}") + @Path("{appId}/photo/{pictureId}") public void getPreviewPicture(@PathParam("appId") String instanceId, @PathParam("pictureId") String pictureId, MethodCallback<PhotoDTO> callback); } diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceNavigation.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceNavigation.java index 02a98c7b7..b95b56d41 100644 --- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceNavigation.java +++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceNavigation.java @@ -31,6 +31,7 @@ import org.silverpeas.mobile.shared.dto.HomePageDTO; import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; import org.silverpeas.mobile.shared.dto.navigation.SilverpeasObjectDTO; +import org.silverpeas.mobile.shared.dto.navigation.SpaceDTO; import javax.ws.rs.Consumes; import javax.ws.rs.GET; @@ -48,6 +49,11 @@ @Path("/mobile/navigation") public interface ServiceNavigation extends RestService { + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("space/{spaceId}/") + public void getSpace(@PathParam("spaceId") String spaceId, MethodCallback<SpaceDTO> callback); + @GET @Produces(MediaType.APPLICATION_JSON) @Path("spacesAndApps/{rootSpaceId}/") diff --git a/mobile-war/src/main/webapp/WEB-INF/app-init.template b/mobile-war/src/main/webapp/WEB-INF/app-init.template index 0e834d3e6..86250f507 100644 --- a/mobile-war/src/main/webapp/WEB-INF/app-init.template +++ b/mobile-war/src/main/webapp/WEB-INF/app-init.template @@ -5,28 +5,31 @@ if (firebaseConfig != null) { const messaging = firebase.messaging(); navigator.serviceWorker.register('/silverpeas/spmobile/app-sw.js') .then((registration) => { - messaging.useServiceWorker(registration); + navigator.serviceWorker.ready.then(function(reg) { + messaging.useServiceWorker(registration); - // Request permission and get token..... - Notification.requestPermission().then(function(permission) { - if (permission === "granted") { - messaging.getToken().then(token => { - console.log("Token Is : " + token); - storeToken(token); + // Request permission and get token..... + Notification.requestPermission().then(function(permission) { + if (permission === "granted") { + messaging.getToken().then(token => { + console.log("Token Is : " + token); + storeToken(token); + }); + } else { + console.log("No permission to send push"); + } }); - } else { - console.log("No permission to send push"); - } }); }); messaging.onMessage(payload => { const notificationOptions = { - body : payload.data["subject"], icon : '/silverpeas/util/icons/desktop-user-notification.png' + body : payload.data["body"], icon : '/silverpeas/util/icons/desktop-user-notification.png', + data : payload.data }; navigator.serviceWorker.getRegistration('/silverpeas/spmobile/').then(registration => { - registration.showNotification(payload.data["sender"], notificationOptions) + registration.showNotification(payload.data["subject"], notificationOptions) }); }); } else { diff --git a/mobile-war/src/main/webapp/WEB-INF/app-sw.template b/mobile-war/src/main/webapp/WEB-INF/app-sw.template index ed7735cf4..d4400a570 100644 --- a/mobile-war/src/main/webapp/WEB-INF/app-sw.template +++ b/mobile-war/src/main/webapp/WEB-INF/app-sw.template @@ -10,9 +10,9 @@ if (firebaseConfig != null) { messaging.setBackgroundMessageHandler(function(payload) { console.log('[firebase-messaging-sw.js] Received background message ', payload); - const notificationTitle = payload.data["sender"]; + const notificationTitle = payload.data["subject"]; const notificationOptions = { - body : payload.data["subject"], icon : '/silverpeas/util/icons/desktop-user-notification.png', + body : payload.data["body"], icon : '/silverpeas/util/icons/desktop-user-notification.png', data : payload.data }; @@ -24,7 +24,10 @@ if (firebaseConfig != null) { const pushData = event.notification.data; event.notification.close(); if (!pushData["permalink"].endsWith("/null")) { - event.waitUntil(self.clients.openWindow(pushData["permalink"])); + fetch('/silverpeas/services/mobile/notification/readed/' + pushData["notificationId"], { + method: 'PUT' + }); + event.waitUntil(self.clients.openWindow(pushData["permalink"])); } }); diff --git a/mobile-war/src/main/webapp/spmobile/spmobil.jsp b/mobile-war/src/main/webapp/spmobile/spmobil.jsp index 232d5219c..ec8b36497 100644 --- a/mobile-war/src/main/webapp/spmobile/spmobil.jsp +++ b/mobile-war/src/main/webapp/spmobile/spmobil.jsp @@ -139,6 +139,9 @@ var windowHeight = window.innerHeight; document.body.style.height = windowHeight + "px"; } + function navigate(url) { + window.navigateTo(url); + } </script> <% @@ -151,6 +154,15 @@ </head> <body class="ui-panel-wrapper ui-page-theme-a csspinner traditional" onload="resize();"> +<% + String fullSsoPath = ""; + if (!ssoPath.trim().isEmpty()) { + fullSsoPath = request.getRequestURL().toString(); + fullSsoPath = fullSsoPath.replace("/spmobile/spmobil.jsp", ""); + fullSsoPath = fullSsoPath + ssoPath; + } +%> +<input type="hidden" id="ssoPath" value="<%=fullSsoPath%>"> <div id="oneinch" style="position: absolute;padding: 0;visibility: hidden;width: 1in;height: 1in;"></div> diff --git a/pom.xml b/pom.xml index 33bb0fcc6..8fee4ee06 100644 --- a/pom.xml +++ b/pom.xml @@ -35,14 +35,14 @@ <groupId>org.silverpeas.components</groupId> <artifactId>mobile</artifactId> <packaging>pom</packaging> - <version>6.3-SNAPSHOT</version> + <version>6.3.7-SNAPSHOT</version> <name>Silverpeas Mobile component</name> <properties> - <silverpeas.version>6.3-build221011</silverpeas.version> + <silverpeas.version>6.3.7-build250214</silverpeas.version> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> - <next.release>6.3</next.release> + <next.release>6.3.7</next.release> </properties> <repositories>