diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BranchIOConstants.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BranchIOConstants.java index 66a1686828b..c8bfdb36e06 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BranchIOConstants.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BranchIOConstants.java @@ -1,14 +1,17 @@ package com.sap.sailing.domain.common; public class BranchIOConstants { - public static final String SAILINSIGHT_2_APP_BRANCHIO = "https://sailinsight20-app.sapsailing.com/invite"; public static final String SAILINSIGHT_APP_BRANCHIO = "https://sailinsight-app.sapsailing.com/invite"; + public static final String SAILINSIGHT_2_APP_BRANCHIO = "https://sailinsight20-app.sapsailing.com/invite"; + public static final String SAILINSIGHT_3_APP_BRANCHIO = "https://sailinsight30-app.sapsailing.com/invite"; public static final String SAILINSIGHT_APP_BRANCHIO_PATH = "checkinUrl"; public static final String BUOYPINGER_APP_BRANCHIO = "https://buoypinger-app.sapsailing.com/invite"; public static final String BUOYPINGER_APP_BRANCHIO_PATH = "checkinUrl"; public static final String OPEN_REGATTA_2_APP_BRANCHIO = "https://sailinsight20-app.sapsailing.com/publicInvite"; public static final String OPEN_REGATTA_2_APP_BRANCHIO_PATH = "checkinUrl"; + public static final String OPEN_REGATTA_3_APP_BRANCHIO = "https://sailinsight30-app.sapsailing.com/publicInvite"; + public static final String OPEN_REGATTA_3_APP_BRANCHIO_PATH = "checkinUrl"; private BranchIOConstants() { - }; + } } diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/MailInvitationType.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/MailInvitationType.java index 990c29d9ffb..555332fb6db 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/MailInvitationType.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/MailInvitationType.java @@ -3,7 +3,8 @@ package com.sap.sailing.domain.common; public enum MailInvitationType { LEGACY, SailInsight1, - SailInsight2; + SailInsight2, + SailInsight3; public static final String SYSTEM_PROPERTY_NAME = "com.sap.sailing.domain.tracking.MailInvitationType"; } \ No newline at end of file diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index 10db64a7320..54f60e57ff2 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -1159,6 +1159,11 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { UUID id = (UUID) eventDBObject.get(FieldNames.EVENT_ID.name()); TimePoint startDate = loadTimePoint(eventDBObject, FieldNames.EVENT_START_DATE); TimePoint endDate = loadTimePoint(eventDBObject, FieldNames.EVENT_END_DATE); + if (endDate.before(startDate)) { + logger.warning("End date "+endDate+" of event "+name+" with ID "+id+" is before its start date "+ + startDate+"; adjusting such that end date equals start date."); + endDate = startDate; + } boolean isPublic = eventDBObject.get(FieldNames.EVENT_IS_PUBLIC.name()) != null ? (Boolean) eventDBObject.get(FieldNames.EVENT_IS_PUBLIC.name()) : false; Venue venue = loadVenue((Document) eventDBObject.get(FieldNames.VENUE.name())); diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BranchIO2RaceLogTrackingInvitationMailBuilder.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BranchIO2RaceLogTrackingInvitationMailBuilder.java index c102111dab9..a445a6aaa6d 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BranchIO2RaceLogTrackingInvitationMailBuilder.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BranchIO2RaceLogTrackingInvitationMailBuilder.java @@ -5,7 +5,6 @@ import java.util.Locale; import com.sap.sailing.domain.common.BranchIOConstants; public class BranchIO2RaceLogTrackingInvitationMailBuilder extends BranchIORaceLogTrackingInvitationMailBuilder { - BranchIO2RaceLogTrackingInvitationMailBuilder(Locale locale) { super(locale); } @@ -20,5 +19,4 @@ public class BranchIO2RaceLogTrackingInvitationMailBuilder extends BranchIORaceL // FIXME the app should in the future at some point also support bouy pinging, replace this then return BranchIOConstants.BUOYPINGER_APP_BRANCHIO; } - } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BranchIO3RaceLogTrackingInvitationMailBuilder.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BranchIO3RaceLogTrackingInvitationMailBuilder.java new file mode 100644 index 00000000000..135beb4b49d --- /dev/null +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BranchIO3RaceLogTrackingInvitationMailBuilder.java @@ -0,0 +1,24 @@ +package com.sap.sailing.domain.racelogtracking.impl; + +import java.util.Locale; + +import com.sap.sailing.domain.common.BranchIOConstants; + +public class BranchIO3RaceLogTrackingInvitationMailBuilder extends BranchIORaceLogTrackingInvitationMailBuilder { + + BranchIO3RaceLogTrackingInvitationMailBuilder(Locale locale) { + super(locale); + } + + @Override + protected String getSailInsightBranchIO() { + return BranchIOConstants.SAILINSIGHT_3_APP_BRANCHIO; + } + + @Override + protected String getBouyPingerBranchIO() { + // FIXME the app should in the future at some point also support bouy pinging, replace this then + return BranchIOConstants.BUOYPINGER_APP_BRANCHIO; + } + +} diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index 93af240a594..1d64ae14dc4 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -362,6 +362,9 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { case SailInsight2: mail = new BranchIO2RaceLogTrackingInvitationMailBuilder(locale); break; + case SailInsight3: + mail = new BranchIO3RaceLogTrackingInvitationMailBuilder(locale); + break; default: throw new IllegalArgumentException("Unhandled mail type"); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/impl/ORCPublicCertificateDatabaseImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/impl/ORCPublicCertificateDatabaseImpl.java index af8e896ea81..94e7934e358 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/impl/ORCPublicCertificateDatabaseImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/impl/ORCPublicCertificateDatabaseImpl.java @@ -7,6 +7,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Base64; import java.util.Calendar; +import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.HashSet; @@ -330,7 +331,7 @@ public class ORCPublicCertificateDatabaseImpl implements ORCPublicCertificateDat builder = child.getTextContent(); break; case "dxtDate": - issueDate = new MillisecondsTimePoint(isoTimestampFormat.parse(child.getTextContent()+"+0000")); // assume UTC + issueDate = new MillisecondsTimePoint(parseDate(child.getTextContent())); // assume UTC break; case "CertType": certType = Integer.valueOf(child.getTextContent().trim()); @@ -350,6 +351,19 @@ public class ORCPublicCertificateDatabaseImpl implements ORCPublicCertificateDat sailNumber, boatClassName, designer, builder, yearBuilt, issueDate, certType, isOneDesign, isProvisional); } + private Date parseDate(String dateString) throws ParseException { + StringBuilder stringBuilder = new StringBuilder(dateString); + char timeZoneCharacter = stringBuilder.charAt(stringBuilder.length()-1); + if(timeZoneCharacter== 'z' || timeZoneCharacter == 'Z'|| timeZoneCharacter == 'X') { + stringBuilder.deleteCharAt(stringBuilder.length()-1); + } + if(false == stringBuilder.toString().contains("+")) { + stringBuilder.append("+0000"); + } + + return isoTimestampFormat.parse(stringBuilder.toString()); + } + @Override public ORCCertificate getCertificate(String referenceNumber) throws Exception { final HttpClient client = new SystemDefaultHttpClient(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/qrcode/QRCodePlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/qrcode/QRCodePlace.java index 742ec059b09..25cf582a8c1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/qrcode/QRCodePlace.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/qrcode/QRCodePlace.java @@ -166,6 +166,7 @@ public class QRCodePlace extends AbstractBasePlace { } public String getPublicInviteBranchIOUrl() { + // TODO why is this specific to version 2 and not considering the default server setting for mailInvitationType? return BranchIOConstants.OPEN_REGATTA_2_APP_BRANCHIO + "?" + QRCodePlace.PARAM_REGATTA_NAME + "=" + encodeUrl(publicRegattaName) + "&" + QRCodePlace.PARAM_REGATTA_SECRET + "=" + encodeUrl(regattaRegistrationLinkSecret) + "&" + QRCodePlace.PARAM_SERVER + "=" diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java index 87133a873eb..767bda207d4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java @@ -144,12 +144,9 @@ public class RegattaDetailsComposite extends Composite { Button button = new Button(stringMessages.registrationLinkShare(), new ClickHandler() { @Override public void onClick(ClickEvent event) { - RegistrationLinkWithQRCode registrationLinkWithQRCode = new RegistrationLinkWithQRCode(); registrationLinkWithQRCode.setSecret(regatta.registrationLinkSecret); - sailingService.getMailType(new AsyncCallback() { - @Override public void onFailure(Throwable caught) { logger.log(Level.SEVERE, "Could not determine MailInvitationType", caught); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java index 400eca6a6ce..5ffa0bba26a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java @@ -221,21 +221,28 @@ public class RegattaLogAddDeviceMappingDialog extends DataEntryDialogWithDateTim String url = DeviceMappingConstants.getDeviceMappingForRegattaLogUrl(baseUrlWithoutTrailingSlash, eventIdAsString, leaderboardName, mappedItemType, mappedItemId, regattaRegisterSecret, GwtUrlHelper.INSTANCE); - if (mailInvitationType == MailInvitationType.LEGACY) { + switch (mailInvitationType) { + case LEGACY: // URL is already legacy - } else if (mailInvitationType == MailInvitationType.SailInsight1) { + break; + case SailInsight1: url = BranchIOConstants.SAILINSIGHT_APP_BRANCHIO + "?" + BranchIOConstants.SAILINSIGHT_APP_BRANCHIO_PATH + "=" + GwtUrlHelper.INSTANCE.encodeQueryString(url); - } else if (mailInvitationType == MailInvitationType.SailInsight2) { + break; + case SailInsight2: url = BranchIOConstants.SAILINSIGHT_2_APP_BRANCHIO + "?" + BranchIOConstants.OPEN_REGATTA_2_APP_BRANCHIO_PATH + "=" + GwtUrlHelper.INSTANCE.encodeQueryString(url); - } - else { + break; + case SailInsight3: + url = BranchIOConstants.SAILINSIGHT_3_APP_BRANCHIO + "?" + + BranchIOConstants.OPEN_REGATTA_3_APP_BRANCHIO_PATH + "=" + + GwtUrlHelper.INSTANCE.encodeQueryString(url); + break; + default: throw new QRCodeURLCreationException("Unknown mail invitation type: " + mailInvitationType); } - return url; } }); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegistrationLinkWithQRCodeDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegistrationLinkWithQRCodeDialog.java index 4817fa55eb4..de2b6288d2a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegistrationLinkWithQRCodeDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegistrationLinkWithQRCodeDialog.java @@ -63,14 +63,10 @@ public class RegistrationLinkWithQRCodeDialog extends DataEntryDialog() { @Override public String getValue(EventDTO item) { @@ -98,10 +94,8 @@ public class RegistrationLinkWithQRCodeDialog extends DataEntryDialog parameters = new HashMap(); parameters.put("regatta_name", regattaName); parameters.put("secret", secret); parameters.put("server", baseUrl); parameters.put("event_id", eventIdAsString); + // TODO decide OPEN_REGATTA link variant based on invitationType String deeplinkUrl = BranchIO.generateLink(BranchIOConstants.OPEN_REGATTA_2_APP_BRANCHIO, parameters, URL::encodeQueryString); urlTextBox.setText(deeplinkUrl); - if (invitationType != MailInvitationType.SailInsight2) { + if (invitationType != MailInvitationType.SailInsight2 && + invitationType != MailInvitationType.SailInsight3) { // TODO it would be better to make it a property of an enum literal whether open regatta invitation is possible getStatusLabel().setText(stringMessages.warningSailInsightVersion()); getStatusLabel().setStyleName("errorLabel"); } sailingService.openRegattaRegistrationQrCode(deeplinkUrl, new AsyncCallback() { - @Override public void onFailure(Throwable caught) { GWT.log("Qrcode generation failed: ", caught); @@ -187,9 +176,7 @@ public class RegistrationLinkWithQRCodeDialog extends DataEntryDialog(); - taggingPanel = new DockLayoutPanel(Style.Unit.PX); + taggingPanel = new DockLayoutPanel(Style.Unit.PX) { + @Override + public void onResize() { + super.onResize(); + taggingPanel.setWidgetSize(footerPanel, calculateFooterPanelHeight()); + } + }; filterbarAndContentPanel = new HeaderPanel(); tagFooterPanel = new TagFooterPanel(this, sailingService, stringMessages, userService); footerPanel = new ScrollPanel(tagFooterPanel); @@ -705,15 +711,7 @@ public class TaggingPanel extends ComponentWithoutSettings Scheduler.get().scheduleFinally(new RepeatingCommand() { @Override public boolean execute() { - // Default size of 2/3 the TaggingPanel - int height = (int) Math.round(taggingPanel.getOffsetHeight() / 3f * 2f); - // Get actual size of the footerPanel which might be 0 if the browser screwed up - final int vScroll = footerPanel.getWidget().getElement().getScrollHeight(); - if (vScroll != 0) { - height = Math.min(height, vScroll); - } - height = Math.max(200, height); - taggingPanel.setWidgetSize(footerPanel, height); + taggingPanel.setWidgetSize(footerPanel, calculateFooterPanelHeight()); taggingPanel.animate(FOOTERPANEL_ANIMATION_PERIOD_MS); return false; } @@ -728,6 +726,15 @@ public class TaggingPanel extends ComponentWithoutSettings } } + private int calculateFooterPanelHeight() { + // Start with footerPanel content height + int height = footerPanel.getWidget().getElement().getOffsetHeight(); + // Limit size if we take up the entire height of the viewing area + // to make sure we don't get pushed out of it at the top making parts of the footerPanel inaccessible + height = Math.min(height, taggingPanel.getOffsetHeight()); + return height; + } + /** * Checks whether current user has permission to modify public tags. * diff --git a/java/com.sap.sailing.selenium.test/local-test-environment.xml b/java/com.sap.sailing.selenium.test/local-test-environment.xml index d92872fc57f..b209883b7b8 100644 --- a/java/com.sap.sailing.selenium.test/local-test-environment.xml +++ b/java/com.sap.sailing.selenium.test/local-test-environment.xml @@ -40,7 +40,7 @@ --> webdriver.chrome.driver - C:\apps\ChromeSeleniumDriver\chromedriver.exe + /usr/bin/chromedriver webdriver.gecko.driver - /path/to/geckodriver.exe + /usr/bin/geckodriver - - --> + +