From 7dd633e494e4e26faa32fae266145ea92d855b73 Mon Sep 17 00:00:00 2001 From: Udo Wessels Date: Mon, 11 Apr 2022 20:13:02 +0200 Subject: [PATCH 01/33] bug5712: Changed Subscription Overview from showing each plan to having a card for each category. --- .../subscription/SailingSubscriptionPlan.java | 90 +++++++++++++---- .../subscription/SubscriptionCard.gss | 15 ++- .../subscription/SubscriptionCard.java | 39 ++++---- .../SubscriptionCardContainer.java | 4 +- .../SubscriptionCardResources.java | 1 - .../AbstractSubscriptionActivity.java | 59 ++++++++--- .../subscription/SubscriptionCategoryDTO.java | 98 +++++++++++++++++++ .../places/subscription/SubscriptionView.java | 3 +- .../subscription/SubscriptionViewImpl.java | 17 +--- .../shared/subscription/SubscriptionPlan.java | 9 +- .../subscription/SubscriptionPrice.java | 32 ++++-- .../SubscriptionStringConstants.java | 30 +++--- .../SubscriptionStringConstants.properties | 36 +++---- .../SubscriptionStringConstants_de.properties | 36 +++---- .../subscription/SubscriptionServiceImpl.java | 12 ++- 15 files changed, 330 insertions(+), 151 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/SubscriptionCategoryDTO.java diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/subscription/SailingSubscriptionPlan.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/subscription/SailingSubscriptionPlan.java index c2dd28306df..88dfca8eba6 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/subscription/SailingSubscriptionPlan.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/subscription/SailingSubscriptionPlan.java @@ -18,22 +18,31 @@ import com.sap.sse.security.shared.subscription.SubscriptionPrice.PaymentInterva * Payment subscription plans. A subscription plan has a name, a {@link String}-based ID, and a set of * {@link SubscriptionPlanRole roles} it grants to a subscribing user. These roles can specify how they are to be * qualified when assigned, regarding user and group qualifications. See - * {@link SubscriptionPlanRole.GroupQualificationMode} and {@link SubscriptionPlanRole.UserQualificationMode} for - * more details. + * {@link SubscriptionPlanRole.GroupQualificationMode} and {@link SubscriptionPlanRole.UserQualificationMode} for more + * details. * */ public class SailingSubscriptionPlan extends SubscriptionPlan { private static final String USD_CURRENCY_CODE = "usd"; - private static final BigDecimal YEARLY_PLAN_PRICE = new BigDecimal(49.99); - private static final BigDecimal WEEKLY_PLAN_PRICE = new BigDecimal(8.99); - private static final BigDecimal TRIAL_PLAN_PRICE = new BigDecimal(0); private static final long serialVersionUID = 2563619370274543312L; - private static final String YEARLY_PLAN_ID = "yearly_premium"; - private static final String WEEKLY_PLAN_ID = "weekly_premium"; - private static final String TRIAL_PLAN_ID = "trial_premium"; - private static final String TRIAL_PLAN_ITEMPRICE_ID = "trial_premium_usd_daily"; - private static final String WEEKLY_PLAN_ITEMPRICE_ID = "weekly_premium_usd_weekly"; - private static final String YEARLY_PLAN_ITEMPRICE_ID = "yearly_premium_usd_yearly"; + private static final String TRIAL_PREMIUM_PLAN_ID = "trial_premium"; + private static final String WEEKLY_PREMIUM_PLAN_ID = "weekly_premium"; + private static final String YEARLY_PREMIUM_PLAN_ID = "yearly_premium"; + private static final String TRIAL_DATA_MINING_ARCHIVE_PLAN_ID = "trial_data_mining_archive"; + private static final String WEEKLY_DATA_MINING_ARCHIVE_PLAN_ID = "weekly_data_mining_archive"; + private static final String YEARLY_DATA_MINING_ARCHIVE_PLAN_ID = "yearly_data_mining_archive"; + private static final String TRIAL_DATA_MINING_ALL_PLAN_ID = "trial_data_mining_all"; + private static final String WEEKLY_DATA_MINING_ALL_PLAN_ID = "weekly_data_mining_all"; + private static final String YEARLY_DATA_MINING_ALL_PLAN_ID = "yearly_data_mining_all"; + private static final String TRIAL_PREMIUM_PLAN_ITEMPRICE_ID = "trial_premium_usd_daily"; + private static final String WEEKLY_PREMIUM_PLAN_ITEMPRICE_ID = "weekly_premium_usd_weekly"; + private static final String YEARLY_PREMIUM_PLAN_ITEMPRICE_ID = "yearly_premium_usd_yearly"; + private static final String TRIAL_DATA_MINING_ARCHIVE_PLAN_ITEMPRICE_ID = "trial_data_mining_archive_usd_daily"; + private static final String WEEKLY_DATA_MINING_ARCHIVE_PLAN_ITEMPRICE_ID = "weekly_data_mining_archive_usd_weekly"; + private static final String YEARLY_DATA_MINING_ARCHIVE_PLAN_ITEMPRICE_ID = "yearly_data_mining_archive_usd_yearly"; + private static final String TRIAL_DATA_MINING_ALL_PLAN_ITEMPRICE_ID = "trial_data_mining_all_usd_daily"; + private static final String WEEKLY_DATA_MINING_ALL_PLAN_ITEMPRICE_ID = "weekly_data_mining_all_usd_weekly"; + private static final String YEARLY_DATA_MINING_ALL_PLAN_ITEMPRICE_ID = "yearly_data_mining_all_usd_yearly"; private static final Map plansById = new HashMap<>(); private SailingSubscriptionPlan(String id, Set prices, Set excludesPlanIds, @@ -42,17 +51,58 @@ public class SailingSubscriptionPlan extends SubscriptionPlan { plansById.put(id, this); } - public static final SubscriptionPlan YEARLY = new SailingSubscriptionPlan(YEARLY_PLAN_ID, - Stream.of(new SubscriptionPrice(YEARLY_PLAN_ITEMPRICE_ID, YEARLY_PLAN_PRICE, USD_CURRENCY_CODE, - PaymentInterval.YEAR)).collect(Collectors.toSet()), Stream.of(PlanCategory.PREMIUM).collect(Collectors.toSet()), false, + public static final SubscriptionPlan PREMIUM_TRIAL = new SailingSubscriptionPlan(TRIAL_PREMIUM_PLAN_ID, + Stream.of(new SubscriptionPrice(TRIAL_PREMIUM_PLAN_ITEMPRICE_ID, new BigDecimal(0), USD_CURRENCY_CODE, + PaymentInterval.DAY, false)).collect(Collectors.toSet()), + Stream.of(PlanCategory.PREMIUM).collect(Collectors.toSet()), true, new SubscriptionPlanRole(PremiumRole.getRoleId())); - public static final SubscriptionPlan WEEKLY = new SailingSubscriptionPlan(WEEKLY_PLAN_ID, - Stream.of(new SubscriptionPrice(WEEKLY_PLAN_ITEMPRICE_ID, WEEKLY_PLAN_PRICE, USD_CURRENCY_CODE, - PaymentInterval.WEEK)).collect(Collectors.toSet()), Stream.of(PlanCategory.PREMIUM).collect(Collectors.toSet()), false, + public static final SubscriptionPlan PREMIUM_WEEKLY = new SailingSubscriptionPlan(WEEKLY_PREMIUM_PLAN_ID, + Stream.of(new SubscriptionPrice(WEEKLY_PREMIUM_PLAN_ITEMPRICE_ID, new BigDecimal(8.99), USD_CURRENCY_CODE, + PaymentInterval.WEEK, true)).collect(Collectors.toSet()), + Stream.of(PlanCategory.PREMIUM).collect(Collectors.toSet()), false, new SubscriptionPlanRole(PremiumRole.getRoleId())); - public static final SubscriptionPlan TRIAL = new SailingSubscriptionPlan(TRIAL_PLAN_ID, - Stream.of(new SubscriptionPrice(TRIAL_PLAN_ITEMPRICE_ID, TRIAL_PLAN_PRICE, USD_CURRENCY_CODE, - PaymentInterval.DAY)).collect(Collectors.toSet()), Stream.of(PlanCategory.PREMIUM).collect(Collectors.toSet()), true, + public static final SubscriptionPlan PREMIUM_YEARLY = new SailingSubscriptionPlan(YEARLY_PREMIUM_PLAN_ID, + Stream.of(new SubscriptionPrice(YEARLY_PREMIUM_PLAN_ITEMPRICE_ID, new BigDecimal(49.99), USD_CURRENCY_CODE, + PaymentInterval.YEAR, false)).collect(Collectors.toSet()), + Stream.of(PlanCategory.PREMIUM).collect(Collectors.toSet()), false, + new SubscriptionPlanRole(PremiumRole.getRoleId())); + + public static final SubscriptionPlan DATA_MINING_ARCHIVE_TRIAL = new SailingSubscriptionPlan( + TRIAL_DATA_MINING_ARCHIVE_PLAN_ID, + Stream.of(new SubscriptionPrice(TRIAL_DATA_MINING_ARCHIVE_PLAN_ITEMPRICE_ID, new BigDecimal(0), + USD_CURRENCY_CODE, PaymentInterval.DAY, false)).collect(Collectors.toSet()), + Stream.of(PlanCategory.DATA_MINING_ARCHIEVE).collect(Collectors.toSet()), true, + new SubscriptionPlanRole(PremiumRole.getRoleId())); + public static final SubscriptionPlan DATA_MINING_ARCHIVE_WEEKLY = new SailingSubscriptionPlan( + WEEKLY_DATA_MINING_ARCHIVE_PLAN_ID, + Stream.of(new SubscriptionPrice(WEEKLY_DATA_MINING_ARCHIVE_PLAN_ITEMPRICE_ID, new BigDecimal(89.99), + USD_CURRENCY_CODE, PaymentInterval.WEEK, true)).collect(Collectors.toSet()), + Stream.of(PlanCategory.DATA_MINING_ARCHIEVE).collect(Collectors.toSet()), false, + new SubscriptionPlanRole(PremiumRole.getRoleId())); + public static final SubscriptionPlan DATA_MINING_ARCHIVE_YEARLY = new SailingSubscriptionPlan( + YEARLY_DATA_MINING_ARCHIVE_PLAN_ID, + Stream.of(new SubscriptionPrice(YEARLY_DATA_MINING_ARCHIVE_PLAN_ITEMPRICE_ID, new BigDecimal(499.99), + USD_CURRENCY_CODE, PaymentInterval.YEAR, false)).collect(Collectors.toSet()), + Stream.of(PlanCategory.DATA_MINING_ARCHIEVE).collect(Collectors.toSet()), false, + new SubscriptionPlanRole(PremiumRole.getRoleId())); + + public static final SubscriptionPlan DATA_MINING_ALL_TRIAL = new SailingSubscriptionPlan( + TRIAL_DATA_MINING_ALL_PLAN_ID, + Stream.of(new SubscriptionPrice(TRIAL_DATA_MINING_ALL_PLAN_ITEMPRICE_ID, new BigDecimal(0), + USD_CURRENCY_CODE, PaymentInterval.DAY, false)).collect(Collectors.toSet()), + Stream.of(PlanCategory.DATA_MINING_ALL).collect(Collectors.toSet()), true, + new SubscriptionPlanRole(PremiumRole.getRoleId())); + public static final SubscriptionPlan DATA_MINING_ALL_WEEKLY = new SailingSubscriptionPlan( + WEEKLY_DATA_MINING_ALL_PLAN_ID, + Stream.of(new SubscriptionPrice(WEEKLY_DATA_MINING_ALL_PLAN_ITEMPRICE_ID, new BigDecimal(189.99), + USD_CURRENCY_CODE, PaymentInterval.WEEK, true)).collect(Collectors.toSet()), + Stream.of(PlanCategory.DATA_MINING_ALL).collect(Collectors.toSet()), false, + new SubscriptionPlanRole(PremiumRole.getRoleId())); + public static final SubscriptionPlan DATA_MINING_ALL_YEARLY = new SailingSubscriptionPlan( + YEARLY_DATA_MINING_ALL_PLAN_ID, + Stream.of(new SubscriptionPrice(YEARLY_DATA_MINING_ALL_PLAN_ITEMPRICE_ID, new BigDecimal(999.99), + USD_CURRENCY_CODE, PaymentInterval.YEAR, false)).collect(Collectors.toSet()), + Stream.of(PlanCategory.DATA_MINING_ALL).collect(Collectors.toSet()), false, new SubscriptionPlanRole(PremiumRole.getRoleId())); public static Map getAllInstances() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCard.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCard.gss index fd0f9949e75..840c1b7a4fb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCard.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCard.gss @@ -57,10 +57,6 @@ } } -.subscription.individual { - order: 999; -} - .subscription.highlight { order: 1; } @@ -170,12 +166,13 @@ color: red; font-weight: bold; position: relative; - top: -60px; - right: -240px; - transform: rotate(45deg); + top: -55px; + right: -270px; + transform: rotate(30deg); + font-size: 10px; } -.free .price, .individual .price { +.free .price { border-color: #f0ab00; background-color: #f0ab00; color: #fff; @@ -186,7 +183,7 @@ color: #fff; } -.free .price:hover, .individual .price:hover { +.free .price:hover { border-color: #d79900; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCard.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCard.java index 279333f07c9..79a2a793cb6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCard.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCard.java @@ -23,23 +23,22 @@ import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.common.client.SharedResources; import com.sap.sailing.gwt.home.shared.places.subscription.SailingSubscriptionStringConstants; +import com.sap.sailing.gwt.home.shared.places.subscription.SubscriptionCategoryDTO; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.security.shared.subscription.SubscriptionPrice; import com.sap.sse.security.ui.authentication.AuthenticationContextEvent; import com.sap.sse.security.ui.authentication.app.AuthenticationContext; import com.sap.sse.security.ui.client.i18n.subscription.SubscriptionStringConstants; -import com.sap.sse.security.ui.shared.subscription.SubscriptionPlanDTO; public class SubscriptionCard extends Composite { public static enum Type { - FREE, OWNER, HIGHLIGHT, INDIVIDUAL, DEFAULT, ONETIMELOCK + FREE, OWNER, HIGHLIGHT, DEFAULT, ONETIMELOCK } private static SubscriptionUiBinder uiBinder = GWT.create(SubscriptionUiBinder.class); private static final String FEATURE_STYLE = SubscriptionCardResources.INSTANCE.css().feature(); private static final String HIGHLIGHT_STYLE = SubscriptionCardResources.INSTANCE.css().highlight(); - private static final String INDIVIDUAL_STYLE = SubscriptionCardResources.INSTANCE.css().individual(); private static final String OWNED_STYLE = SubscriptionCardResources.INSTANCE.css().owned(); private static final String SUBSCRIPTION_STYLE = SubscriptionCardResources.INSTANCE.css().subscription(); private static final String FREE_STYLE = SubscriptionCardResources.INSTANCE.css().free(); @@ -70,16 +69,16 @@ public class SubscriptionCard extends Composite { private final Consumer subscriptionCallback; private SubscriptionPrice currentPrice; - private final SubscriptionPlanDTO subscriptionPlanDTO; + private final SubscriptionCategoryDTO subscriptionCategoryDTO; - public SubscriptionCard(SubscriptionPlanDTO subscriptionPlanDTO, Type type, Consumer subscriptionCallback, EventBus eventBus, boolean loggedIn) { + public SubscriptionCard(SubscriptionCategoryDTO subscriptionCategroyDTO, Type type, Consumer subscriptionCallback, EventBus eventBus, boolean loggedIn) { this.subscriptionCallback = subscriptionCallback; - this.subscriptionPlanDTO = subscriptionPlanDTO; + this.subscriptionCategoryDTO = subscriptionCategroyDTO; SubscriptionCardResources.INSTANCE.css().ensureInjected(); SharedResources.INSTANCE.mediaCss().ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); addStyleName(SUBSCRIPTION_STYLE); - final List priceList = new ArrayList(subscriptionPlanDTO.getPrices()); + final List priceList = new ArrayList(subscriptionCategroyDTO.getPrices()); priceList.sort(new Comparator() { @Override public int compare(SubscriptionPrice o1, SubscriptionPrice o2) { @@ -113,10 +112,12 @@ public class SubscriptionCard extends Composite { price.addStyleName(SELECTED_STYLE); } }); - prices.add(price); - Label priceInfo = new Label(subscriptionStringConstants.getString(subscriptionPlanDTO.getSubscriptionPlanPriceInfoMessageKey())); + if (!subscriptionPrice.getDisablePlan()) { + prices.add(price); + } + Label priceInfo = new Label(subscriptionStringConstants.getString(subscriptionCategroyDTO.getSubscriptionCategoryPriceInfoMessageKey())); priceInfo.addStyleName(PRICE_INFO_STYLE); - if (priceInfo.getText().trim().length() > 0) { + if (Boolean.TRUE.equals(subscriptionPrice.getIsOneTimePayment())) { prices.add(priceInfo); } } @@ -125,8 +126,6 @@ public class SubscriptionCard extends Composite { final String priceText; if (type == Type.FREE) { priceText = i18n.free(); - } else if (type == Type.INDIVIDUAL) { - priceText = i18n.individual(); } else { priceText = i18n.price() + ": - "; } @@ -154,10 +153,6 @@ public class SubscriptionCard extends Composite { highlightHeader.add(new Label(i18n.subscriptionOneTimePlanLockedText())); button.getElement().getStyle().setDisplay(Display.NONE); break; - case INDIVIDUAL: - addStyleName(INDIVIDUAL_STYLE); - button.setText(i18n.send()); - break; case FREE: addStyleName(FREE_STYLE); button.setText(i18n.signInOrUp()); @@ -178,10 +173,10 @@ public class SubscriptionCard extends Composite { default: break; } - title.setInnerText(subscriptionStringConstants.getString(subscriptionPlanDTO.getSubscriptionPlanNameMessageKey())); - description.setInnerText(subscriptionStringConstants.getString(subscriptionPlanDTO.getSubscriptionPlanDescMessageKey())); - info.setInnerText(subscriptionStringConstants.getString(subscriptionPlanDTO.getSubscriptionPlanInfoMessageKey())); - final String[] featureStrings = subscriptionStringConstants.getStringArray(subscriptionPlanDTO.getSubscriptionPlanFeatureMessageKey()); + title.setInnerText(subscriptionStringConstants.getString(subscriptionCategroyDTO.getSubscriptionCategoryNameMessageKey())); + description.setInnerText(subscriptionStringConstants.getString(subscriptionCategroyDTO.getSubscriptionCategoryDescMessageKey())); + info.setInnerText(subscriptionStringConstants.getString(subscriptionCategroyDTO.getSubscriptionCategoryInfoMessageKey())); + final String[] featureStrings = subscriptionStringConstants.getStringArray(subscriptionCategroyDTO.getSubscriptionCategoryFeatureMessageKey()); for (String featureString : featureStrings) { if(featureString != "") { FlowPanel feature = new FlowPanel(); @@ -192,8 +187,8 @@ public class SubscriptionCard extends Composite { } } - public SubscriptionPlanDTO getSubscriptionPlanDTO() { - return subscriptionPlanDTO; + public SubscriptionCategoryDTO getSubscriptionCategoryDTO() { + return subscriptionCategoryDTO; } @UiHandler("button") diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCardContainer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCardContainer.java index 3ba9058fe9f..6f1abbb1211 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCardContainer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCardContainer.java @@ -133,7 +133,7 @@ public class SubscriptionCardContainer extends Composite { } public void addSubscription(SubscriptionCard subscription) { - if (!isSubscriptionPlanExisting(subscription.getSubscriptionPlanDTO().getSubscriptionPlanId())) { + if (!isSubscriptionPlanExisting(subscription.getSubscriptionCategoryDTO().getSubscriptionCategoryId())) { container.add(subscription); } } @@ -143,7 +143,7 @@ public class SubscriptionCardContainer extends Composite { for (int i = 0; i < container.getWidgetCount(); i++) { if (container.getWidget(i) instanceof SubscriptionCard) { SubscriptionCard card = (SubscriptionCard)container.getWidget(i); - if (card.getSubscriptionPlanDTO().getSubscriptionPlanId().equals(planId)) { + if (card.getSubscriptionCategoryDTO().getSubscriptionCategoryId().equals(planId)) { isExisting = true; break; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCardResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCardResources.java index ff963bff3b9..fecc17a09c2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCardResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCardResources.java @@ -17,7 +17,6 @@ public interface SubscriptionCardResources extends SharedHomeResources { String feature(); String highlight(); String owned(); - String individual(); String subscription(); String title(); String description(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/AbstractSubscriptionActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/AbstractSubscriptionActivity.java index 45c67ff2cc5..c052102575b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/AbstractSubscriptionActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/AbstractSubscriptionActivity.java @@ -2,8 +2,13 @@ package com.sap.sailing.gwt.home.shared.places.subscription; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import com.google.gwt.activity.shared.AbstractActivity; +import com.google.gwt.core.client.GWT; import com.google.gwt.event.shared.EventBus; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -11,6 +16,7 @@ import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.sap.sailing.gwt.home.desktop.partials.subscription.SubscriptionCard.Type; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.security.shared.subscription.InvalidSubscriptionProviderException; +import com.sap.sse.security.shared.subscription.SubscriptionPlan.PlanCategory; import com.sap.sse.security.ui.authentication.AuthenticationContextEvent; import com.sap.sse.security.ui.authentication.app.AuthenticationContext; import com.sap.sse.security.ui.shared.subscription.SubscriptionPlanDTO; @@ -65,17 +71,44 @@ public abstract class AbstractSubscriptionActivity extends AbstractActivity impl public void onSuccess(final ArrayList result) { view.resetSubscriptions(); addFreePlan(view); + Map categoryMap = new HashMap(); result.forEach(plan -> { + final Type type; if (checkIfUserIsOwnerOfThePlan(plan) || checkIfUserIsSubscribedToPlanCategory(plan)) { - view.addSubscriptionPlan(plan, Type.OWNER, eventBus); - } else if (checkIfUserWasAlreadySubscribedToOneTimePlan(plan)) { - view.addSubscriptionPlan(plan, Type.ONETIMELOCK, eventBus); - } else if (subscriptionsPlace.getPlansToHighlight() - .contains(plan.getSubscriptionPlanId())) { - view.addSubscriptionPlan(plan, Type.HIGHLIGHT, eventBus); + type = Type.OWNER; + } else if (subscriptionsPlace.getPlansToHighlight().contains(plan.getSubscriptionPlanId())) { + type = Type.HIGHLIGHT; } else { - view.addSubscriptionPlan(plan, Type.DEFAULT, eventBus); + type = Type.DEFAULT; } + plan.getPlanCategory().forEach(category -> { + final SubscriptionCategoryDTO categoryDTO; + if (categoryMap.containsKey(category)) { + categoryDTO = categoryMap.get(category); + plan.getPrices().forEach(price -> { + price.setDisablePlan(plan.isUserWasAlreadySubscribedToOneTimePlan()); + categoryDTO.getPrices().add(price); + }); + } else { + categoryDTO = new SubscriptionCategoryDTO(category.getId(), plan.isUserSubscribedToPlan(), plan.getPrices(), category, plan.isUserWasAlreadySubscribedToOneTimePlan(), plan.isUserSubscribedToPlanCategory(), plan.getError(), type); + categoryMap.put(category, categoryDTO); + } + categoryDTO.getPrices().forEach(price -> { + price.setDisablePlan(plan.isUserWasAlreadySubscribedToOneTimePlan()); + }); + }); + }); + List categories = new ArrayList(categoryMap.values()); + categories.sort(new Comparator() { + + @Override + public int compare(SubscriptionCategoryDTO o1, SubscriptionCategoryDTO o2) { + return o1.getPlanCategory().compareTo(o2.getPlanCategory()); + } + }); + categories.forEach(category -> { + GWT.log("Category: " + category.getSubscriptionCategoryId()); + view.addSubscriptionCategory(category, category.getType(), eventBus); }); } @@ -85,11 +118,11 @@ public abstract class AbstractSubscriptionActivity extends AbstractActivity impl } private void addFreePlan(final SubscriptionView view) { - final SubscriptionPlanDTO freePlan = new SubscriptionPlanDTO( + final SubscriptionCategoryDTO freePlan = new SubscriptionCategoryDTO( "free_subscription_plan" /* id */, /* isUserSubscribedToPlan */ false, - Collections.emptySet() /* prices */, /* planCategories */ Collections.emptySet(), - /* userWasAlreadySubscribedToOneTimePlan */ false, false, null /* error */); - view.addSubscriptionPlan(freePlan, Type.FREE, eventBus); + Collections.emptySet() /* prices */, /* planCategory */ null, + /* userWasAlreadySubscribedToOneTimePlan */ false, /*isUserSubscribedToPlanCategory*/ false, null /* error */, Type.DEFAULT); + view.addSubscriptionCategory(freePlan, Type.FREE, eventBus); } }); } catch (final InvalidSubscriptionProviderException exc) { @@ -116,10 +149,6 @@ public abstract class AbstractSubscriptionActivity extends AbstractActivity impl return plan.isUserSubscribedToPlan(); } - private boolean checkIfUserWasAlreadySubscribedToOneTimePlan(final SubscriptionPlanDTO plan) { - return plan.isUserWasAlreadySubscribedToOneTimePlan(); - } - private boolean checkIfUserIsSubscribedToPlanCategory(final SubscriptionPlanDTO plan) { return plan.isUserSubscribedToPlanCategory(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/SubscriptionCategoryDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/SubscriptionCategoryDTO.java new file mode 100644 index 00000000000..fe3b6282d73 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/SubscriptionCategoryDTO.java @@ -0,0 +1,98 @@ +package com.sap.sailing.gwt.home.shared.places.subscription; + +import java.util.HashSet; +import java.util.Set; + +import com.google.gwt.user.client.rpc.IsSerializable; +import com.sap.sailing.gwt.home.desktop.partials.subscription.SubscriptionCard; +import com.sap.sse.security.shared.subscription.SubscriptionPlan.PlanCategory; +import com.sap.sse.security.shared.subscription.SubscriptionPrice; + +/** + * A class to collect info from a bunch of SubscriptionPlanDTO which can be represented on one card. + */ +public class SubscriptionCategoryDTO implements IsSerializable { + private static final long serialVersionUID = -3820239604039244557L; + + public static final String FEATURES_MESSAGE_KEY_SUFFX = "_features"; + public static final String NAME_MESSAGE_KEY_SUFFX = "_name"; + public static final String DESC_MESSAGE_KEY_SUFFX = "_description"; + public static final String INFO_MESSAGE_KEY_SUFFIX = "_info"; + public static final String PRICE_INFO_MESSAGE_KEY_SUFFIX = "_price_info"; + + private final String id; + private HashSet prices = new HashSet(); + private final Boolean isUserSubscribedToPlan; + private final PlanCategory planCategory; + private final Boolean userWasAlreadySubscribedToOneTimePlan; + private final Boolean isUserSubscribedToPlanCategory; + private final SubscriptionCard.Type type; + + public SubscriptionCategoryDTO(String id, boolean isUserSubscribedToPlan, Set prices, + PlanCategory planCategory, boolean userWasAlreadySubscribedToOneTimePlan, + boolean isUserSubscribedToPlanCategory, String error, SubscriptionCard.Type type) { + this.id = id; + this.isUserSubscribedToPlan = isUserSubscribedToPlan; + this.planCategory = planCategory; + this.userWasAlreadySubscribedToOneTimePlan = userWasAlreadySubscribedToOneTimePlan; + this.isUserSubscribedToPlanCategory = isUserSubscribedToPlanCategory; + this.prices = new HashSet(prices); + this.type = type; + } + + public PlanCategory getPlanCategory() { + return planCategory; + } + + public boolean isUserWasAlreadySubscribedToOneTimePlan() { + return userWasAlreadySubscribedToOneTimePlan; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + + public String getSubscriptionCategoryId() { + return id; + } + + public boolean isUserSubscribedToPlan() { + return isUserSubscribedToPlan; + } + + public boolean isCurrentUserSubscribed() { + return false; + } + + public HashSet getPrices() { + return prices; + } + + public boolean isUserSubscribedToPlanCategory() { + return isUserSubscribedToPlanCategory; + } + + public SubscriptionCard.Type getType() { + return type; + } + + public String getSubscriptionCategoryNameMessageKey() { + return id + NAME_MESSAGE_KEY_SUFFX; + } + + public String getSubscriptionCategoryDescMessageKey() { + return id + DESC_MESSAGE_KEY_SUFFX; + } + + public String getSubscriptionCategoryInfoMessageKey() { + return id + INFO_MESSAGE_KEY_SUFFIX; + } + + public String getSubscriptionCategoryFeatureMessageKey() { + return id + FEATURES_MESSAGE_KEY_SUFFX; + } + + public String getSubscriptionCategoryPriceInfoMessageKey() { + return id + PRICE_INFO_MESSAGE_KEY_SUFFIX; + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/SubscriptionView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/SubscriptionView.java index e3cde542556..13b1a729ba9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/SubscriptionView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/SubscriptionView.java @@ -5,11 +5,10 @@ import com.google.gwt.user.client.ui.IsWidget; import com.sap.sailing.gwt.home.desktop.partials.subscription.SubscriptionCard; import com.sap.sse.security.ui.authentication.app.AuthenticationContext; import com.sap.sse.security.ui.client.subscription.SubscribeView; -import com.sap.sse.security.ui.shared.subscription.SubscriptionPlanDTO; public interface SubscriptionView extends SubscribeView, IsWidget { - void addSubscriptionPlan(SubscriptionPlanDTO plan, final SubscriptionCard.Type type, final EventBus eventBus); + void addSubscriptionCategory(SubscriptionCategoryDTO plan, final SubscriptionCard.Type type, final EventBus eventBus); void resetSubscriptions(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/SubscriptionViewImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/SubscriptionViewImpl.java index 78e2d300996..b594119793b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/SubscriptionViewImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/SubscriptionViewImpl.java @@ -1,7 +1,6 @@ package com.sap.sailing.gwt.home.shared.places.subscription; import com.google.gwt.event.shared.EventBus; -import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Composite; import com.sap.sailing.gwt.home.desktop.partials.subscription.SubscriptionCard; import com.sap.sailing.gwt.home.desktop.partials.subscription.SubscriptionCardContainer; @@ -9,7 +8,6 @@ import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.Notification; import com.sap.sse.gwt.client.Notification.NotificationType; import com.sap.sse.security.ui.authentication.app.AuthenticationContext; -import com.sap.sse.security.ui.shared.subscription.SubscriptionPlanDTO; public class SubscriptionViewImpl extends Composite implements SubscriptionView { @@ -26,12 +24,12 @@ public class SubscriptionViewImpl extends Composite implements SubscriptionView } @Override - public void addSubscriptionPlan(final SubscriptionPlanDTO plan, final SubscriptionCard.Type type, + public void addSubscriptionCategory(final SubscriptionCategoryDTO category, final SubscriptionCard.Type type, final EventBus eventBus) { switch (type) { case HIGHLIGHT: case DEFAULT: - container.addSubscription(new SubscriptionCard(plan, type, (price) -> { + container.addSubscription(new SubscriptionCard(category, type, (price) -> { final AuthenticationContext authenticationContext = presenter.getAuthenticationContext(); if (!authenticationContext.isLoggedIn()) { onOpenCheckoutError(StringMessages.INSTANCE.notLoggedIn()); @@ -47,20 +45,15 @@ public class SubscriptionViewImpl extends Composite implements SubscriptionView }, eventBus, presenter.getAuthenticationContext().isLoggedIn())); break; case OWNER: - container.addSubscription(new SubscriptionCard(plan, type, price -> presenter.manageSubscriptions(), + container.addSubscription(new SubscriptionCard(category, type, price -> presenter.manageSubscriptions(), eventBus, presenter.getAuthenticationContext().isLoggedIn())); break; case ONETIMELOCK: - container.addSubscription(new SubscriptionCard(plan, type, price -> {}, + container.addSubscription(new SubscriptionCard(category, type, price -> {}, eventBus, presenter.getAuthenticationContext().isLoggedIn())); break; - case INDIVIDUAL: - container.addSubscription( - new SubscriptionCard(plan, type, price -> Window.Location.assign("mailto:info@sapsailing.com"), - eventBus, presenter.getAuthenticationContext().isLoggedIn())); - break; case FREE: - container.addSubscription(new SubscriptionCard(plan, type, price -> presenter.toggleAuthenticationFlyout(), + container.addSubscription(new SubscriptionCard(category, type, price -> presenter.toggleAuthenticationFlyout(), eventBus, presenter.getAuthenticationContext().isLoggedIn())); break; default: diff --git a/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/subscription/SubscriptionPlan.java b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/subscription/SubscriptionPlan.java index 03e62cd4417..d725ccc8b78 100644 --- a/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/subscription/SubscriptionPlan.java +++ b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/subscription/SubscriptionPlan.java @@ -31,7 +31,14 @@ public abstract class SubscriptionPlan implements Serializable { * Used to make Plans of the same category mutually exclusive. */ public enum PlanCategory { - PREMIUM; + PREMIUM("premium"), DATA_MINING_ARCHIEVE("data_mining_archive"), DATA_MINING_ALL("data_mining_all"); + final String id; + PlanCategory(String id) { + this.id = id; + } + public String getId() { + return id; + } } protected SubscriptionPlan(String id, Set prices, Set planCategory, diff --git a/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/subscription/SubscriptionPrice.java b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/subscription/SubscriptionPrice.java index 0b7d2929cfa..ad064561cae 100644 --- a/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/subscription/SubscriptionPrice.java +++ b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/subscription/SubscriptionPrice.java @@ -3,31 +3,36 @@ package com.sap.sse.security.shared.subscription; import java.io.Serializable; import java.math.BigDecimal; -public class SubscriptionPrice implements Serializable{ +public class SubscriptionPrice implements Serializable { private static final long serialVersionUID = -1448071130685381256L; private String priceId; private BigDecimal price; private PaymentInterval paymentInterval; private String currencyCode; + private Boolean disablePlan; + private Boolean isOneTimePayment; /* * For GWT Serialization */ @Deprecated - public SubscriptionPrice() {} - - public SubscriptionPrice(String priceId, BigDecimal price, String currencyCode, PaymentInterval paymentInterval) { + public SubscriptionPrice() { + } + + public SubscriptionPrice(String priceId, BigDecimal price, String currencyCode, PaymentInterval paymentInterval, + boolean isOneTimePayment) { super(); this.priceId = priceId; this.price = price; this.currencyCode = currencyCode; this.paymentInterval = paymentInterval; + this.isOneTimePayment = isOneTimePayment; } - + public String getCurrencyCode() { return currencyCode; } - + public void setCurrencyCode(String currencyCode) { this.currencyCode = currencyCode; } @@ -47,7 +52,7 @@ public class SubscriptionPrice implements Serializable{ public void setPaymentInterval(PaymentInterval paymentInterval) { this.paymentInterval = paymentInterval; } - + public String getPriceId() { return priceId; } @@ -56,10 +61,21 @@ public class SubscriptionPrice implements Serializable{ this.priceId = priceId; } + public Boolean getDisablePlan() { + return disablePlan; + } + + public void setDisablePlan(Boolean disablePlan) { + this.disablePlan = disablePlan; + } + + public Boolean getIsOneTimePayment() { + return isOneTimePayment; + } + public enum PaymentInterval { YEAR, MONTH, WEEK, DAY } - @Override public String toString() { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/subscription/SubscriptionStringConstants.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/subscription/SubscriptionStringConstants.java index 8c6e4bcb556..16cce82f251 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/subscription/SubscriptionStringConstants.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/subscription/SubscriptionStringConstants.java @@ -21,21 +21,21 @@ public interface SubscriptionStringConstants extends ConstantsWithLookup { String free_subscription_plan_info(); String free_subscription_plan_price_info(); String[] free_subscription_plan_features(); - String yearly_premium_name(); - String yearly_premium_description(); - String yearly_premium_price_info(); - String yearly_premium_info(); - String[] yearly_premium_features(); - String weekly_premium_name(); - String weekly_premium_description(); - String weekly_premium_price_info(); - String weekly_premium_info(); - String[] weekly_premium_features(); - String trial_premium_name(); - String trial_premium_description(); - String trial_premium_price_info(); - String trial_premium_info(); - String[] trial_premium_features(); + String premium_name(); + String premium_description(); + String premium_price_info(); + String premium_info(); + String[] premium_features(); + String data_mining_archive_name(); + String data_mining_archive_description(); + String data_mining_archive_price_info(); + String data_mining_archive_info(); + String[] data_mining_archive_features(); + String data_mining_all_name(); + String data_mining_all_description(); + String data_mining_all_price_info(); + String data_mining_all_info(); + String[] data_mining_all_features(); String free_subscription_plan_shortname(); String premium_subscription_plan_shortname(); String datamining_subscription_plan_shortname(); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/subscription/SubscriptionStringConstants.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/subscription/SubscriptionStringConstants.properties index dd9cacd6b65..3139d1e03d9 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/subscription/SubscriptionStringConstants.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/subscription/SubscriptionStringConstants.properties @@ -22,22 +22,24 @@ free_subscription_plan_features=Basic live wind based leaderboard,\ Create your own account and carry out the sailing analytics for your regatta or training with our \ free tracking app or a professional tracking service,\ Sync live YouTube videos with your races -yearly_premium_name=Yearly Premium -yearly_premium_description=Full Access to all Features for one Year (auto renewing) -yearly_premium_info=Everything from Weekly Premium for a year, at a discount! -yearly_premium_price_info= -yearly_premium_features=\ - Full Live Analytics with hundreds of features including wind streamlets, comparison charts, \ - advanced in-map visualizations and much more. See full premium feature-list below, \ - Tag Personal Timeline with Videos and Notes -weekly_premium_name=Weekly Premium -weekly_premium_description=Full Access to all Features for one Week (one time payment) -weekly_premium_info=Everything from free plan plus: -weekly_premium_price_info=One time payment -weekly_premium_features=\ +premium_name=Premium +premium_description=A short trial experience of the premium features. Lasts a day. +premium_info=Everything from free plan plus: +premium_price_info=One Time Payment +premium_features=\ Full Live Analytics with hundreds of features including wind streamlets, comparison charts, \ advanced in-map visualizations and much more. See full premium feature-list below, \ Tag Personal Timeline with Videos and Notes +data_mining_archive_name=Data Mining - Archive +data_mining_archive_description= +data_mining_archive_info= +data_mining_archive_price_info=One Time Payment +data_mining_archive_features= +data_mining_all_name=Data Mining - ALL +data_mining_all_description= +data_mining_all_info= +data_mining_all_price_info=One Time Payment +data_mining_all_features= free_subscription_plan_shortname=free premium_subscription_plan_shortname=premium datamining_subscription_plan_shortname=data-mining @@ -61,14 +63,6 @@ features_media_tags_title=Link and upload media (tags) features_media_tags_description= Place and read comments (notes and images on timeline) features_scoring_title=Scoring features_scoring_description=ORC PCS scoring -trial_premium_name=Trial -trial_premium_description=A short trial experience of the premium features. Lasts a day. -trial_premium_info=Everything from free plan plus: -trial_premium_price_info= -trial_premium_features=\ - Full Live Analytics with hundreds of features including wind streamlets, comparison charts, \ - advanced in-map visualizations and much more. See full premium feature-list below, \ - Tag Personal Timeline with Videos and Notes features_map_analytics_title=Map Analytics features_map_analytics_description=Wind streamlets. features_simulator_title=Simulator diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/subscription/SubscriptionStringConstants_de.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/subscription/SubscriptionStringConstants_de.properties index 4b80dac3db9..54195b38947 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/subscription/SubscriptionStringConstants_de.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/subscription/SubscriptionStringConstants_de.properties @@ -23,22 +23,24 @@ free_subscription_plan_price_info= free_subscription_plan_features=Standart Live-Wind-basierte Bestenliste,\ Erstellen Sie Ihr eigenes Konto und führen Sie die Segelanalyse für Ihre Regatta oder Ihr Training mit unserer kostenlosen Tracking-App oder einem professionellen Tracking-Service durch,\ Synchronisiere YouTube-Videos mit deinen Rennen -yearly_premium_name=Jahresabo -yearly_premium_description=Ein Jahr Premium. Wiederkehrend. -yearly_premium_info=Alles aus dem Wochenabo für ein Jahr und mit einem Rabatt! -yearly_premium_price_info= -yearly_premium_features=\ - Vollständige Live-Analyse mit Hunderten von Funktionen, einschließlich Windströmungen, Vergleichstabellen, \ - erweiterte In-Map-Visualisierungen und vieles mehr. Siehe die vollständige Liste der Premiumfunktionen unten, \ - Kennzeichnen Sie die persönliche Timeline mit Videos und Notizen -weekly_premium_name=Wochenabo -weekly_premium_description=Voller Zugriff auf alle Funktionen für eine Woche (einmalige Zahlung) -weekly_premium_info=Alles vom kostenlosen Plan plus: -weekly_premium_price_info=einmalige Zahlung -weekly_premium_features=\ +premium_name=Trial +premium_description=Eine kurze Kostprobe der Premiummitgliedschaft. Läuft einen Tag. +premium_info=Alles vom kostenlosen Plan plus: +premium_price_info=einmalige Zahlung +premium_features=\ Vollständige Live-Analyse mit Hunderten von Funktionen, einschließlich Windströmungen, Vergleichstabellen, \ erweiterte In-Map-Visualisierungen und vieles mehr. Siehe die vollständige Liste der Premiumfunktionen unten, \ Kennzeichnen Sie die persönliche Timeline mit Videos und Notizen +data_mining_archive_name=Data Mining - Archive +data_mining_archive_description= +data_mining_archive_info= +data_mining_archive_price_info=einmalige Zahlung +data_mining_archive_features= +data_mining_all_name=Data Mining - All +data_mining_all_description= +data_mining_all_info= +data_mining_all_price_info=einmalige Zahlung +data_mining_all_features= free_subscription_plan_shortname=free premium_subscription_plan_shortname=premium datamining_subscription_plan_shortname=data-mining @@ -62,14 +64,6 @@ features_media_tags_title=Medien verlinken und hochladen (Tags) features_media_tags_description=- features_scoring_title=Scoring features_scoring_description=ORC PCS Wertungen -trial_premium_name=Trial -trial_premium_description=Eine kurze Kostprobe der Premiummitgliedschaft. Läuft einen Tag. -trial_premium_info=Alles vom kostenlosen Plan plus: -trial_premium_price_info -trial_premium_features=\ - Vollständige Live-Analyse mit Hunderten von Funktionen, einschließlich Windströmungen, Vergleichstabellen, \ - erweiterte In-Map-Visualisierungen und vieles mehr. Siehe die vollständige Liste der Premiumfunktionen unten, \ - Kennzeichnen Sie die persönliche Timeline mit Videos und Notizen features_map_analytics_title=Kartenanalyse features_map_analytics_description=Visualisierung von Windströmungen. features_simulator_title=Simulator diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/SubscriptionServiceImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/SubscriptionServiceImpl.java index 4b8b285890a..1c975110016 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/SubscriptionServiceImpl.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/SubscriptionServiceImpl.java @@ -3,6 +3,7 @@ package com.sap.sse.security.ui.server.subscription; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.CompletableFuture; @@ -35,6 +36,7 @@ import com.sap.sse.security.shared.impl.Role; import com.sap.sse.security.shared.impl.User; import com.sap.sse.security.shared.subscription.Subscription; import com.sap.sse.security.shared.subscription.SubscriptionPlan; +import com.sap.sse.security.shared.subscription.SubscriptionPrice; import com.sap.sse.security.subscription.SubscriptionApiService; import com.sap.sse.security.ui.client.subscription.SubscriptionService; import com.sap.sse.security.ui.server.Activator; @@ -216,7 +218,7 @@ public abstract class SubscriptionServiceImpl extends RemoteServiceServlet imple if(isUserSubscribedToPlan) { isUserSubscribedToPlanCategory = true; hasHadSubscriptionForOneTimePlan = plan.getIsOneTimePlan(); - }else { + } else { for (SubscriptionPlan subscriptionPlan : getSecurityService().getAllSubscriptionPlans().values()) { if(isUserSubscribedToPlan(subscriptionPlan.getId()) && Util.containsAny(plan.getPlanCategories(), subscriptionPlan.getPlanCategories())) { @@ -231,7 +233,13 @@ public abstract class SubscriptionServiceImpl extends RemoteServiceServlet imple hasHadSubscriptionForOneTimePlan = false; } } - return new SubscriptionPlanDTO(plan.getId(), isUserSubscribedToPlan, plan.getPrices(), + final boolean disablePrice = hasHadSubscriptionForOneTimePlan; + Set prices = new HashSet<>(); + plan.getPrices().forEach(price -> { + price.setDisablePlan(disablePrice); + prices.add(price); + }); + return new SubscriptionPlanDTO(plan.getId(), isUserSubscribedToPlan, prices, plan.getPlanCategories(), hasHadSubscriptionForOneTimePlan, isUserSubscribedToPlanCategory, null); } From 6540a2a06d98725ee1af74b622ef5ec4cb1a3295 Mon Sep 17 00:00:00 2001 From: Udo Wessels Date: Tue, 26 Apr 2022 10:16:57 +0200 Subject: [PATCH 02/33] bug5712: fixed a small design issue from subscription overview (removed unnecessary space after price if one time payment hint is visible) --- .../home/desktop/partials/subscription/SubscriptionCard.gss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCard.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCard.gss index 840c1b7a4fb..91d88e5d412 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCard.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/subscription/SubscriptionCard.gss @@ -162,14 +162,15 @@ border-radius: 0.333333333333333em; border-color: red; /* display: inline; */ - padding: 4px; color: red; font-weight: bold; position: relative; - top: -55px; + top: -45px; right: -270px; transform: rotate(30deg); font-size: 10px; + padding: 4px; + margin: -14px; } .free .price { From 7e400d90376167bde88c4d0da0ac6e687cf9ff4c Mon Sep 17 00:00:00 2001 From: Udo Wessels Date: Wed, 27 Apr 2022 18:17:43 +0200 Subject: [PATCH 03/33] bug5661: Convert DataMining and Strategy Simulator menu items to premium features. --- .../shared/header/SAPHeaderComponent.java | 5 +- .../FixedSailingAuthentication.java | 6 +- .../GenericSailingAuthentication.java | 6 +- ...letAndDesktopApplicationClientFactory.java | 4 +- .../home/desktop/partials/header/Header.gss | 17 ++++- .../home/desktop/partials/header/Header.java | 64 ++++++++++++++----- .../desktop/partials/header/Header.ui.xml | 10 +-- .../partials/header/HeaderResources.java | 6 ++ .../desktop/partials/header/icon_premium.svg | 1 + .../partials/header/HeaderConstants.java | 5 ++ .../client/RegattaOverviewEntryPoint.java | 4 +- .../places/AdminConsoleViewImpl.java | 5 +- .../ui/datamining/DataMiningEntryPoint.java | 4 +- .../ui/leaderboard/LeaderboardEntryPoint.java | 3 +- .../leaderboardedit/LeaderboardEditPage.java | 3 +- .../ui/pairinglist/PairingListEntryPoint.java | 4 +- .../EmbeddedMapAndWindChartEntryPoint.java | 3 +- .../gwt/ui/raceboard/RaceBoardEntryPoint.java | 3 +- .../gwt/ui/raceboard/RaceBoardPanel.java | 6 +- .../gwt/ui/simulator/SimulatorEntryPoint.java | 4 +- .../gwt/ui/spectator/SpectatorEntryPoint.java | 4 +- .../AuthenticationManagerImpl.java | 20 +++--- .../app/AuthenticationContext.java | 3 + .../app/AuthenticationContextImpl.java | 10 ++- .../generic/GenericAuthentication.java | 5 +- .../ui/client/premium/PremiumCheckBox.ui.xml | 4 +- .../subscription/SubscriptionServiceImpl.java | 9 ++- 27 files changed, 163 insertions(+), 55 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/icon_premium.svg diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/shared/header/SAPHeaderComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/shared/header/SAPHeaderComponent.java index 8dd57504ebd..47c38ab3955 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/shared/header/SAPHeaderComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/shared/header/SAPHeaderComponent.java @@ -11,6 +11,7 @@ import com.sap.sse.gwt.client.shared.components.AbstractCompositeComponent; import com.sap.sse.gwt.client.shared.components.Component; import com.sap.sse.gwt.client.shared.settings.ComponentContext; import com.sap.sse.security.ui.client.UserService; +import com.sap.sse.security.ui.client.premium.PaywallResolver; public class SAPHeaderComponent extends AbstractCompositeComponent { private SAPHeaderComponentSettings settings; @@ -20,13 +21,13 @@ public class SAPHeaderComponent extends AbstractCompositeComponent parent, ComponentContext context, SAPHeaderComponentLifecycle componentLifecycle, - UserService userService, SAPHeaderComponentSettings settings, + UserService userService, PaywallResolver paywallResolver, SAPHeaderComponentSettings settings, StringMessages stringMessages, boolean startInAutoScreenMode) { super(parent, context); this.componentLifecycle = componentLifecycle; this.settings = settings; this.sapHeader = new SAPSailingHeaderWithAuthentication(settings.getTitle()); - new FixedSailingAuthentication(userService, sapHeader.getAuthenticationMenuView()); + new FixedSailingAuthentication(userService, paywallResolver, sapHeader.getAuthenticationMenuView()); initWidget(sapHeader); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/FixedSailingAuthentication.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/FixedSailingAuthentication.java index 428c807eba6..bbddeb8bb1f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/FixedSailingAuthentication.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/FixedSailingAuthentication.java @@ -5,6 +5,7 @@ import com.sap.sse.security.ui.authentication.generic.GenericAuthentication; import com.sap.sse.security.ui.authentication.generic.sapheader.FixedFlyoutAuthenticationView; import com.sap.sse.security.ui.authentication.view.AuthenticationMenuView; import com.sap.sse.security.ui.client.UserService; +import com.sap.sse.security.ui.client.premium.PaywallResolver; /** * Sailing-specific extension of {@link GenericAuthentication} using a {@link FixedFlyoutAuthenticationView}, which is @@ -13,8 +14,9 @@ import com.sap.sse.security.ui.client.UserService; public class FixedSailingAuthentication extends GenericAuthentication { private static final CommonSharedResources res = CommonSharedResources.INSTANCE; - public FixedSailingAuthentication(UserService userService, AuthenticationMenuView userManagementMenuView) { - super(userService, userManagementMenuView, new FixedFlyoutAuthenticationView(res), + public FixedSailingAuthentication(UserService userService, PaywallResolver paywallResolver, + AuthenticationMenuView userManagementMenuView) { + super(userService, paywallResolver, userManagementMenuView, new FixedFlyoutAuthenticationView(res), SailingAuthenticationEntryPointLinkFactory.INSTANCE, res); res.mainCss().ensureInjected(); new FixedSailingLoginHintPopup(getAuthenticationManager()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/GenericSailingAuthentication.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/GenericSailingAuthentication.java index 2989d3e9fe6..6858698ebdb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/GenericSailingAuthentication.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/authentication/GenericSailingAuthentication.java @@ -5,6 +5,7 @@ import com.sap.sse.security.ui.authentication.generic.GenericAuthentication; import com.sap.sse.security.ui.authentication.generic.sapheader.GenericFlyoutAuthenticationView; import com.sap.sse.security.ui.authentication.view.AuthenticationMenuView; import com.sap.sse.security.ui.client.UserService; +import com.sap.sse.security.ui.client.premium.PaywallResolver; /** * Sailing-specific extension of {@link GenericAuthentication} using a {@link GenericFlyoutAuthenticationView}, which is @@ -13,8 +14,9 @@ import com.sap.sse.security.ui.client.UserService; public class GenericSailingAuthentication extends GenericAuthentication { private static final CommonSharedResources res = CommonSharedResources.INSTANCE; - public GenericSailingAuthentication(UserService userService, AuthenticationMenuView userManagementMenuView) { - super(userService, userManagementMenuView, new GenericFlyoutAuthenticationView(res), + public GenericSailingAuthentication(UserService userService, PaywallResolver paywallResolver, + AuthenticationMenuView userManagementMenuView) { + super(userService, paywallResolver, userManagementMenuView, new GenericFlyoutAuthenticationView(res), SailingAuthenticationEntryPointLinkFactory.INSTANCE, res); res.mainCss().ensureInjected(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationClientFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationClientFactory.java index 10c517c4a76..d2ecccf64ba 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationClientFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationClientFactory.java @@ -59,8 +59,10 @@ public class TabletAndDesktopApplicationClientFactory extends AbstractApplicatio this(eventBus, placeController, new DesktopPlacesNavigator(placeController, isStandaloneServer)); } - private TabletAndDesktopApplicationClientFactory(final EventBus eventBus, final PlaceController placeController, final DesktopPlacesNavigator placesNavigator) { + private TabletAndDesktopApplicationClientFactory(final EventBus eventBus, final PlaceController placeController, + final DesktopPlacesNavigator placesNavigator) { super(new TabletAndDesktopApplicationView(placesNavigator, eventBus), eventBus, placeController, placesNavigator); + getUserService(); final AuthenticationViewDesktop userManagementDisplay = new AuthenticationViewDesktop(); WhatsNewDialogFactory.register(getUserService(), placeController); final Runnable signInSuccesfulNavigation = new Runnable() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.gss index af0eb2f3f47..e94ba849ff9 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.gss @@ -194,7 +194,8 @@ .header_navigation_iconactive { /* background-image: resourceUrl('navigation_hover'); */ } -.sitenavigation .subscriptions:before { +.sitenavigation .subscriptions:before, +.sitenavigation_fixed .subscriptions:before { content: ""; position: absolute; background: resourceUrl('crown'); @@ -212,3 +213,17 @@ } .sitenavigation .subscriptions { } +.sitenavigation .premium_feature, +.sitenavigation_fixed .premium_feature { + color: #e3c861; +} + +.sitenavigation .premium_feature.premium_hint, +.sitenavigation_fixed .premium_feature.premium_hint { + background: resourceUrl('premiumIcon'); + background-size: 15px; + background-repeat: no-repeat; + background-position: right 10px top 19px; + padding-right: 28px; +} + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.java index 60eb9508e5b..1e4a77a6402 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.java @@ -20,6 +20,7 @@ import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.ImageElement; import com.google.gwt.dom.client.Style.Display; import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyPressEvent; import com.google.gwt.event.dom.client.KeyPressHandler; @@ -54,6 +55,7 @@ import com.sap.sailing.gwt.home.shared.places.solutions.SolutionsPlace.Solutions import com.sap.sailing.gwt.home.shared.places.start.StartPlace; import com.sap.sailing.gwt.home.shared.places.subscription.SubscriptionPlace; import com.sap.sailing.gwt.home.shared.utils.DropdownHandler; +import com.sap.sailing.gwt.ui.client.EntryPointLinkFactory; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.mvp.PlaceChangedEvent; import com.sap.sse.gwt.shared.ClientConfiguration; @@ -233,7 +235,6 @@ public class Header extends Composite implements HeaderConstants { this.navigator = navigator; HeaderResources.INSTANCE.css().ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); - Map menuToDropDownItemMap = new HashMap<>(); menuToDropDownItemMap.put(startPageLink, startPageLinkMenu); menuToDropDownItemMap.put(eventsPageLink, eventsPageLinkMenu); @@ -242,10 +243,18 @@ public class Header extends Composite implements HeaderConstants { menuToDropDownItemMap.put(adminConsolePageLink, adminConsolePageLinkMenu); menuToDropDownItemMap.put(dataMiningPageLink, dataMiningPageLinkMenu); menuToDropDownItemMap.put(strategySimulatorPageLink, strategySimulatorPageLinkMenu); - headerNavigationDropDownMenuContainer.getStyle().setDisplay(Display.NONE); final DropdownHandler dropdownHandler = new DropdownHandler(hamburgerMenuIcon, headerNavigationDropDownMenuContainer); menuItemVisibilityHandler = new MenuItemVisibilityHandler(menuToDropDownItemMap, dropdownHandler, hamburgerMenuIcon, centerMenuPanel); + // close menu if menu item was clicked + for (Anchor anchor: menuToDropDownItemMap.values()) { + anchor.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + dropdownHandler.setVisible(false); + } + }); + } Window.addResizeHandler(menuItemVisibilityHandler); links = Arrays.asList(new Anchor[] { startPageLink, eventsPageLink, solutionsPageLink, subscriptionsPageLink, adminConsolePageLink, dataMiningPageLink }); homeNavigation = navigator.getHomeNavigation(); @@ -256,10 +265,8 @@ public class Header extends Composite implements HeaderConstants { eventsPageLink.setHref(eventsNavigation.getTargetUrl()); solutionsPageLink.setHref(solutionsNavigation.getTargetUrl()); subscriptionsPageLink.setHref(subscriptionsNavigation.getTargetUrl()); - // make the Admin and DataMining links visible only for signed-in users + // make the Admin link visible only for signed-in users adminConsolePageLink.getElement().getStyle().setDisplay(Display.NONE); - dataMiningPageLink.getElement().getStyle().setDisplay(Display.NONE); - strategySimulatorPageLink.getElement().getStyle().setDisplay(Display.NONE); // initially hide admin console, data mining and strategy simulator in hamburger menu menuItemVisibilityHandler.addIgnore(adminConsolePageLink); menuItemVisibilityHandler.addIgnore(dataMiningPageLink); @@ -287,29 +294,56 @@ public class Header extends Composite implements HeaderConstants { adminConsolePageLink.getElement().getStyle().setDisplay(Display.NONE); menuItemVisibilityHandler.addIgnore(adminConsolePageLink); } - if (authContext.hasServerPermission(ServerActions.DATA_MINING)) { + menuItemVisibilityHandler.removeIgnore(dataMiningPageLink); + if (authContext.getPaywallResolver().hasPermission(ServerActions.DATA_MINING, authContext.getServerInfo())) { dataMiningPageLinkMenu.setHref(DATA_MINING_PATH); dataMiningPageLinkMenu.setTarget(DATA_MINING_WINDOW); + dataMiningPageLinkMenu.removeStyleName(HeaderResources.INSTANCE.css().premium_hint()); dataMiningPageLink.setHref(DATA_MINING_PATH); dataMiningPageLink.setTarget(DATA_MINING_WINDOW); + dataMiningPageLink.removeStyleName(HeaderResources.INSTANCE.css().premium_hint()); dataMiningPageLink.getElement().getStyle().setDisplay(Display.INLINE_BLOCK); - menuItemVisibilityHandler.removeIgnore(dataMiningPageLink); } else { - dataMiningPageLink.getElement().getStyle().setDisplay(Display.NONE); - menuItemVisibilityHandler.addIgnore(dataMiningPageLink); + dataMiningPageLinkMenu.setHref(subscriptionsNavigation.getTargetUrl()); + dataMiningPageLinkMenu.setTarget(SELF); + dataMiningPageLinkMenu.addStyleName(HeaderResources.INSTANCE.css().premium_hint()); + dataMiningPageLink.setHref(subscriptionsNavigation.getTargetUrl()); + dataMiningPageLink.setTarget(SELF); + dataMiningPageLink.getElement().getStyle().setDisplay(Display.INLINE_BLOCK); + dataMiningPageLink.addStyleName(HeaderResources.INSTANCE.css().premium_hint()); + // add possible subscription plans to URL + authContext.getPaywallResolver().getUnlockingSubscriptionPlans(ServerActions.DATA_MINING, authContext.getServerInfo(), + (unlockingPlans) -> { + dataMiningPageLinkMenu.setHref(EntryPointLinkFactory.createSubscriptionPageLink(unlockingPlans)); + dataMiningPageLink.setHref(EntryPointLinkFactory.createSubscriptionPageLink(unlockingPlans)); + }); } - if (authContext.hasPermission(NamedSecuredObjectDTO.create(authContext.getServerInfo().getName(), - SecuredDomainType.SIMULATOR, new TypeRelativeObjectIdentifier(authContext.getServerInfo().getName())), - DefaultActions.READ)) { + menuItemVisibilityHandler.removeIgnore(strategySimulatorPageLink); + if (authContext.getPaywallResolver().hasPermission(DefaultActions.READ, NamedSecuredObjectDTO.create(authContext.getServerInfo().getName(), + SecuredDomainType.SIMULATOR, new TypeRelativeObjectIdentifier(authContext.getServerInfo().getName())))) { strategySimulatorPageLinkMenu.setHref(STRATEGY_SIMULATOR_PATH); strategySimulatorPageLinkMenu.setTarget(STRATEGY_SIMULATOR_WINDOW); + strategySimulatorPageLinkMenu.removeStyleName(HeaderResources.INSTANCE.css().premium_hint()); strategySimulatorPageLink.setHref(STRATEGY_SIMULATOR_PATH); strategySimulatorPageLink.setTarget(STRATEGY_SIMULATOR_WINDOW); strategySimulatorPageLink.getElement().getStyle().setDisplay(Display.INLINE_BLOCK); - menuItemVisibilityHandler.removeIgnore(strategySimulatorPageLink); + strategySimulatorPageLink.removeStyleName(HeaderResources.INSTANCE.css().premium_hint()); } else { - strategySimulatorPageLink.getElement().getStyle().setDisplay(Display.NONE); - menuItemVisibilityHandler.addIgnore(strategySimulatorPageLink); + strategySimulatorPageLinkMenu.setHref(subscriptionsNavigation.getTargetUrl()); + strategySimulatorPageLinkMenu.setTarget(SELF); + strategySimulatorPageLinkMenu.addStyleName(HeaderResources.INSTANCE.css().premium_hint()); + strategySimulatorPageLink.setHref(subscriptionsNavigation.getTargetUrl()); + strategySimulatorPageLink.setTarget(SELF); + strategySimulatorPageLink.getElement().getStyle().setDisplay(Display.INLINE_BLOCK); + strategySimulatorPageLink.addStyleName(HeaderResources.INSTANCE.css().premium_hint()); + // add possible subscription plans to URL + authContext.getPaywallResolver().getUnlockingSubscriptionPlans(DefaultActions.READ, NamedSecuredObjectDTO.create(authContext.getServerInfo().getName(), + SecuredDomainType.SIMULATOR, new TypeRelativeObjectIdentifier(authContext.getServerInfo().getName())), + (unlockingPlans) -> { + strategySimulatorPageLinkMenu.setHref(EntryPointLinkFactory.createSubscriptionPageLink(unlockingPlans)); + strategySimulatorPageLink.setHref(EntryPointLinkFactory.createSubscriptionPageLink(unlockingPlans)); + }); + } menuItemVisibilityHandler.refreshVisibilityDeferred(); if (authContext.hasPermission(authContext.getCurrentUser(), UserActions.BE_PREMIUM)) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.ui.xml index e0cdb83d339..a70974619e5 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.ui.xml @@ -28,9 +28,9 @@ + styleName="{local_res.css.sitenavigation_link} {local_res.css.premium_feature}" text="{i18n.dataMining}" target="dataMiningWindow"/> + styleName="{local_res.css.sitenavigation_link} {local_res.css.premium_feature}" text="{i18n.simulator}" target="strategySimulatorWindow"/> diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/HeaderResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/HeaderResources.java index 68ad5602b93..0c3dab4591d 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/HeaderResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/HeaderResources.java @@ -49,7 +49,7 @@ public interface HeaderResources extends AuthenticationResources { String header_navigation_icon(); String header_navigation_iconactive(); String subscriptions(); - String premium(); + String user_menu_premium(); String premium_feature(); String premium_hint(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/AbstractSubscriptionActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/AbstractSubscriptionActivity.java index cdede4e1f24..845812472e2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/AbstractSubscriptionActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/subscription/AbstractSubscriptionActivity.java @@ -8,7 +8,6 @@ import java.util.List; import java.util.Map; import com.google.gwt.activity.shared.AbstractActivity; -import com.google.gwt.core.client.GWT; import com.google.gwt.event.shared.EventBus; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java index 97be25d0483..92b46c886af 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java @@ -288,7 +288,9 @@ public class RaceBoardPanel } } } - this.userManagementMenuView = new AuthenticationMenuViewImpl(new Anchor(), mainCss.usermanagement_loggedin(), mainCss.usermanagement_open()); + + this.userManagementMenuView = new AuthenticationMenuViewImpl(new Anchor(), mainCss.usermanagement_loggedin(), + mainCss.usermanagement_open(), mainCss.user_menu_premium()); this.userManagementMenuView.asWidget().setStyleName(mainCss.usermanagement_icon()); timeRangeWithZoomModel = new TimeRangeWithZoomModel(); final CompetitorColorProvider colorProvider = new CompetitorColorProviderImpl(selectedRaceIdentifier, competitorsAndTheirBoats); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardResources.java index d59a7e30f18..62a93f97952 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardResources.java @@ -7,25 +7,21 @@ import com.sap.sse.security.ui.authentication.generic.resource.AuthenticationRes public interface RaceBoardResources extends CommonSharedResources, AuthenticationResources { public static final RaceBoardResources INSTANCE = GWT.create(RaceBoardResources.class); - - @Source({CommonSharedResources.RESET, CommonSharedResources.MAIN, "raceboard-main.gss"}) - RaceBoardMainCss mainCss(); - - @Source({CommonSharedResources.MEDIA, "raceboard-media.gss"}) - RaceBoardMediaCss mediaCss(); - - + @Source({ CommonSharedResources.RESET, CommonSharedResources.MAIN, "raceboard-main.gss" }) + RaceBoardMainCss mainCss(); + + @Source({ CommonSharedResources.MEDIA, "raceboard-media.gss" }) + RaceBoardMediaCss mediaCss(); + public interface RaceBoardMainCss extends CommonMainCss { String button(); String buttonprimary(); String buttonprimaryoutlined(); String buttonarrowrightwhite(); - String mainsection(); String mainsection_header(); String mainsection_header_title(); - String usermanagement_icon(); String usermanagement_loggedin(); String usermanagement_view(); @@ -33,9 +29,9 @@ public interface RaceBoardResources extends CommonSharedResources, Authenticatio String usermanagement_view_content(); String usermanagement_mobile(); String usermanagement_open(); + String user_menu_premium(); } public interface RaceBoardMediaCss extends CommonMediaCss { } - } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/raceboard-main.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/raceboard-main.gss index b7fc684a8a4..6e0ba8e848a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/raceboard-main.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/raceboard-main.gss @@ -46,3 +46,17 @@ .usermanagement_mobile .usermanagement_view_content { width: 100%; } +.user_menu_premium { + position: absolute; + bottom: -2px; + left: 50%; + transform: translate(-50%, 0%); + margin: 0; + padding: 0 3px; + font-size: 9px; + font-weight: bold; + color: #fff; + background: #efaa00; + line-height: 12px; + border-radius: 0.33em; +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/SAPHeaderWithAuthentication.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/SAPHeaderWithAuthentication.java index 1e8ac052b8a..e68d29ab9c6 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/SAPHeaderWithAuthentication.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/SAPHeaderWithAuthentication.java @@ -37,7 +37,8 @@ public class SAPHeaderWithAuthentication extends SAPHeader { Anchor authenticationMenu = new Anchor(); authenticationMenu.addStyleName(res.css().usermanagement_icon()); rightWithAuthentication.add(authenticationMenu); - authenticationMenuView = new AuthenticationMenuViewImpl(authenticationMenu, res.css().usermanagement_loggedin(), res.css().usermanagement_open()); + authenticationMenuView = new AuthenticationMenuViewImpl(authenticationMenu, res.css().usermanagement_loggedin(), + res.css().usermanagement_open(), res.css().user_menu_premium()); rightWrapper = new SimplePanel(); rightWrapper.addStyleName(res.css().header_right_extension()); rightWithAuthentication.add(rightWrapper); @@ -48,9 +49,10 @@ public class SAPHeaderWithAuthentication extends SAPHeader { public void addWidgetToRightSide(Widget widget) { rightWrapper.add(widget); } - + /** - * @return the {@link AuthenticationMenuView} associated with the authentication control on the right side of the header. + * @return the {@link AuthenticationMenuView} associated with the authentication control on the right side of the + * header. */ public AuthenticationMenuView getAuthenticationMenuView() { return authenticationMenuView; diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/SAPHeaderWithAuthenticationResources.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/SAPHeaderWithAuthenticationResources.java index 0a2f96993e1..75982dae67d 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/SAPHeaderWithAuthenticationResources.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/SAPHeaderWithAuthenticationResources.java @@ -4,23 +4,22 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.CssResource; import com.sap.sse.security.ui.authentication.generic.resource.AuthenticationResources; - public interface SAPHeaderWithAuthenticationResources extends AuthenticationResources { - public static final SAPHeaderWithAuthenticationResources INSTANCE = GWT.create(SAPHeaderWithAuthenticationResources.class); - + public static final SAPHeaderWithAuthenticationResources INSTANCE = GWT + .create(SAPHeaderWithAuthenticationResources.class); + @Source("header-with-authentication.gss") HeaderWithAuthenticationCss css(); - + public interface HeaderWithAuthenticationCss extends CssResource { String header_right_wrapper(); String header_right_extension(); String fixed(); - String usermanagement_icon(); String usermanagement_loggedin(); String usermanagement_view(); String usermanagement_open(); - + String user_menu_premium(); String languageSelector(); } } \ No newline at end of file diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/header-with-authentication.gss b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/header-with-authentication.gss index 5c5b58c42ae..d68357a6c08 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/header-with-authentication.gss +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/generic/sapheader/header-with-authentication.gss @@ -53,3 +53,17 @@ font-size: 100% !important; font-weight: normal; } +.user_menu_premium { + position: absolute; + bottom: -2px; + left: 50%; + transform: translate(-50%, 0%); + margin: 0; + padding: 0 3px; + font-size: 9px; + font-weight: bold; + color: #fff; + background: #efaa00; + line-height: 12px; + border-radius: 0.33em; +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationMenuView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationMenuView.java index 3948e57f42d..977d61792bd 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationMenuView.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationMenuView.java @@ -6,7 +6,7 @@ import com.google.gwt.user.client.ui.IsWidget; * Interface for menu items, which interacting with a {@link FlyoutAuthenticationView}. */ public interface AuthenticationMenuView extends IsWidget { - + /** * Sets the {@link Presenter}. * @@ -14,7 +14,7 @@ public interface AuthenticationMenuView extends IsWidget { * the {@link Presenter} to set */ void setPresenter(Presenter presenter); - + /** * Sets whether or not there is an authenticated user. * @@ -22,7 +22,7 @@ public interface AuthenticationMenuView extends IsWidget { * true if there is an authenticated user, false otherwise */ void setAuthenticated(boolean authenticated); - + /** * Sets whether or not the {@link FlyoutAuthenticationView} is open/shown. * @@ -30,7 +30,15 @@ public interface AuthenticationMenuView extends IsWidget { * true the {@link FlyoutAuthenticationView} is open, false otherwise */ void setOpen(boolean open); - + + /** + * Shows the premium indicator below the user icon. + * + * @param premium + * if premium is visible (active premium role) or not. + */ + void showPremium(boolean premium); + /** * Presenter interface to toggle {@link FlyoutAuthenticationView}'s visibility. */ diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationMenuViewImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationMenuViewImpl.java index 403019c175c..8383bbc124a 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationMenuViewImpl.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationMenuViewImpl.java @@ -4,17 +4,20 @@ import com.google.gwt.debug.client.DebugInfo; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.security.ui.client.i18n.StringMessages; /** * Default implementation of {@link AuthenticationMenuView} based on an {@link Anchor} widget. */ public class AuthenticationMenuViewImpl implements AuthenticationMenuView { - + private Presenter presenter; private final Anchor anchor; private final String loggedInStyle; private final String openStyle; + private final Label usermenuPremium; /** * Create a new {@link AuthenticationMenuViewImpl} instance with the given parameters. @@ -26,7 +29,7 @@ public class AuthenticationMenuViewImpl implements AuthenticationMenuView { * @param openStyle * the style name to add to the widget, if the {@link FlyoutAuthenticationView} is open */ - public AuthenticationMenuViewImpl(Anchor anchor, String loggedInStyle, String openStyle) { + public AuthenticationMenuViewImpl(Anchor anchor, String loggedInStyle, String openStyle, String premiumStyle) { this.anchor = anchor; this.loggedInStyle = loggedInStyle; this.openStyle = openStyle; @@ -37,6 +40,10 @@ public class AuthenticationMenuViewImpl implements AuthenticationMenuView { } }); this.anchor.ensureDebugId("authenticationMenu"); + usermenuPremium = new Label(StringMessages.INSTANCE.premium()); + usermenuPremium.addStyleName(premiumStyle); + usermenuPremium.setVisible(false); + this.anchor.getElement().appendChild(usermenuPremium.getElement()); } @Override @@ -54,13 +61,18 @@ public class AuthenticationMenuViewImpl implements AuthenticationMenuView { anchor.setStyleName(loggedInStyle, authenticated); setDebugDataAttribute("data-auth", authenticated); } - + @Override public void setOpen(boolean open) { anchor.setStyleName(openStyle, open); setDebugDataAttribute("data-open", open); } - + + @Override + public void showPremium(boolean premium) { + usermenuPremium.setVisible(premium); + } + private void setDebugDataAttribute(String name, boolean value) { if (DebugInfo.isDebugIdEnabled()) { anchor.getElement().setAttribute(name, String.valueOf(value)); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/FlyoutAuthenticationPresenter.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/FlyoutAuthenticationPresenter.java index 48f8b9298da..24d9ffe06cd 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/FlyoutAuthenticationPresenter.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/FlyoutAuthenticationPresenter.java @@ -1,6 +1,7 @@ package com.sap.sse.security.ui.authentication.view; import com.google.web.bindery.event.shared.EventBus; +import com.sap.sse.security.shared.impl.SecuredSecurityTypes.UserActions; import com.sap.sse.security.ui.authentication.AuthenticationContextEvent; import com.sap.sse.security.ui.authentication.AuthenticationPlaceManagementController; import com.sap.sse.security.ui.authentication.AuthenticationRequestEvent; @@ -55,9 +56,11 @@ public class FlyoutAuthenticationPresenter implements AuthenticationMenuView.Pre @Override public void onUserChangeEvent(AuthenticationContextEvent event) { authenticationMenuView.setAuthenticated(event.getCtx().isLoggedIn()); + authenticationMenuView.showPremium(event.getCtx().hasPermission(event.getCtx().getCurrentUser(), UserActions.BE_PREMIUM)); } }); authenticationMenuView.setAuthenticated(initialAuthentication.isLoggedIn()); + authenticationMenuView.showPremium(initialAuthentication.hasPermission(initialAuthentication.getCurrentUser(), UserActions.BE_PREMIUM)); } public void showRegister() { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java index 8c828fc31fd..933d6fa6ce1 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java @@ -206,6 +206,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages { String selectSubscriptionPlan(); String features(); String premiumFeature(); + String premium(); String price(); String pleaseSubscribeToUse(); String pleaseSubscribeToUseSpecific(String actionName); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties index 7ee57be0f0e..b8deaa853d1 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties @@ -213,6 +213,7 @@ premiumFeatureListDescription=Compare all the features provided in the FREE or P selectSubscriptionPlan=Please select a subscription plan to subscribe to. features=Features premiumFeature=Premium-Feature +premium=Premium price=Price pleaseSubscribeToUse=You do not have permission to use this feature. Consider Subscribing. pleaseSubscribeToUseSpecific=You do not have permission to use the feature "{0}". Consider acquiring a subscription plan. From 0f9a82d51eceaa0e630c45f2b9efdad9489a7922 Mon Sep 17 00:00:00 2001 From: Dennis Aulenbacher Date: Tue, 10 May 2022 19:17:19 +0200 Subject: [PATCH 29/33] bug5712: Altered Self-Serivce portal button text --- .../com/sap/sailing/gwt/ui/client/StringMessages.properties | 2 +- .../com/sap/sailing/gwt/ui/client/StringMessages_de.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index 36d4f03b1fd..c24e97959a6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -2441,6 +2441,6 @@ orcExplanation=ORC explanation confirmCancelSubscriptionTitle=Cancel Subscription confirmCancelSubscriptionText=Do you really want to cancel your subscription?\n You will loose your aquired premium privileges at the end of the current term. subscriptionOneTimePlanLockedText=This plan may only be aquired once. -goToSelfServicePortalDialogTitle=Go to Self Service Portal? +goToSelfServicePortalDialogTitle=Go to Self Service Portal. goToSelfServicePortalDialogText=This will take you to the subscription providers Self-Service portal. failedFetchingSelfServicePortalSession=Could not open the self service portal. \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index 2e9f31a378a..632ad68042a 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -2451,6 +2451,6 @@ orcExplanation=ORC Anleitung confirmCancelSubscriptionTitle=Abonemment Kündigen. confirmCancelSubscriptionText=Möchten Sie ihr Abonemment wirklich kündigen?\n Sie werden ihre Premium Privilegien am Ende der aktuellen Periode verlieren. subscriptionOneTimePlanLockedText=Dieser Plan ist nur einmalig buchbar. -goToSelfServicePortalDialogTitle=Zum Self Service Portal? +goToSelfServicePortalDialogTitle=Zum Self Service Portal. goToSelfServicePortalDialogText=Self-Service Portal des Abonementanbieters in einem neuen Tab öffnen? failedFetchingSelfServicePortalSession=Self-Service Portal konnte nicht geöffnet werden. \ No newline at end of file From 8a463b5cfee81a08f5cddc2c7f7abdf5cbf79fdc Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 11 May 2022 18:34:36 +0200 Subject: [PATCH 30/33] equinox-3.18.1: set the org.eclipse.osgi/debug/bundleFile/close debug property to true; this may help in understanding what's going on with the locking issue --- java/com.sap.sse.gwt.test/.options | 80 ++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 java/com.sap.sse.gwt.test/.options diff --git a/java/com.sap.sse.gwt.test/.options b/java/com.sap.sse.gwt.test/.options new file mode 100644 index 00000000000..555f0e1e0c6 --- /dev/null +++ b/java/com.sap.sse.gwt.test/.options @@ -0,0 +1,80 @@ +#### Debugging options for org.eclipse.osgi + +# Turn on general debugging for org.eclipse.osgi +org.eclipse.osgi/debug=false +# Prints out location debug information +org.eclipse.osgi/debug/location = false +# Prints out class loading debug information +org.eclipse.osgi/debug/loader=false +# Prints out event (FrameworkEvent/BundleEvent/ServiceEvent) and listener debug information +org.eclipse.osgi/debug/events=false +# Prints out OSGi service debug information (registration/getting/ungetting etc.) +org.eclipse.osgi/debug/services=false +# Prints out bundle manifest parsing debug information +org.eclipse.osgi/debug/manifest=false +# Prints out LDAP filter debug information +org.eclipse.osgi/debug/filter=false +# Prints out security (PermissionAdmin service) debug information +org.eclipse.osgi/debug/security=false +# Prints out start level service debug information +org.eclipse.osgi/debug/startlevel=false +# Prints out package admin service debug information +org.eclipse.osgi/debug/packageadmin=false +# Prints out timing information for loading and calling BundleActivator.start +org.eclipse.osgi/debug/bundleTime=false +# Prints out total time for starting a bundle which includes: +# - loading and calling BundleActivator.start +# - other time spent resolving bundles and firing bundle events to listeners +org.eclipse.osgi/debug/bundleStartTime=false +# Debug the loading of message bundles +org.eclipse.osgi/debug/messageBundles=false +# Debug the object pool additions +org.eclipse.osgi/debug/objectPool/adds=false +# Debug the object pool duplications +org.eclipse.osgi/debug/objectPool/dups=false +# Debug the caching of bundle headers +org.eclipse.osgi/debug/cachedmanifest = false +# Debug the lifecycle operations of the framework/systemBundle +org.eclipse.osgi/debug/systemBundle=false +# Debug the framework persistent storage +org.eclipse.osgi/debug/storage=false +# Debug the bundle file reading +org.eclipse.osgi/debug/bundleFile=false +# Debug the bundle file open calls +org.eclipse.osgi/debug/bundleFile/open=false +# Debug the bundle file close calls +org.eclipse.osgi/debug/bundleFile/close=true + +# Eclipse adaptor options +org.eclipse.osgi/eclipseadaptor/debug = false +org.eclipse.osgi/eclipseadaptor/debug/platformadmin=false +org.eclipse.osgi/eclipseadaptor/debug/platformadmin/resolver=false +org.eclipse.osgi/eclipseadaptor/converter/debug = false + +### OSGi resolver options +# General debug option for the resolver. Enabling this option is equivalent to +# enabling all other resolver debug options. +org.eclipse.osgi/resolver = false +# Displays the current root bundle which is being resolved +org.eclipse.osgi/resolver/roots=false +# Displays information about matching capabilities returned to the resolver and +# why any were filtered out. +org.eclipse.osgi/resolver/providers = false +# Displays information about capabilities or resources that were filtered by +# resolver hooks. +org.eclipse.osgi/resolver/hooks = false +# Displays information about uses constraint violations. +org.eclipse.osgi/resolver/uses = false +# Displays wiring information after the resolve process completes. +org.eclipse.osgi/resolver/wiring = false +# Displays the resolution report information. +org.eclipse.osgi/resolver/report = false + + +#### Monitoring settings + +# monitor eager bundle activation +org.eclipse.osgi/monitor/activation=false +# monitor lazy bundle activation +org.eclipse.osgi/monitor/lazy=false + From acc9007190d17b309749474ca906bace1a46a4a7 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 11 May 2022 18:23:00 +0200 Subject: [PATCH 31/33] equinox-3.18.1: added to the Tycho / Surefire configuration --- java/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/java/pom.xml b/java/pom.xml index 926de3efddf..2eb53234b79 100755 --- a/java/pom.xml +++ b/java/pom.xml @@ -520,6 +520,7 @@ **/*$* ${reportsdirectory} + true From 16ffc3c33ec47ab647723b0ee2691b6e6bb606ca Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 11 May 2022 22:10:00 +0200 Subject: [PATCH 32/33] equinox-3.18.1: added ${extra} also to local target platform mvn build call --- configuration/buildAndUpdateProduct.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configuration/buildAndUpdateProduct.sh b/configuration/buildAndUpdateProduct.sh index 10f6be5e538..54c7e2b1bfb 100755 --- a/configuration/buildAndUpdateProduct.sh +++ b/configuration/buildAndUpdateProduct.sh @@ -612,10 +612,10 @@ if [[ "$@" == "build" ]] || [[ "$@" == "all" ]]; then if [ $p2local -eq 1 ]; then echo "INFO: Building and using local p2 repo" #build local p2 repo - echo "Using following command (pwd: java/com.sap.sailing.targetplatform.base): mvn -fae -s $MAVEN_SETTINGS $clean compile" + echo "Using following command (pwd: java/com.sap.sailing.targetplatform.base): mvn ${extra} -fae -s $MAVEN_SETTINGS $clean compile" echo "Maven version used: `mvn --version`" echo "JAVA_HOME used: $JAVA_HOME" - (cd com.sap.$PROJECT_TYPE.targetplatform.base; mvn -fae -s $MAVEN_SETTINGS $clean compile 2>&1 | tee -a $START_DIR/build.log) + (cd com.sap.$PROJECT_TYPE.targetplatform.base; mvn ${extra} -fae -s $MAVEN_SETTINGS $clean compile 2>&1 | tee -a $START_DIR/build.log) # now get the exit status from mvn, and not that of tee which is what $? contains now MVN_EXIT_CODE=${PIPESTATUS[0]} echo "Maven exit code is $MVN_EXIT_CODE" From 810b1aab6c324481d78d0901130e0f4ee882e8a8 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 12 May 2022 12:29:50 +0200 Subject: [PATCH 33/33] for com.sap.sse.gwt.test we also want to see bundle-open debug output --- java/com.sap.sse.gwt.test/.options | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sse.gwt.test/.options b/java/com.sap.sse.gwt.test/.options index 555f0e1e0c6..2cd960c7a59 100644 --- a/java/com.sap.sse.gwt.test/.options +++ b/java/com.sap.sse.gwt.test/.options @@ -41,7 +41,7 @@ org.eclipse.osgi/debug/storage=false # Debug the bundle file reading org.eclipse.osgi/debug/bundleFile=false # Debug the bundle file open calls -org.eclipse.osgi/debug/bundleFile/open=false +org.eclipse.osgi/debug/bundleFile/open=true # Debug the bundle file close calls org.eclipse.osgi/debug/bundleFile/close=true