diff --git a/web/src/main/java/com/silverpeas/mobile/client/apps/media/MediaApp.java b/web/src/main/java/com/silverpeas/mobile/client/apps/media/MediaApp.java index 6605add2b..91d023c51 100644 --- a/web/src/main/java/com/silverpeas/mobile/client/apps/media/MediaApp.java +++ b/web/src/main/java/com/silverpeas/mobile/client/apps/media/MediaApp.java @@ -12,6 +12,8 @@ import com.silverpeas.mobile.client.apps.media.events.pages.navigation.MediaItemsLoadedEvent; import com.silverpeas.mobile.client.apps.media.pages.MediaNavigationPage; import com.silverpeas.mobile.client.apps.media.pages.PhotoPage; +import com.silverpeas.mobile.client.apps.media.pages.SoundPage; +import com.silverpeas.mobile.client.apps.media.pages.VideoPage; import com.silverpeas.mobile.client.apps.media.resources.MediaMessages; import com.silverpeas.mobile.client.apps.navigation.Apps; import com.silverpeas.mobile.client.apps.navigation.NavigationApp; @@ -23,8 +25,11 @@ import com.silverpeas.mobile.client.common.app.App; import com.silverpeas.mobile.client.common.event.ErrorEvent; import com.silverpeas.mobile.shared.dto.BaseDTO; +import com.silverpeas.mobile.shared.dto.ContentsTypes; import com.silverpeas.mobile.shared.dto.RightDTO; import com.silverpeas.mobile.shared.dto.media.PhotoDTO; +import com.silverpeas.mobile.shared.dto.media.SoundDTO; +import com.silverpeas.mobile.shared.dto.media.VideoDTO; import com.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; import java.util.List; @@ -66,17 +71,31 @@ public void onFailure(final Throwable caught) { @Override public void onSuccess(final ApplicationInstanceDTO app) { commentable = app.isCommentable(); - displayContent(appId, contentId); + displayContent(appId, contentType, contentId); } }); } - private void displayContent(final String appId, final String contentId) { - PhotoPage page = new PhotoPage(); - page.setPageTitle(msg.title()); - setMainPage(page); - page.show(); - EventBus.getInstance().fireEvent(new MediaPreviewLoadEvent(appId, contentId)); + private void displayContent(final String appId, String contentType, final String contentId) { + if (contentType.equals(ContentsTypes.Photo.toString())) { + PhotoPage page = new PhotoPage(); + page.setPageTitle(msg.title()); + setMainPage(page); + page.show(); + EventBus.getInstance().fireEvent(new MediaPreviewLoadEvent(appId, contentType, contentId, null)); + } else if (contentType.equals(ContentsTypes.Sound.toString())) { + SoundPage page = new SoundPage(); + page.setPageTitle(msg.title()); + setMainPage(page); + page.show(); + EventBus.getInstance().fireEvent(new MediaPreviewLoadEvent(appId, contentType, contentId, null)); + } else if (contentType.equals(ContentsTypes.Video.toString())) { + VideoPage page = new VideoPage(); + page.setPageTitle(msg.title()); + setMainPage(page); + page.show(); + EventBus.getInstance().fireEvent(new MediaPreviewLoadEvent(appId, contentType, contentId, null)); + } } @Override @@ -94,7 +113,6 @@ public void appInstanceChanged(NavigationAppInstanceChangedEvent event) { page.setPageTitle(msg.title()); page.init(event.getInstance().getId(), null, event.getInstance().getRights()); page.show(); - } @Override @@ -115,17 +133,50 @@ public void onFailure(Throwable caught) { @Override public void loadMediaPreview(final MediaPreviewLoadEvent event) { - ServicesLocator.serviceMedia.getPreviewPicture(event.getInstanceId(), event.getMediaId(), new AsyncCallback() { - @Override - public void onFailure(final Throwable caught) { - EventBus.getInstance().fireEvent(new ErrorEvent(caught)); + if (event.getMedia() == null) { + if (event.getContentType().equals(ContentsTypes.Photo.toString())) { + ServicesLocator.serviceMedia.getPreviewPicture(event.getInstanceId(), event.getMediaId(), + new AsyncCallback() { + @Override + public void onFailure(final Throwable caught) { + EventBus.getInstance().fireEvent(new ErrorEvent(caught)); + } + + @Override + public void onSuccess(final PhotoDTO preview) { + EventBus.getInstance().fireEvent(new MediaPreviewLoadedEvent(preview, commentable)); + } + }); + } else if (event.getContentType().equals(ContentsTypes.Sound.toString())) { + ServicesLocator.serviceMedia.getSound(event.getInstanceId(), event.getMediaId(), + new AsyncCallback() { + @Override + public void onFailure(final Throwable caught) { + EventBus.getInstance().fireEvent(new ErrorEvent(caught)); + } + + @Override + public void onSuccess(final SoundDTO sound) { + EventBus.getInstance().fireEvent(new MediaPreviewLoadedEvent(sound, commentable)); + } + }); + } else if (event.getContentType().equals(ContentsTypes.Video.toString())) { + ServicesLocator.serviceMedia.getVideo(event.getInstanceId(), event.getMediaId(), + new AsyncCallback() { + @Override + public void onFailure(final Throwable caught) { + EventBus.getInstance().fireEvent(new ErrorEvent(caught)); + } + + @Override + public void onSuccess(final VideoDTO sound) { + EventBus.getInstance().fireEvent(new MediaPreviewLoadedEvent(sound, commentable)); + } + }); } - - @Override - public void onSuccess(final PhotoDTO preview) { - EventBus.getInstance().fireEvent(new MediaPreviewLoadedEvent(preview, commentable)); - } - }); + } else { + EventBus.getInstance().fireEvent(new MediaPreviewLoadedEvent(event.getMedia(), commentable)); + } } @Override diff --git a/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/app/AbstractMediaAppEvent.java b/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/app/AbstractMediaAppEvent.java index e08eac378..6ed7af7db 100644 --- a/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/app/AbstractMediaAppEvent.java +++ b/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/app/AbstractMediaAppEvent.java @@ -4,13 +4,13 @@ public abstract class AbstractMediaAppEvent extends GwtEvent { - public static Type TYPE = new Type(); - - public AbstractMediaAppEvent() { - } - - @Override - public com.google.gwt.event.shared.GwtEvent.Type getAssociatedType() { - return TYPE; - } + public static Type TYPE = new Type(); + + public AbstractMediaAppEvent() { + } + + @Override + public com.google.gwt.event.shared.GwtEvent.Type getAssociatedType() { + return TYPE; + } } diff --git a/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/app/MediaPreviewLoadEvent.java b/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/app/MediaPreviewLoadEvent.java index 4aa63d7e9..9fa559389 100644 --- a/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/app/MediaPreviewLoadEvent.java +++ b/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/app/MediaPreviewLoadEvent.java @@ -1,25 +1,38 @@ package com.silverpeas.mobile.client.apps.media.events.app; +import com.silverpeas.mobile.shared.dto.media.MediaDTO; + public class MediaPreviewLoadEvent extends AbstractMediaAppEvent { - private String instanceId, mediaId; + private String instanceId, mediaId, contentType; + private MediaDTO media; - public MediaPreviewLoadEvent(String instanceId, String mediaId) { - super(); - this.mediaId = mediaId; - this.instanceId = instanceId; - } + public MediaPreviewLoadEvent(String instanceId, String contentType, String mediaId, MediaDTO media) { + super(); + this.mediaId = mediaId; + this.contentType = contentType; + this.instanceId = instanceId; + this.media = media; + } - @Override - protected void dispatch(MediaAppEventHandler handler) { - handler.loadMediaPreview(this); - } + @Override + protected void dispatch(MediaAppEventHandler handler) { + handler.loadMediaPreview(this); + } - public String getInstanceId() { - return instanceId; - } + public String getInstanceId() { + return instanceId; + } public String getMediaId() { return mediaId; } + + public MediaDTO getMedia() { + return media; + } + + public String getContentType() { + return contentType; + } } diff --git a/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/pages/AbstractMediaPagesEvent.java b/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/pages/AbstractMediaPagesEvent.java index b0928db63..be13dd0f2 100644 --- a/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/pages/AbstractMediaPagesEvent.java +++ b/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/pages/AbstractMediaPagesEvent.java @@ -4,13 +4,13 @@ public abstract class AbstractMediaPagesEvent extends GwtEvent { - public static Type TYPE = new Type(); + public static Type TYPE = new Type(); - public AbstractMediaPagesEvent() { - } + public AbstractMediaPagesEvent() { + } - @Override - public Type getAssociatedType() { - return TYPE; - } + @Override + public Type getAssociatedType() { + return TYPE; + } } diff --git a/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/pages/MediaPreviewLoadedEvent.java b/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/pages/MediaPreviewLoadedEvent.java index f34109809..b3a4d5bed 100644 --- a/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/pages/MediaPreviewLoadedEvent.java +++ b/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/pages/MediaPreviewLoadedEvent.java @@ -6,21 +6,21 @@ public class MediaPreviewLoadedEvent extends AbstractMediaPagesEvent { - private PhotoDTO preview; + private MediaDTO preview; private boolean commentable; - public MediaPreviewLoadedEvent(PhotoDTO preview, boolean commentable) { - super(); + public MediaPreviewLoadedEvent(MediaDTO preview, boolean commentable) { + super(); this.preview = preview; this.commentable = commentable; - } + } - @Override - protected void dispatch(MediaPagesEventHandler handler) { - handler.onMediaPreviewLoaded(this); - } + @Override + protected void dispatch(MediaPagesEventHandler handler) { + handler.onMediaPreviewLoaded(this); + } - public PhotoDTO getPreview() { + public MediaDTO getPreview() { return preview; } diff --git a/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/pages/MediaViewLoadedEvent.java b/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/pages/MediaViewLoadedEvent.java index 852d6bab0..1e5f331a7 100644 --- a/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/pages/MediaViewLoadedEvent.java +++ b/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/pages/MediaViewLoadedEvent.java @@ -7,15 +7,15 @@ public class MediaViewLoadedEvent extends AbstractMediaPagesEvent { private PhotoDTO view; - public MediaViewLoadedEvent(PhotoDTO view) { - super(); + public MediaViewLoadedEvent(PhotoDTO view) { + super(); this.view = view; - } + } - @Override - protected void dispatch(MediaPagesEventHandler handler) { - handler.onMediaViewLoaded(this); - } + @Override + protected void dispatch(MediaPagesEventHandler handler) { + handler.onMediaViewLoaded(this); + } public PhotoDTO getView() { return view; diff --git a/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/pages/navigation/MediaItemClickEvent.java b/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/pages/navigation/MediaItemClickEvent.java index 2a8c03316..7177de4bf 100644 --- a/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/pages/navigation/MediaItemClickEvent.java +++ b/web/src/main/java/com/silverpeas/mobile/client/apps/media/events/pages/navigation/MediaItemClickEvent.java @@ -3,19 +3,19 @@ public class MediaItemClickEvent extends AbstractMediaNavigationPagesEvent { - private Object mediaItem; - - public MediaItemClickEvent(Object mediaItem) { - super(); - this.mediaItem = mediaItem; - } + private Object mediaItem; - @Override - protected void dispatch(MediaNavigationPagesEventHandler handler) { - handler.onMediaItemClicked(this); - } + public MediaItemClickEvent(Object mediaItem) { + super(); + this.mediaItem = mediaItem; + } - public Object getMediaItem() { - return mediaItem; - } + @Override + protected void dispatch(MediaNavigationPagesEventHandler handler) { + handler.onMediaItemClicked(this); + } + + public Object getMediaItem() { + return mediaItem; + } } diff --git a/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/MediaNavigationPage.java b/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/MediaNavigationPage.java index a814f7490..bb44cfdeb 100644 --- a/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/MediaNavigationPage.java +++ b/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/MediaNavigationPage.java @@ -1,6 +1,7 @@ package com.silverpeas.mobile.client.apps.media.pages; import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Widget; @@ -19,11 +20,13 @@ import com.silverpeas.mobile.client.components.UnorderedList; import com.silverpeas.mobile.client.components.base.PageContent; import com.silverpeas.mobile.shared.dto.BaseDTO; +import com.silverpeas.mobile.shared.dto.ContentsTypes; import com.silverpeas.mobile.shared.dto.RightDTO; import com.silverpeas.mobile.shared.dto.media.AlbumDTO; import com.silverpeas.mobile.shared.dto.media.MediaDTO; import com.silverpeas.mobile.shared.dto.media.PhotoDTO; import com.silverpeas.mobile.shared.dto.media.SoundDTO; +import com.silverpeas.mobile.shared.dto.media.VideoDTO; import java.util.List; @@ -89,12 +92,31 @@ public void onMediaItemClicked(final MediaItemClickEvent event) { PhotoPage page = new PhotoPage(); page.setPageTitle(getPageTitle()); page.show(); - EventBus.getInstance().fireEvent(new MediaPreviewLoadEvent(instanceId, ((PhotoDTO) event.getMediaItem()).getId())); + EventBus.getInstance().fireEvent(new MediaPreviewLoadEvent(instanceId, ContentsTypes.Photo.toString(), ((PhotoDTO) event.getMediaItem()).getId(), null)); } else if (event.getMediaItem() instanceof SoundDTO) { SoundPage page = new SoundPage(); page.setPageTitle(getPageTitle()); - page.setSound((SoundDTO) event.getMediaItem()); page.show(); + Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { + @Override + public void execute() { + EventBus.getInstance().fireEvent( + new MediaPreviewLoadEvent(((MediaDTO) event.getMediaItem()).getInstance(), ContentsTypes.Sound.toString(), + ((MediaDTO) event.getMediaItem()).getId(), (MediaDTO) event.getMediaItem())); + } + }); + } else if (event.getMediaItem() instanceof VideoDTO) { + VideoPage page = new VideoPage(); + page.setPageTitle(getPageTitle()); + page.show(); + Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { + @Override + public void execute() { + EventBus.getInstance().fireEvent( + new MediaPreviewLoadEvent(((MediaDTO) event.getMediaItem()).getInstance(), ContentsTypes.Video.toString(), + ((MediaDTO) event.getMediaItem()).getId(), (MediaDTO) event.getMediaItem())); + } + }); } } } diff --git a/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/PhotoPage.java b/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/PhotoPage.java index ae79156c4..4eb08e3f7 100644 --- a/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/PhotoPage.java +++ b/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/PhotoPage.java @@ -36,7 +36,7 @@ */ public class PhotoPage extends PageContent implements View, MediaPagesEventHandler { - interface MediaPageUiBinder extends UiBinder { + interface PhotoPageUiBinder extends UiBinder { } @UiField HeadingElement mediaTitle; @@ -45,7 +45,7 @@ interface MediaPageUiBinder extends UiBinder { @UiField SpanElement mediaFileName, weight, dimensions; @UiField ImageElement preview, mediaType; @UiField CommentsButton comments; - private static MediaPageUiBinder uiBinder = GWT.create(MediaPageUiBinder.class); + private static PhotoPageUiBinder uiBinder = GWT.create(PhotoPageUiBinder.class); private PhotoDTO photo; private DocumentsResources ressources; private MediaMessages msg; @@ -62,7 +62,7 @@ public PhotoPage() { @Override public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) { if (isVisible()) { - this.photo = event.getPreview(); + this.photo = (PhotoDTO) event.getPreview(); preview.setSrc(photo.getDataPhoto()); Image img = new Image(ressources.image()); mediaType.getParentElement().replaceChild(img.getElement(), mediaType); @@ -83,7 +83,7 @@ public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) { lastUpdate.setInnerHTML(msg.lastUpdate(photo.getUpdateDate(), photo.getUpdater())); if (event.isCommentable()) { - comments.init(photo.getId(), photo.getInstance(), CommentDTO.TYPE_MEDIA, getPageTitle(), + comments.init(photo.getId(), photo.getInstance(), CommentDTO.TYPE_PHOTO, getPageTitle(), photo.getTitle(), photo.getCommentsNumber()); } else { comments.getElement().getStyle().setDisplay(Style.Display.NONE); diff --git a/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/SoundPage.java b/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/SoundPage.java index 35de339e6..b42b5be1b 100644 --- a/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/SoundPage.java +++ b/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/SoundPage.java @@ -5,16 +5,14 @@ import com.google.gwt.dom.client.HeadingElement; import com.google.gwt.dom.client.ImageElement; import com.google.gwt.dom.client.ParagraphElement; -import com.google.gwt.dom.client.SourceElement; import com.google.gwt.dom.client.SpanElement; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.media.client.Audio; +import com.google.gwt.dom.client.Style; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.Image; import com.silverpeas.mobile.client.SpMobil; import com.silverpeas.mobile.client.apps.comments.pages.widgets.CommentsButton; import com.silverpeas.mobile.client.apps.media.events.pages.AbstractMediaPagesEvent; @@ -26,6 +24,7 @@ import com.silverpeas.mobile.client.common.app.View; import com.silverpeas.mobile.client.components.base.PageContent; import com.silverpeas.mobile.client.resources.ApplicationResources; +import com.silverpeas.mobile.shared.dto.comments.CommentDTO; import com.silverpeas.mobile.shared.dto.media.SoundDTO; /** @@ -33,7 +32,7 @@ */ public class SoundPage extends PageContent implements View, MediaPagesEventHandler { - interface MediaPageUiBinder extends UiBinder { + interface SoundPageUiBinder extends UiBinder { } @UiField HeadingElement mediaTitle; @@ -43,7 +42,7 @@ interface MediaPageUiBinder extends UiBinder { @UiField ImageElement mediaPreview, mediaType; @UiField AudioElement player; @UiField CommentsButton comments; - private static MediaPageUiBinder uiBinder = GWT.create(MediaPageUiBinder.class); + private static SoundPageUiBinder uiBinder = GWT.create(SoundPageUiBinder.class); private ApplicationResources resources = GWT.create(ApplicationResources.class); private SoundDTO sound; private MediaMessages msg; @@ -51,22 +50,50 @@ interface MediaPageUiBinder extends UiBinder { public SoundPage() { initWidget(uiBinder.createAndBindUi(this)); msg = GWT.create(MediaMessages.class); - EventBus.getInstance().addHandler(AbstractMediaPagesEvent.TYPE, this); getElement().setId("a-media"); - mediaPreview.setSrc(resources.sound().getSafeUri().asString()); - } - - public void setSound(SoundDTO sound) { - this.sound = sound; - String url = Window.Location.getProtocol() + "//" + Window.Location.getHost() + Window.Location.getPath() + "spmobil/SoundAction"; - url = url + "?id=" + sound.getId() + "&instanceId=" + sound.getInstance() + "&userId=" + SpMobil.user.getId(); - player.setSrc(url); - player.setAutoplay(true); - player.setControls(true); + EventBus.getInstance().addHandler(AbstractMediaPagesEvent.TYPE, this); } @Override public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) { + if (isVisible()) { + mediaPreview.setSrc(resources.sound().getSafeUri().asString()); + SoundDTO sound = (SoundDTO) event.getPreview(); + this.sound = sound; + String url = Window.Location.getProtocol() + "//" + Window.Location.getHost() + Window.Location.getPath() + "spmobil/SoundAction"; + url = url + "?id=" + sound.getId() + "&instanceId=" + sound.getInstance() + "&userId=" + SpMobil.user.getId(); + player.setSrc(url); + player.setAutoplay(true); + player.setControls(true); + + Image img = new Image(resources.sound()); + mediaType.getParentElement().replaceChild(img.getElement(), mediaType); + mediaTitle.setInnerHTML(sound.getTitle()); + mediaFileName.setInnerHTML(sound.getName()); + + String size; + if (sound.getSize() < 1024 * 1024) { + size = String.valueOf(sound.getSize() / 1024); + weight.setInnerHTML(msg.sizeK(size)); + } else { + size = String.valueOf(sound.getSize() / (1024 * 1024)); + weight.setInnerHTML(msg.sizeM(size)); + } + dimensions.setInnerHTML(String.valueOf(sound.getDuration())); + lastUpdate.setInnerHTML(msg.lastUpdate(sound.getUpdateDate(), sound.getUpdater())); + + if (sound.isDownload()) { + download.setHref(url); + download.setTarget("_self"); + } + + if (event.isCommentable()) { + comments.init(sound.getId(), sound.getInstance(), CommentDTO.TYPE_SOUND, getPageTitle(), + sound.getTitle(), sound.getCommentsNumber()); + } else { + comments.getElement().getStyle().setDisplay(Style.Display.NONE); + } + } } @Override @@ -79,14 +106,4 @@ public void stop() { comments.stop(); EventBus.getInstance().removeHandler(AbstractMediaPagesEvent.TYPE, this); } - - @UiHandler("download") - void download(ClickEvent event) { - if (sound.isDownload()) { - if (!clicked) { - clicked = true; - //TODO : enable download file - } - } - } } \ No newline at end of file diff --git a/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/SoundPage.ui.xml b/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/SoundPage.ui.xml index b547bb420..4229a348c 100644 --- a/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/SoundPage.ui.xml +++ b/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/SoundPage.ui.xml @@ -13,7 +13,7 @@
  • - + diff --git a/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/VideoPage.java b/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/VideoPage.java new file mode 100644 index 000000000..fef1d9098 --- /dev/null +++ b/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/VideoPage.java @@ -0,0 +1,120 @@ +package com.silverpeas.mobile.client.apps.media.pages; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.JavaScriptException; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.dom.client.AudioElement; +import com.google.gwt.dom.client.HeadingElement; +import com.google.gwt.dom.client.ImageElement; +import com.google.gwt.dom.client.ParagraphElement; +import com.google.gwt.dom.client.SpanElement; +import com.google.gwt.dom.client.Style; +import com.google.gwt.dom.client.VideoElement; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.Image; +import com.silverpeas.mobile.client.SpMobil; +import com.silverpeas.mobile.client.apps.comments.pages.widgets.CommentsButton; +import com.silverpeas.mobile.client.apps.documents.resources.DocumentsResources; +import com.silverpeas.mobile.client.apps.media.events.app.MediaViewLoadEvent; +import com.silverpeas.mobile.client.apps.media.events.pages.AbstractMediaPagesEvent; +import com.silverpeas.mobile.client.apps.media.events.pages.MediaPagesEventHandler; +import com.silverpeas.mobile.client.apps.media.events.pages.MediaPreviewLoadedEvent; +import com.silverpeas.mobile.client.apps.media.events.pages.MediaViewLoadedEvent; +import com.silverpeas.mobile.client.apps.media.resources.MediaMessages; +import com.silverpeas.mobile.client.common.EventBus; +import com.silverpeas.mobile.client.common.Notification; +import com.silverpeas.mobile.client.common.app.View; +import com.silverpeas.mobile.client.components.base.PageContent; +import com.silverpeas.mobile.client.resources.ApplicationResources; +import com.silverpeas.mobile.shared.dto.comments.CommentDTO; +import com.silverpeas.mobile.shared.dto.media.PhotoDTO; +import com.silverpeas.mobile.shared.dto.media.SoundDTO; +import com.silverpeas.mobile.shared.dto.media.VideoDTO; + +/** + * @author: svu + */ +public class VideoPage extends PageContent implements View, MediaPagesEventHandler { + + interface VideoPageUiBinder extends UiBinder { + } + + @UiField HeadingElement mediaTitle; + @UiField Anchor mediaFullSize, download; + @UiField ParagraphElement lastUpdate; + @UiField SpanElement mediaFileName, weight, dimensions; + @UiField ImageElement mediaType; + @UiField CommentsButton comments; + @UiField VideoElement player; + private static VideoPageUiBinder uiBinder = GWT.create(VideoPageUiBinder.class); + private VideoDTO video; + private MediaMessages msg; + private ApplicationResources resources = GWT.create(ApplicationResources.class); + + public VideoPage() { + initWidget(uiBinder.createAndBindUi(this)); + msg = GWT.create(MediaMessages.class); + EventBus.getInstance().addHandler(AbstractMediaPagesEvent.TYPE, this); + getElement().setId("a-media"); + } + + @Override + public void onMediaPreviewLoaded(final MediaPreviewLoadedEvent event) { + if (isVisible()) { + this.video = (VideoDTO) event.getPreview(); + + //TODO : preview video + + String url = Window.Location.getProtocol() + "//" + Window.Location.getHost() + Window.Location.getPath() + "spmobil/VideoAction"; + url = url + "?id=" + video.getId() + "&instanceId=" + video.getInstance() + "&userId=" + SpMobil.user.getId(); + player.setSrc(url); + player.setAutoplay(false); + player.setControls(true); + player.setPreload("none"); + player.setPoster(video.getDataPoster()); + player.setHeight(140); + + Image img = new Image(resources.video()); + mediaType.getParentElement().replaceChild(img.getElement(), mediaType); + mediaTitle.setInnerHTML(video.getTitle()); + mediaFileName.setInnerHTML(video.getName()); + + String size; + if (video.getSize() < 1024 * 1024) { + size = String.valueOf(video.getSize() / 1024); + weight.setInnerHTML(msg.sizeK(size)); + } else { + size = String.valueOf(video.getSize() / (1024 * 1024)); + weight.setInnerHTML(msg.sizeM(size)); + } + + dimensions.setInnerHTML(String.valueOf(video.getDuration())); + + lastUpdate.setInnerHTML(msg.lastUpdate(video.getUpdateDate(), video.getUpdater())); + + if (event.isCommentable()) { + comments.init(video.getId(), video.getInstance(), CommentDTO.TYPE_PHOTO, getPageTitle(), + video.getTitle(), video.getCommentsNumber()); + } else { + comments.getElement().getStyle().setDisplay(Style.Display.NONE); + } + } + } + + @Override + public void onMediaViewLoaded(final MediaViewLoadedEvent event) { + } + + @Override + public void stop() { + super.stop(); + comments.stop(); + EventBus.getInstance().removeHandler(AbstractMediaPagesEvent.TYPE, this); + } +} \ No newline at end of file diff --git a/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/VideoPage.ui.xml b/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/VideoPage.ui.xml new file mode 100644 index 000000000..5b6217ad0 --- /dev/null +++ b/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/VideoPage.ui.xml @@ -0,0 +1,26 @@ + + +

    + +
    + + + +
    + +
      +
    • + + + + + + +
    • +
    + +

    Dernière modification le 29/01/2014 par David Lesimple

    +
    +
    \ No newline at end of file diff --git a/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/widgets/MediaItem.java b/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/widgets/MediaItem.java index af9874034..18b6177ec 100644 --- a/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/widgets/MediaItem.java +++ b/web/src/main/java/com/silverpeas/mobile/client/apps/media/pages/widgets/MediaItem.java @@ -6,6 +6,7 @@ import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; @@ -47,7 +48,7 @@ public void setData(MediaDTO data) { } else if (data instanceof SoundDTO) { thumb.setSrc(resources.sound().getSafeUri().asString()); } else if (data instanceof VideoDTO) { - //TODO + thumb.setSrc(resources.video().getSafeUri().asString()); } else if (data instanceof VideoStreamingDTO) { //TODO } diff --git a/web/src/main/java/com/silverpeas/mobile/client/common/EventBus.java b/web/src/main/java/com/silverpeas/mobile/client/common/EventBus.java index c7c563c42..22c402581 100644 --- a/web/src/main/java/com/silverpeas/mobile/client/common/EventBus.java +++ b/web/src/main/java/com/silverpeas/mobile/client/common/EventBus.java @@ -3,21 +3,21 @@ import com.google.gwt.event.shared.HandlerManager; /** - * + * * @author svuillet */ public class EventBus extends HandlerManager { - private static EventBus instance = null; - - public static EventBus getInstance() { - if (instance == null) { - instance = new EventBus(); - } - return instance; - } - - private EventBus() { - super(null); - } + private static EventBus instance = null; + + public static EventBus getInstance() { + if (instance == null) { + instance = new EventBus(); + } + return instance; + } + + private EventBus() { + super(null); + } } \ No newline at end of file diff --git a/web/src/main/java/com/silverpeas/mobile/client/pages/search/SearchResultPage.java b/web/src/main/java/com/silverpeas/mobile/client/pages/search/SearchResultPage.java index 48511ffde..2cf85023a 100644 --- a/web/src/main/java/com/silverpeas/mobile/client/pages/search/SearchResultPage.java +++ b/web/src/main/java/com/silverpeas/mobile/client/pages/search/SearchResultPage.java @@ -62,13 +62,21 @@ public void onClick(final ClickEvent event) { } else if (result.getType().equals(ContentsTypes.Photo.toString())) { App app = new MediaApp(); app.startWithContent(result.getComponentId(), result.getType(), result.getId()); + } else if (result.getType().equals(ContentsTypes.Sound.toString())) { + App app = new MediaApp(); + app.startWithContent(result.getComponentId(), result.getType(), result.getId()); + } else if (result.getType().equals(ContentsTypes.Video.toString())) { + App app = new MediaApp(); + app.startWithContent(result.getComponentId(), result.getType(), result.getId()); } + + } }); link.setText(result.getTitle()); if (result.getType().equals(ContentsTypes.Publication.toString())) { list.add(link, "publication"); - } else if (result.getType().equals(ContentsTypes.Photo.toString())) { + } else if (result.getType().equals(ContentsTypes.Photo.toString()) || result.getType().equals(ContentsTypes.Sound.toString()) || result.getType().equals(ContentsTypes.Video.toString())) { list.add(link, "media"); } else { list.add(link); diff --git a/web/src/main/java/com/silverpeas/mobile/client/resources/ApplicationResources.java b/web/src/main/java/com/silverpeas/mobile/client/resources/ApplicationResources.java index 50f646cc8..5ef5d84d7 100644 --- a/web/src/main/java/com/silverpeas/mobile/client/resources/ApplicationResources.java +++ b/web/src/main/java/com/silverpeas/mobile/client/resources/ApplicationResources.java @@ -13,4 +13,7 @@ public interface ApplicationResources extends ClientBundle { @Source("sound.png") ImageResource sound(); + + @Source("video.png") + ImageResource video(); } diff --git a/web/src/main/java/com/silverpeas/mobile/client/resources/video.png b/web/src/main/java/com/silverpeas/mobile/client/resources/video.png new file mode 100644 index 000000000..c18a57fde Binary files /dev/null and b/web/src/main/java/com/silverpeas/mobile/client/resources/video.png differ diff --git a/web/src/main/java/com/silverpeas/mobile/server/services/ServiceMediaImpl.java b/web/src/main/java/com/silverpeas/mobile/server/services/ServiceMediaImpl.java index a7bd38465..8613d552d 100644 --- a/web/src/main/java/com/silverpeas/mobile/server/services/ServiceMediaImpl.java +++ b/web/src/main/java/com/silverpeas/mobile/server/services/ServiceMediaImpl.java @@ -1,57 +1,36 @@ package com.silverpeas.mobile.server.services; -import java.awt.image.BufferedImage; -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.rmi.RemoteException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -import javax.imageio.ImageIO; - -import com.google.gwt.user.client.Window; +import com.drew.imaging.ImageMetadataReader; +import com.drew.metadata.Directory; +import com.drew.metadata.Metadata; +import com.drew.metadata.exif.ExifIFD0Directory; +import com.silverpeas.admin.ejb.AdminBusiness; import com.silverpeas.comment.service.CommentServiceFactory; import com.silverpeas.gallery.constant.MediaResolution; import com.silverpeas.gallery.constant.MediaType; +import com.silverpeas.gallery.control.ejb.GalleryBm; import com.silverpeas.gallery.delegate.MediaDataCreateDelegate; +import com.silverpeas.gallery.model.AlbumDetail; import com.silverpeas.gallery.model.Media; import com.silverpeas.gallery.model.MediaCriteria; import com.silverpeas.gallery.model.MediaPK; import com.silverpeas.gallery.model.Photo; -import com.silverpeas.mobile.shared.dto.BaseDTO; -import com.silverpeas.mobile.shared.dto.media.MediaDTO; -import com.silverpeas.mobile.shared.dto.media.SoundDTO; -import com.silverpeas.mobile.shared.exceptions.MediaException; -import com.silverpeas.mobile.shared.services.ServiceMedia; -import com.stratelia.webactiv.util.node.model.NodePK; -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.fileupload.FileItem; - -import com.drew.imaging.ImageMetadataReader; -import com.drew.metadata.Directory; -import com.drew.metadata.Metadata; -import com.drew.metadata.exif.ExifIFD0Directory; -import com.silverpeas.admin.ejb.AdminBusiness; -import com.silverpeas.gallery.control.ejb.GalleryBm; -import com.silverpeas.gallery.model.AlbumDetail; +import com.silverpeas.gallery.model.Video; import com.silverpeas.mobile.server.common.LocalDiskFileItem; import com.silverpeas.mobile.server.common.SpMobileLogModule; +import com.silverpeas.mobile.server.config.Configurator; import com.silverpeas.mobile.server.helpers.RotationSupport; +import com.silverpeas.mobile.server.servlets.EasySSLProtocolSocketFactory; +import com.silverpeas.mobile.shared.dto.BaseDTO; import com.silverpeas.mobile.shared.dto.media.AlbumDTO; +import com.silverpeas.mobile.shared.dto.media.MediaDTO; import com.silverpeas.mobile.shared.dto.media.PhotoDTO; +import com.silverpeas.mobile.shared.dto.media.SoundDTO; +import com.silverpeas.mobile.shared.dto.media.VideoDTO; import com.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; import com.silverpeas.mobile.shared.exceptions.AuthenticationException; +import com.silverpeas.mobile.shared.exceptions.MediaException; +import com.silverpeas.mobile.shared.services.ServiceMedia; import com.silverpeas.util.StringUtil; import com.stratelia.silverpeas.silvertrace.SilverTrace; import com.stratelia.webactiv.beans.admin.ComponentInstLight; @@ -60,8 +39,33 @@ import com.stratelia.webactiv.util.FileRepositoryManager; import com.stratelia.webactiv.util.JNDINames; import com.stratelia.webactiv.util.ResourceLocator; +import com.stratelia.webactiv.util.node.model.NodePK; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpMethod; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.protocol.Protocol; import org.silverpeas.file.SilverpeasFile; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.Iterator; +import java.util.List; + /** * Service de gestion des galleries d'images. * @author svuillet @@ -103,8 +107,6 @@ public void uploadPicture(String name, String data, String idGallery, String idA String filename = tempDir + File.separator + name + "." + extension; OutputStream outputStream = new FileOutputStream(filename); - // TODO : When Silverpeas support extended exif metadata : preserve Exif metadata (rotate remove exif metadata) - ImageIO.write(bi, extension, outputStream); outputStream.close(); @@ -129,7 +131,7 @@ public void uploadPicture(String name, String data, String idGallery, String idA file.delete(); } catch (Exception e) { - SilverTrace.error(SpMobileLogModule.getName(), "ServiceGalleryImpl.uploadPicture", "root.EX_NO_MESSAGE", e); + SilverTrace.error(SpMobileLogModule.getName(), "ServiceMediaImpl.uploadPicture", "root.EX_NO_MESSAGE", e); } } @@ -173,7 +175,7 @@ public List getAllGalleries() throws MediaException, Aut } } } catch (Exception e) { - SilverTrace.error(SpMobileLogModule.getName(), "ServiceGalleryImpl.getAllGalleries", "root.EX_NO_MESSAGE", e); + SilverTrace.error(SpMobileLogModule.getName(), "ServiceMediaImpl.getAllGalleries", "root.EX_NO_MESSAGE", e); } Collections.sort(results); @@ -207,7 +209,7 @@ private List getAlbums(String instanceId, String rootAlbumId) throws M } } } catch (Exception e) { - SilverTrace.error(SpMobileLogModule.getName(), "ServiceGalleryImpl.getAlbums", "root.EX_NO_MESSAGE", e); + SilverTrace.error(SpMobileLogModule.getName(), "ServiceMediaImpl.getAlbums", "root.EX_NO_MESSAGE", e); throw new MediaException(e); } return results; @@ -258,14 +260,15 @@ private List getMedias(String instanceId, String albumId) throws Media } else if (media.getType().isStreaming()) { //TODO } else if (media.getType().isVideo()) { - //TODO + VideoDTO video = getVideo(media); + results.add(video); } } return results; } catch (Exception e) { - SilverTrace.error(SpMobileLogModule.getName(), "ServiceGalleryImpl.getAllMedias", "root.EX_NO_MESSAGE", e); + SilverTrace.error(SpMobileLogModule.getName(), "ServiceMediaImpl.getAllMedias", "root.EX_NO_MESSAGE", e); throw new MediaException(e); } } @@ -293,11 +296,34 @@ public PhotoDTO getOriginalPicture(String instanceId, String pictureId) throws M } } catch (Exception e) { - SilverTrace.error(SpMobileLogModule.getName(), "ServiceGalleryImpl.getOriginalPicture", "root.EX_NO_MESSAGE", e); + SilverTrace.error(SpMobileLogModule.getName(), "ServiceMediaImpl.getOriginalPicture", "root.EX_NO_MESSAGE", e); } return picture; } + public SoundDTO getSound(String instanceId, String soundId) throws MediaException, AuthenticationException { + checkUserInSession(); + Media sound = null; + try { + sound = getGalleryBm().getMedia(new MediaPK(soundId)); + } catch (Exception e) { + SilverTrace.error(SpMobileLogModule.getName(), "ServiceMediaImpl.getSound", "root.EX_NO_MESSAGE", e); + } + return getSound(sound); + } + + @Override + public VideoDTO getVideo(final String instanceId, final String videoId) throws MediaException, AuthenticationException { + checkUserInSession(); + Media video = null; + try { + video = getGalleryBm().getMedia(new MediaPK(videoId)); + } catch (Exception e) { + SilverTrace.error(SpMobileLogModule.getName(), "ServiceMediaImpl.getSound", "root.EX_NO_MESSAGE", e); + } + return getVideo(video); + } + /** * Retourne la photo preview. */ @@ -308,18 +334,138 @@ public PhotoDTO getPreviewPicture(String instanceId, String pictureId) throws Me try { picture = getPhoto(instanceId, pictureId, MediaResolution.PREVIEW); } catch (Exception e) { - SilverTrace.error(SpMobileLogModule.getName(), "ServiceGalleryImpl.getPreviewPicture", "root.EX_NO_MESSAGE", e); + SilverTrace.error(SpMobileLogModule.getName(), "ServiceMediaImpl.getPreviewPicture", "root.EX_NO_MESSAGE", e); } return picture; } + private VideoDTO getVideo(Media media) { + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); + + long d = media.getVideo().getDuration() / 1000; + Date duration = new Date(d*1000); + SimpleDateFormat durationFormat = new SimpleDateFormat("HH:mm:ss"); + if (d < (60 * 59)) { + durationFormat = new SimpleDateFormat("mm:ss"); + } else if (d < 59) { + durationFormat = new SimpleDateFormat("ss"); + } + + VideoDTO video = new VideoDTO(); + video.setName(media.getName()); + video.setTitle(media.getTitle()); + video.setId(media.getId()); + video.setMimeType(media.getType().getMediaWebUriPart()); + video.setInstance(media.getInstanceId()); + video.setDownload(media.getVideo().isDownloadAuthorized()); + video.setSize(media.getVideo().getFileSize()); + video.setDuration(durationFormat.format(duration)); + if (media.getLastUpdater() != null) { + video.setUpdater(media.getLastUpdaterName()); + } else { + video.setUpdater(media.getCreatorName()); + } + if (media.getLastUpdateDate() != null) { + video.setUpdateDate(sdf.format(media.getLastUpdateDate())); + } else { + video.setUpdateDate(sdf.format(media.getCreationDate())); + } + + video.setDataPoster( getVideoPoster(media.getVideo())); + + return video; + } + + private String getVideoPoster(Video video) { + long t = video.getDuration() / 2000; + String url = "http://" + Configurator.getConfigValue("localhost") + ":" + Configurator.getConfigValue("jboss.http.port") + "/silverpeas/services/gallery/" + video.getInstanceId() + "/videos/" + video.getId() + "/thumbnail/" + t; + String data = ""; + InputStream input = null; + String token = organizationController.getUserFull(getUserInSession().getId()).getToken(); + + try { + Protocol + .registerProtocol("https", new Protocol("https", new EasySSLProtocolSocketFactory(), 443)); + + HttpClient client = new HttpClient(); + HttpMethod method = new GetMethod(url); + method.addRequestHeader("X-Silverpeas-Session", token); + client.executeMethod(method); + input = method.getResponseBodyAsStream(); + byte[] binaryData = getBytesFromInputStream(input); + data = "data:" + method.getResponseHeader("Content-Type").getValue() + ";base64," + new String(Base64.encodeBase64(binaryData)); + method.releaseConnection(); + + } catch (IOException e) { + SilverTrace.error(SpMobileLogModule.getName(), "ServiceMediaImpl.getVideoPoster", "root.EX_NO_MESSAGE", e); + } + return data; + } + + private byte[] getBytesFromInputStream(InputStream inStream) + throws IOException { + + // Get the size of the file + long streamLength = inStream.available(); + + if (streamLength > Integer.MAX_VALUE) { + // File is too large + } + + // Create the byte array to hold the data + byte[] bytes = new byte[(int) streamLength]; + + // Read in the bytes + int offset = 0; + int numRead = 0; + while (offset < bytes.length + && (numRead = inStream.read(bytes, + offset, bytes.length - offset)) >= 0) { + offset += numRead; + } + + // Ensure all the bytes have been read in + if (offset < bytes.length) { + throw new IOException("Could not completely read file "); + } + + // Close the input stream and return bytes + inStream.close(); + return bytes; + } + private SoundDTO getSound(Media media) { + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); + + long d = media.getSound().getDuration() / 1000; + Date duration = new Date(d*1000); + SimpleDateFormat durationFormat = new SimpleDateFormat("HH:mm:ss"); + if (d < (60 * 59)) { + durationFormat = new SimpleDateFormat("mm:ss"); + } else if (d < 59) { + durationFormat = new SimpleDateFormat("ss"); + } + SoundDTO sound = new SoundDTO(); sound.setName(media.getName()); sound.setTitle(media.getTitle()); sound.setId(media.getId()); sound.setMimeType(media.getType().getMediaWebUriPart()); sound.setInstance(media.getInstanceId()); + sound.setDownload(media.getSound().isDownloadAuthorized()); + sound.setSize(media.getSound().getFileSize()); + sound.setDuration(durationFormat.format(duration)); + if (media.getLastUpdater() != null) { + sound.setUpdater(media.getLastUpdaterName()); + } else { + sound.setUpdater(media.getCreatorName()); + } + if (media.getLastUpdateDate() != null) { + sound.setUpdateDate(sdf.format(media.getLastUpdateDate())); + } else { + sound.setUpdateDate(sdf.format(media.getCreationDate())); + } + return sound; } diff --git a/web/src/main/java/com/silverpeas/mobile/server/services/ServiceSearchImpl.java b/web/src/main/java/com/silverpeas/mobile/server/services/ServiceSearchImpl.java index d0b34cf2c..316f0f842 100644 --- a/web/src/main/java/com/silverpeas/mobile/server/services/ServiceSearchImpl.java +++ b/web/src/main/java/com/silverpeas/mobile/server/services/ServiceSearchImpl.java @@ -47,7 +47,7 @@ public List search(final String query) throws SearchException, Authen PlainSearchResult r = SearchEngineFactory.getSearchEngine().search(q); for (MatchingIndexEntry result : r.getEntries()) { - if (result.getObjectType().equals(ContentsTypes.Photo.toString()) || result.getObjectType().equals(ContentsTypes.Publication.toString()) || result.getObjectType().contains(ContentsTypes.Attachment.toString())) { + if (result.getObjectType().equals(ContentsTypes.Photo.toString()) || result.getObjectType().equals(ContentsTypes.Sound.toString()) || result.getObjectType().equals(ContentsTypes.Video.toString()) || result.getObjectType().equals(ContentsTypes.Publication.toString()) || result.getObjectType().contains(ContentsTypes.Attachment.toString())) { String title = result.getTitle(getUserInSession().getUserPreferences().getLanguage()); if (title != null && title.contains("wysiwyg") == false) { ResultDTO entry = new ResultDTO(); diff --git a/web/src/main/java/com/silverpeas/mobile/server/servlets/VideoServlet.java b/web/src/main/java/com/silverpeas/mobile/server/servlets/VideoServlet.java new file mode 100644 index 000000000..bd5a24027 --- /dev/null +++ b/web/src/main/java/com/silverpeas/mobile/server/servlets/VideoServlet.java @@ -0,0 +1,85 @@ +package com.silverpeas.mobile.server.servlets; + +import com.silverpeas.mobile.server.config.Configurator; +import com.silverpeas.mobile.server.services.AbstractAuthenticateService; +import com.silverpeas.mobile.shared.exceptions.AuthenticationException; +import com.stratelia.webactiv.beans.admin.OrganizationController; +import com.stratelia.webactiv.beans.admin.UserFull; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpMethod; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.protocol.Protocol; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +@SuppressWarnings("serial") +public class VideoServlet extends HttpServlet { + + private OrganizationController organizationController = new OrganizationController(); + + protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String id = request.getParameter("id"); + String instanceId = request.getParameter("instanceId"); + String userId = request.getParameter("userId"); + UserFull userF = organizationController.getUserFull(userId); + + // call web service localy on http + String url = "http://" + Configurator.getConfigValue("localhost") + ":" + Configurator.getConfigValue("jboss.http.port"); + url = url + "/silverpeas/services/gallery/" + instanceId + "/videos/" + id + "/content"; + + getFile(url, response, userF.getToken()); + + ((OutputStream) response.getOutputStream()).flush(); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + try { + checkUserInSession(request); + processRequest(request, response); + } catch (Exception e) { + e.printStackTrace(); + } + } + + protected void checkUserInSession(HttpServletRequest request) throws AuthenticationException { + if (request.getSession().getAttribute(AbstractAuthenticateService.USER_ATTRIBUT_NAME) == null) { + throw new AuthenticationException(AuthenticationException.AuthenticationError.NotAuthenticate); + } + } + + public static void getFile(String host, HttpServletResponse response, String token) { + InputStream input = null; + + try { + + Protocol.registerProtocol("https", new Protocol("https", new EasySSLProtocolSocketFactory(), 443)); + + HttpClient client = new HttpClient(); + HttpMethod method = new GetMethod(host); + method.addRequestHeader("X-Silverpeas-Session", token); + + client.executeMethod(method); + + input = method.getResponseBodyAsStream(); + response.setContentType(method.getResponseHeader("Content-Type").getValue()); + response.setHeader("content-disposition", method.getResponseHeader("content-disposition").getValue()); + + byte[] buffer = new byte[1024]; + int read; + while ((read = input.read(buffer)) > 0) { + ((OutputStream) response.getOutputStream()).write(buffer, 0, read); + } + response.setContentLength(Integer.parseInt(method.getResponseHeader("Content-Length").getValue())); + method.releaseConnection(); + } catch (IOException e) { + System.out.println("Error while trying to download the file."); + e.printStackTrace(); + } + } +} diff --git a/web/src/main/java/com/silverpeas/mobile/shared/dto/ContentsTypes.java b/web/src/main/java/com/silverpeas/mobile/shared/dto/ContentsTypes.java index fa17bbf27..c860d24d4 100644 --- a/web/src/main/java/com/silverpeas/mobile/shared/dto/ContentsTypes.java +++ b/web/src/main/java/com/silverpeas/mobile/shared/dto/ContentsTypes.java @@ -1,5 +1,5 @@ package com.silverpeas.mobile.shared.dto; public enum ContentsTypes { - Publication, Photo, Media, Attachment; + Publication, Photo, Media, Sound, Video, Attachment; } diff --git a/web/src/main/java/com/silverpeas/mobile/shared/dto/comments/CommentDTO.java b/web/src/main/java/com/silverpeas/mobile/shared/dto/comments/CommentDTO.java index 81a65a63b..f28023235 100644 --- a/web/src/main/java/com/silverpeas/mobile/shared/dto/comments/CommentDTO.java +++ b/web/src/main/java/com/silverpeas/mobile/shared/dto/comments/CommentDTO.java @@ -10,7 +10,8 @@ public class CommentDTO extends BaseDTO implements Serializable { public final static String TYPE_PUBLICATION = "Publication"; - public final static String TYPE_MEDIA = "Photo"; + public final static String TYPE_PHOTO = "Photo"; + public final static String TYPE_SOUND = "Sound"; private String content; private String avatar; diff --git a/web/src/main/java/com/silverpeas/mobile/shared/dto/media/MediaDTO.java b/web/src/main/java/com/silverpeas/mobile/shared/dto/media/MediaDTO.java index 564b38cab..2fe6d013d 100644 --- a/web/src/main/java/com/silverpeas/mobile/shared/dto/media/MediaDTO.java +++ b/web/src/main/java/com/silverpeas/mobile/shared/dto/media/MediaDTO.java @@ -15,6 +15,7 @@ public class MediaDTO extends BaseDTO implements Serializable { private int commentsNumber; private String instance; private String mimeType; + private long size; public boolean isDownload() { return download; @@ -75,4 +76,12 @@ public String getMimeType() { public void setMimeType(final String mimeType) { this.mimeType = mimeType; } + + public void setSize(final long size) { + this.size = size; + } + + public long getSize() { + return size; + } } diff --git a/web/src/main/java/com/silverpeas/mobile/shared/dto/media/PhotoDTO.java b/web/src/main/java/com/silverpeas/mobile/shared/dto/media/PhotoDTO.java index 6581a329e..569a00f54 100644 --- a/web/src/main/java/com/silverpeas/mobile/shared/dto/media/PhotoDTO.java +++ b/web/src/main/java/com/silverpeas/mobile/shared/dto/media/PhotoDTO.java @@ -10,7 +10,6 @@ public class PhotoDTO extends MediaDTO implements Serializable { private String dataPhoto; private String format; - private long size; private int sizeH; private int sizeL; @@ -27,14 +26,6 @@ public void setFormat(String format) { this.format = format; } - public void setSize(final long size) { - this.size = size; - } - - public long getSize() { - return size; - } - public void setSizeH(final int sizeH) { this.sizeH = sizeH; } diff --git a/web/src/main/java/com/silverpeas/mobile/shared/dto/media/SoundDTO.java b/web/src/main/java/com/silverpeas/mobile/shared/dto/media/SoundDTO.java index 6733b4549..d7bfc6e37 100644 --- a/web/src/main/java/com/silverpeas/mobile/shared/dto/media/SoundDTO.java +++ b/web/src/main/java/com/silverpeas/mobile/shared/dto/media/SoundDTO.java @@ -4,6 +4,15 @@ public class SoundDTO extends MediaDTO implements Serializable { + private String duration; + private static final long serialVersionUID = 1L; + public String getDuration() { + return duration; + } + + public void setDuration(final String duration) { + this.duration = duration; + } } diff --git a/web/src/main/java/com/silverpeas/mobile/shared/dto/media/VideoDTO.java b/web/src/main/java/com/silverpeas/mobile/shared/dto/media/VideoDTO.java index e8ff9ae60..37fe25426 100644 --- a/web/src/main/java/com/silverpeas/mobile/shared/dto/media/VideoDTO.java +++ b/web/src/main/java/com/silverpeas/mobile/shared/dto/media/VideoDTO.java @@ -4,6 +4,24 @@ public class VideoDTO extends MediaDTO implements Serializable { + private String duration; + private String dataPoster; + private static final long serialVersionUID = 1L; + public String getDuration() { + return duration; + } + + public void setDuration(final String duration) { + this.duration = duration; + } + + public String getDataPoster() { + return dataPoster; + } + + public void setDataPoster(final String dataPoster) { + this.dataPoster = dataPoster; + } } diff --git a/web/src/main/java/com/silverpeas/mobile/shared/services/ServiceMedia.java b/web/src/main/java/com/silverpeas/mobile/shared/services/ServiceMedia.java index 31ee2514d..b4371276a 100644 --- a/web/src/main/java/com/silverpeas/mobile/shared/services/ServiceMedia.java +++ b/web/src/main/java/com/silverpeas/mobile/shared/services/ServiceMedia.java @@ -6,17 +6,22 @@ import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; import com.silverpeas.mobile.shared.dto.BaseDTO; import com.silverpeas.mobile.shared.dto.media.PhotoDTO; +import com.silverpeas.mobile.shared.dto.media.SoundDTO; +import com.silverpeas.mobile.shared.dto.media.VideoDTO; import com.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; import com.silverpeas.mobile.shared.exceptions.AuthenticationException; import com.silverpeas.mobile.shared.exceptions.MediaException; @RemoteServiceRelativePath("Media") public interface ServiceMedia extends RemoteService { - public void uploadPicture(String name, String data, String idGallery, String idAlbum) throws + public void uploadPicture(String name, String data, String idGallery, String idAlbum) throws MediaException, AuthenticationException; - public List getAllGalleries() throws MediaException, AuthenticationException; - public List getAlbumsAndPictures(String instanceId, String albumId) throws + public List getAllGalleries() throws MediaException, AuthenticationException; + public List getAlbumsAndPictures(String instanceId, String albumId) throws MediaException, AuthenticationException; - public PhotoDTO getOriginalPicture(String instanceId, String pictureId) throws MediaException, AuthenticationException; - public PhotoDTO getPreviewPicture(String instanceId, String pictureId) throws MediaException, AuthenticationException; + public PhotoDTO getOriginalPicture(String instanceId, String pictureId) throws MediaException, AuthenticationException; + public PhotoDTO getPreviewPicture(String instanceId, String pictureId) throws MediaException, AuthenticationException; + + public SoundDTO getSound(String instanceId, String soundId) throws MediaException, AuthenticationException; + public VideoDTO getVideo(String instanceId, String videoId) throws MediaException, AuthenticationException; } diff --git a/web/src/main/java/com/silverpeas/mobile/shared/services/ServiceMediaAsync.java b/web/src/main/java/com/silverpeas/mobile/shared/services/ServiceMediaAsync.java index 8ca983861..98703d828 100644 --- a/web/src/main/java/com/silverpeas/mobile/shared/services/ServiceMediaAsync.java +++ b/web/src/main/java/com/silverpeas/mobile/shared/services/ServiceMediaAsync.java @@ -5,6 +5,8 @@ import com.google.gwt.user.client.rpc.AsyncCallback; import com.silverpeas.mobile.shared.dto.BaseDTO; import com.silverpeas.mobile.shared.dto.media.PhotoDTO; +import com.silverpeas.mobile.shared.dto.media.SoundDTO; +import com.silverpeas.mobile.shared.dto.media.VideoDTO; import com.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO; public interface ServiceMediaAsync { @@ -19,4 +21,8 @@ public interface ServiceMediaAsync { void getAlbumsAndPictures(String instanceId, String albumId, final AsyncCallback> async); + + void getSound(String instanceId, String soundId, final AsyncCallback async); + + void getVideo(String instanceId, String videoId, final AsyncCallback async); } diff --git a/web/src/main/webapp/WEB-INF/web.xml b/web/src/main/webapp/WEB-INF/web.xml index 97b8fba56..8ac114c7b 100644 --- a/web/src/main/webapp/WEB-INF/web.xml +++ b/web/src/main/webapp/WEB-INF/web.xml @@ -152,6 +152,16 @@ /spmobil/SoundAction + + VideoServlet + com.silverpeas.mobile.server.servlets.VideoServlet + + + + VideoServlet + /spmobil/VideoAction + +