Using new media model

This commit is contained in:
Steffen Schaefer committed 2015-06-09 12:39:08 +02:00
1 parent 9ed8dc8395
commit dc87e7bbf3
3 files changed
+70 -105

No files matched your search

@@ -14,9 +14,6 @@ import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;
@@ -43,7 +40,6 @@ import com.sap.sailing.gwt.ui.shared.general.EventMetadataDTO;
import com.sap.sailing.gwt.ui.shared.general.EventReferenceDTO;
import com.sap.sailing.gwt.ui.shared.general.EventState;
import com.sap.sailing.gwt.ui.shared.media.MediaDTO;
import com.sap.sailing.gwt.ui.shared.media.MediaUtils;
import com.sap.sailing.gwt.ui.shared.media.SailingImageDTO;
import com.sap.sailing.gwt.ui.shared.media.SailingVideoDTO;
import com.sap.sailing.gwt.ui.shared.start.EventStageDTO;
@@ -57,9 +53,10 @@ import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.common.impl.TimeRangeImpl;
import com.sap.sse.common.media.ImageSize;
import com.sap.sse.common.media.ImageDescriptor;
import com.sap.sse.common.media.MediaType;
import com.sap.sse.common.media.MimeType;
import com.sap.sse.common.media.VideoDescriptor;
import com.sap.sse.util.ServiceTrackerFactory;
/**
@@ -93,7 +90,6 @@ public class HomeServiceImpl extends ProxiedRemoteServiceServlet implements Home
}
private static final long serialVersionUID = 3947782997746039939L;
private static final Logger logger = Logger.getLogger(HomeServiceImpl.class.getName());
private static final int MAX_STAGE_EVENTS = 5;
private static final int MAX_RECENT_EVENTS = 3;
@@ -183,14 +179,14 @@ public class HomeServiceImpl extends ProxiedRemoteServiceServlet implements Home
EventReferenceDTO eventRef = new EventReferenceDTO(holder.event);
Iterable<URL> videosOfEvent = holder.event.getVideoURLs();
Iterable<VideoDescriptor> videosOfEvent = holder.event.getVideos();
if (!Util.isEmpty(videosOfEvent) && result.getVideos().size() < MAX_VIDEO_COUNT) {
URL youTubeRandomUrl = HomeServiceUtil.getRandomURL(videosOfEvent);
VideoDescriptor youTubeRandomUrl = HomeServiceUtil.getRandomVideo(videosOfEvent);
MimeType type = MediaUtils.detectMimeTypeFromUrl(youTubeRandomUrl.toString());
MimeType type = youTubeRandomUrl.getMimeType();
if (type.mediaType == MediaType.video) {
SailingVideoDTO candidate = new SailingVideoDTO(eventRef, youTubeRandomUrl.toString(), type, //
holder.event.getEndDate().asDate() // FIXME: using event enddate for now
SailingVideoDTO candidate = new SailingVideoDTO(eventRef, youTubeRandomUrl.getURL().toString(), type, //
youTubeRandomUrl.getCreatedAtDate().asDate()
);
candidate.setTitle(holder.event.getName());
result.addVideo(candidate);
@@ -217,25 +213,18 @@ public class HomeServiceImpl extends ProxiedRemoteServiceServlet implements Home
EventBase event = holder.event;
EventReferenceDTO eventRef = new EventReferenceDTO(holder.event);
for (URL url : HomeServiceUtil.getSailingLovesPhotographyImages(event)) {
try {
ImageSize imageSize = event.getImageSize(url);
if(imageSize != null) {
SailingImageDTO sailingImageDTO = new SailingImageDTO(eventRef, url.toString(), null);
if (imageSize != null) {
sailingImageDTO.setSizeInPx(imageSize.getWidth(), imageSize.getHeight());
photoGalleryUrls.add(sailingImageDTO);
}
}
} catch (Exception e) {
for (ImageDescriptor url : HomeServiceUtil.getSailingLovesPhotographyImages(event)) {
if(url.getWidthInPx() != null && url.getHeightInPx() != null) {
SailingImageDTO sailingImageDTO = new SailingImageDTO(eventRef, url.getURL().toString(), null);
sailingImageDTO.setSizeInPx(url.getWidthInPx(), url.getHeightInPx());
photoGalleryUrls.add(sailingImageDTO);
}
}
for (URL videoUrl : event.getVideoURLs()) {
MimeType type = MediaUtils.detectMimeTypeFromUrl(videoUrl.toString());
for (VideoDescriptor videoUrl : event.getVideos()) {
MimeType type =videoUrl.getMimeType();
if (type.mediaType == MediaType.video) {
SailingVideoDTO candidate = new SailingVideoDTO(eventRef, videoUrl.toString(), type, //
holder.event.getEndDate().asDate() // FIXME: using event enddate for now
SailingVideoDTO candidate = new SailingVideoDTO(eventRef, videoUrl.getURL().toString(), type, //
videoUrl.getCreatedAtDate().asDate()
);
candidate.setTitle(holder.event.getName());
videoCandidates.add(candidate);
@@ -428,27 +417,20 @@ public class HomeServiceImpl extends ProxiedRemoteServiceServlet implements Home
EventReferenceDTO eventRef = new EventReferenceDTO(event);
String eventName = event.getName();
// TODO implement correctly and fill metadata
MediaDTO media = new MediaDTO();
for(URL url : HomeServiceUtil.getPhotoGalleryImageURLs(event)) {
ImageSize imageSize = null;
try {
imageSize = event.getImageSize(url);
} catch (InterruptedException | ExecutionException e) {
logger.log(Level.FINE, "Was unable to obtain image size for "+url+" earlier.", e);
}
// FIXME: using the event end date for 'createdAtDate' for now, we need a better solution for migration
SailingImageDTO entry = new SailingImageDTO(eventRef, url.toString(), event.getEndDate().asDate());
if (imageSize != null) {
entry.setSizeInPx(imageSize.getWidth(), imageSize.getHeight());
}
entry.setTitle(eventName);
for(ImageDescriptor image : HomeServiceUtil.getPhotoGalleryImages(event)) {
SailingImageDTO entry = new SailingImageDTO(eventRef, image.getURL().toString(), image.getCreatedAtDate().asDate());
entry.setSizeInPx(image.getWidthInPx(), image.getHeightInPx());
entry.setTitle(image.getTitle() != null ? image.getTitle(): eventName);
entry.setSubtitle(image.getSubtitle());
entry.setTags(image.getTags());
entry.setCopyright(image.getCopyright());
media.addPhoto(entry);
}
for(URL url : event.getVideoURLs()) {
MimeType type = MediaUtils.detectMimeTypeFromUrl(url.toString());
for(VideoDescriptor url : event.getVideos()) {
MimeType type = url.getMimeType();
if (type.mediaType == MediaType.video) {
SailingVideoDTO candidate = new SailingVideoDTO(eventRef, url.toString(), type, null);
SailingVideoDTO candidate = new SailingVideoDTO(eventRef, url.getURL().toString(), type, null);
media.addVideo(candidate);
}
}
@@ -1,6 +1,5 @@
package com.sap.sailing.gwt.server;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
@@ -27,7 +26,6 @@ import com.sap.sailing.gwt.ui.shared.general.EventState;
import com.sap.sailing.gwt.ui.shared.media.MediaConstants;
import com.sap.sse.common.Util;
import com.sap.sse.common.media.ImageDescriptor;
import com.sap.sse.common.media.ImageSize;
import com.sap.sse.common.media.MediaDescriptor;
import com.sap.sse.common.media.MimeType;
import com.sap.sse.common.media.VideoDescriptor;
@@ -37,12 +35,10 @@ public final class HomeServiceUtil {
}
private static final int MINIMUM_IMAGE_HEIGHT_FOR_SAILING_PHOTOGRAPHY_IN_PIXELS = 500;
private static final String STAGE_IMAGE_URL_SUBSTRING_INDICATOR_CASE_INSENSITIVE = "stage";
private static final String THUMBNAIL_IMAGE_URL_SUBSTRING_INDICATOR_CASE_INSENSITIVE = "eventteaser";
public static String findEventThumbnailImageUrlAsString(EventBase event) {
URL url = findEventThumbnailImageUrl(event);
return url == null ? null : url.toString();
ImageDescriptor url = findEventThumbnailImage(event);
return url == null ? null : url.getURL().toString();
}
public static boolean isFakeSeries(EventBase event) {
@@ -104,47 +100,43 @@ public final class HomeServiceUtil {
return EventState.RUNNING;
}
private static URL findEventThumbnailImageUrl(EventBase event) {
private static ImageDescriptor findEventThumbnailImage(EventBase event) {
final class ImageHolder {
final int PERFECT_HEIGHT = 240;
final int PERFECT_WIDTH = 370;
final double PERFECT_RATIO = PERFECT_HEIGHT / (double) PERFECT_WIDTH;
final URL url;
final int height;
final int width;
final int size;
final double ratio;
final ImageDescriptor image;
final boolean stage;
ImageHolder() {
this(null, null);
this(null);
}
ImageHolder(URL url, ImageSize imageSize) {
this(url, imageSize == null ? -1 : imageSize.getWidth(), imageSize == null ? -1 : imageSize.getHeight());
}
ImageHolder(URL url, int width, int height) {
this.url = url;
this.height = height;
this.width = width;
if(width == -1 || height == -1) {
this.size = -1;
ImageHolder(ImageDescriptor image) {
this.image = image;
this.stage = image == null ? false : hasTag(image, MediaConstants.STAGE);
this.height = image == null || image.getHeightInPx() == null ? 0 : image.getHeightInPx();
this.width = image == null || image.getWidthInPx() == null ? 0 : image.getWidthInPx();
this.size = height * width;
if(width == 0) {
this.ratio = -1;
} else {
this.size = height * width;
this.ratio = height / (double) width;
}
}
boolean isBetterWorstcaseThan(ImageHolder otherImageHolder) {
if (isNull()) {
return false;
}
if (this.url != null && url.toString().contains(STAGE_IMAGE_URL_SUBSTRING_INDICATOR_CASE_INSENSITIVE)) {
if (stage) {
return false;
}
@@ -179,13 +171,13 @@ public final class HomeServiceUtil {
}
boolean isNull() {
return size == -1;
return image == null;
}
}
// search for name pattern
for (URL imageUrl : event.getImageURLs()) {
if (imageUrl.toString().toLowerCase().contains(THUMBNAIL_IMAGE_URL_SUBSTRING_INDICATOR_CASE_INSENSITIVE)) {
for (ImageDescriptor imageUrl : event.getImages()) {
if (hasTag(imageUrl, MediaConstants.TEASER)) {
return imageUrl;
}
}
@@ -193,16 +185,11 @@ public final class HomeServiceUtil {
ImageHolder actualWorstcase = new ImageHolder();
ImageHolder bestFit = new ImageHolder();
for (URL candidateImageUrl : getPhotoGalleryImageURLs(event)) {
ImageHolder candidate;
try {
candidate = new ImageHolder(candidateImageUrl, event.getImageSize(candidateImageUrl));
} catch (Exception e) {
candidate = new ImageHolder(candidateImageUrl, -1, -1);
}
for (ImageDescriptor candidateImage : getPhotoGalleryImages(event)) {
ImageHolder candidate = new ImageHolder(candidateImage);
if (candidate.isPerfectFit()) {
return candidate.url;
return candidate.image;
}
if (candidate.fitsRatio() && candidate.isBigEnough()) {
@@ -218,10 +205,10 @@ public final class HomeServiceUtil {
}
if (!bestFit.isNull()) {
return bestFit.url;
return bestFit.image;
}
if (!actualWorstcase.isNull()) {
return actualWorstcase.url;
return actualWorstcase.image;
}
return null;
}
@@ -296,44 +283,38 @@ public final class HomeServiceUtil {
}
public static List<String> getPhotoGalleryImageURLsAsString(EventBase event) {
List<URL> urls = getPhotoGalleryImageURLs(event);
List<ImageDescriptor> urls = getPhotoGalleryImages(event);
List<String> result = new ArrayList<String>(urls.size());
for (URL url : urls) {
result.add(url.toString());
for (ImageDescriptor url : urls) {
result.add(url.getURL().toString());
}
return result;
}
public static List<URL> getPhotoGalleryImageURLs(EventBase event) {
public static List<ImageDescriptor> getPhotoGalleryImages(EventBase event) {
ImageDescriptor stageImage = getStageImage(event); // if set, exclude stage image from photo gallery
URL stageImageURL = stageImage == null ? null : stageImage.getURL();
List<URL> result = new ArrayList<>();
Iterable<URL> imageURLs = event.getImageURLs();
List<ImageDescriptor> result = new ArrayList<>();
Iterable<ImageDescriptor> imageURLs = event.getImages();
boolean first = true;
for (Iterator<URL> iter = imageURLs.iterator(); iter.hasNext(); ) {
URL imageUrl = iter.next();
if(imageUrl.toString().toLowerCase().contains(THUMBNAIL_IMAGE_URL_SUBSTRING_INDICATOR_CASE_INSENSITIVE)) {
for (Iterator<ImageDescriptor> iter = imageURLs.iterator(); iter.hasNext(); ) {
ImageDescriptor image = iter.next();
if(hasTag(image, MediaConstants.TEASER)) {
continue;
}
if ((first && !iter.hasNext()) || !Util.equalsWithNull(imageUrl, stageImageURL)) {
result.add(imageUrl);
if ((first && !iter.hasNext()) || !Util.equalsWithNull(image, stageImage)) {
result.add(image);
}
first = false;
}
return result;
}
public static List<URL> getSailingLovesPhotographyImages(EventBase event) {
final List<URL> acceptedImages = new LinkedList<>();
for (URL candidateImageUrl : event.getImageURLs()) {
try {
ImageSize imageSize = event.getImageSize(candidateImageUrl);
if (imageSize != null && imageSize.getHeight() > MINIMUM_IMAGE_HEIGHT_FOR_SAILING_PHOTOGRAPHY_IN_PIXELS) {
acceptedImages.add(candidateImageUrl);
}
} catch (Exception e) {
// TODO what should we do here?
public static List<ImageDescriptor> getSailingLovesPhotographyImages(EventBase event) {
final List<ImageDescriptor> acceptedImages = new LinkedList<>();
for (ImageDescriptor candidateImageUrl : event.getImages()) {
if (candidateImageUrl.getWidthInPx() != null && candidateImageUrl.getHeightInPx() != null && candidateImageUrl.getHeightInPx() > MINIMUM_IMAGE_HEIGHT_FOR_SAILING_PHOTOGRAPHY_IN_PIXELS) {
acceptedImages.add(candidateImageUrl);
}
}
return acceptedImages;
@@ -396,7 +377,7 @@ public final class HomeServiceUtil {
}
public static boolean hasVideos(Event event) {
return !Util.isEmpty(event.getVideoURLs());
return !Util.isEmpty(event.getVideos());
}
public static boolean isPartOfEvent(Event event, Regatta regattaEntity) {
@@ -408,7 +389,7 @@ public final class HomeServiceUtil {
return false;
}
public static URL getRandomURL(Iterable<URL> urls) {
public static VideoDescriptor getRandomVideo(Iterable<VideoDescriptor> urls) {
if(Util.isEmpty(urls)) {
return null;
}
@@ -76,8 +76,10 @@ public abstract class AbstractMediaDTO implements IsSerializable {
return tags;
}
public void setTags(List<String> tags) {
this.tags = tags;
public void setTags(Iterable<String> tags) {
for(String tag: tags) {
this.tags.add(tag);
}
}
public String getSourceRef() {