Skip to content

Commit

Permalink
#657 removal/cleanup of requestcontextutils.getlocale (#668)
Browse files Browse the repository at this point in the history
* initial groundwork for removing use of  RequestContextUtils.getLocale and LocaleUtil.getTicketLanguage #657

* remove use of RequestContextUtils.getLocale #657

* remove language interceptor+session support. Switch all new Locale/Locale.forLanguageTag to our null safe helper #657

* additional work for handling locales #657

* additional work for handling locales: admin rest api #657

* additional work for handling locales: fallback + filter language #657

* re-add @deprecated annotation in conf manager #657

* update frontend
  • Loading branch information
syjer authored and cbellone committed Jun 20, 2019
1 parent 8a2e505 commit 8646913
Show file tree
Hide file tree
Showing 22 changed files with 170 additions and 171 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@ junitVersion=5.1.0
systemProp.jdk.tls.client.protocols="TLSv1,TLSv1.1,TLSv1.2"

# https://jitpack.io/#alfio-event/alf.io-public-frontend -> go to commit tab, set the version
alfioPublicFrontendVersion=68b32dac99
alfioPublicFrontendVersion=c397155127
25 changes: 0 additions & 25 deletions src/main/java/alfio/config/MvcConfiguration.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,9 @@
import org.springframework.web.servlet.*;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import org.springframework.web.servlet.view.mustache.MustacheViewResolver;
import org.springframework.web.servlet.view.mustache.jmustache.JMustacheTemplateFactory;
import org.springframework.web.servlet.view.mustache.jmustache.JMustacheTemplateLoader;
import org.springframework.web.servlet.view.mustache.jmustache.LocalizationMessageInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
Expand Down Expand Up @@ -96,18 +93,9 @@ public void addResourceHandlers(ResourceHandlerRegistry registry) {

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getLocaleChangeInterceptor());
registry.addInterceptor(getTemplateMessagesInterceptor());
registry.addInterceptor(getCSPInterceptor());
}

@Bean
public HandlerInterceptor getLocaleChangeInterceptor(){
LocaleChangeInterceptor localeChangeInterceptor= new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("lang");
return localeChangeInterceptor;
}

private HandlerInterceptor getCSPInterceptor() {
return new HandlerInterceptorAdapter() {
@Override
Expand Down Expand Up @@ -145,19 +133,6 @@ public void postHandle(HttpServletRequest request, HttpServletResponse response,
};
}

@Bean
public LocalizationMessageInterceptor getTemplateMessagesInterceptor() {
LocalizationMessageInterceptor interceptor = new LocalizationMessageInterceptor();
interceptor.setLocaleResolver(getLocaleResolver());
interceptor.setMessageSource(messageSource);
return interceptor;
}

@Bean(name = "localeResolver")
public LocaleResolver getLocaleResolver() {
return new SessionLocaleResolver();
}

@Bean
public ViewResolver getViewResolver(Environment env) throws Exception {
MustacheViewResolver viewResolver = new MustacheViewResolver();
Expand Down
19 changes: 9 additions & 10 deletions src/main/java/alfio/controller/api/admin/EventApiController.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,7 @@
import alfio.repository.DynamicFieldTemplateRepository;
import alfio.repository.SponsorScanRepository;
import alfio.repository.TicketFieldRepository;
import alfio.util.ExportUtils;
import alfio.util.MonetaryUtil;
import alfio.util.TemplateManager;
import alfio.util.Validator;
import alfio.util.*;
import com.opencsv.CSVReader;
import lombok.AllArgsConstructor;
import lombok.Data;
Expand All @@ -53,7 +50,6 @@
import org.springframework.dao.DataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.ui.Model;
import org.springframework.util.StreamUtils;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.*;
Expand Down Expand Up @@ -513,12 +509,15 @@ public Integer getPendingPaymentsCount(@PathVariable("eventName") String eventNa
}

@RequestMapping(value = "/events/{eventName}/pending-payments/{reservationId}/confirm", method = POST)
public String confirmPayment(@PathVariable("eventName") String eventName, @PathVariable("reservationId") String reservationId, Principal principal,
Model model, HttpServletRequest request) {
ticketReservationManager.confirmOfflinePayment(loadEvent(eventName, principal), reservationId, principal.getName());
public String confirmPayment(@PathVariable("eventName") String eventName, @PathVariable("reservationId") String reservationId, Principal principal) {
var event = loadEvent(eventName, principal);
ticketReservationManager.confirmOfflinePayment(event, reservationId, principal.getName());
ticketReservationManager.findById(reservationId)
.filter(TicketReservation::isDirectAssignmentRequested)
.ifPresent(reservation -> ticketHelper.directTicketAssignment(eventName, reservationId, reservation.getEmail(), reservation.getFullName(), reservation.getFirstName(), reservation.getLastName(), reservation.getUserLanguage(), Optional.empty(), request, model));
.ifPresent(reservation -> {
Locale locale = LocaleUtil.forLanguageTag(reservation.getUserLanguage(), event);
ticketHelper.directTicketAssignment(eventName, reservationId, reservation.getEmail(), reservation.getFullName(), reservation.getFirstName(), reservation.getLastName(), reservation.getUserLanguage(), Optional.empty(), locale);
});
return OK;
}

Expand Down Expand Up @@ -586,7 +585,7 @@ public void getAllInvoices(@PathVariable("eventName") String eventName, HttpServ
TicketReservation reservation = pair.getLeft();
BillingDocument document = pair.getRight();
Map<String, Object> reservationModel = document.getModel();
Optional<byte[]> pdf = TemplateProcessor.buildInvoicePdf(event, fileUploadManager, new Locale(reservation.getUserLanguage()), templateManager, reservationModel, extensionManager);
Optional<byte[]> pdf = TemplateProcessor.buildInvoicePdf(event, fileUploadManager, LocaleUtil.forLanguageTag(reservation.getUserLanguage()), templateManager, reservationModel, extensionManager);

if(pdf.isPresent()) {
zipOS.putNextEntry(new ZipEntry("invoice-" + eventName + "-id-" + reservation.getId() + "-invoice-nr-" + document.getNumber() + ".pdf"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import alfio.model.user.Organization;
import alfio.repository.EventRepository;
import alfio.repository.user.OrganizationRepository;
import alfio.util.LocaleUtil;
import alfio.util.TemplateManager;
import alfio.util.TemplateResource;
import com.samskivert.mustache.MustacheException;
Expand Down Expand Up @@ -112,7 +113,7 @@ public void getTemplate(@PathVariable("name") TemplateResource name, @PathVariab
try (InputStream is = new ClassPathResource(name.classPath()).getInputStream()) {
is.transferTo(os);
}
Locale loc = Locale.forLanguageTag(locale);
Locale loc = LocaleUtil.forLanguageTag(locale);
String template = new String(os.toByteArray(), StandardCharsets.UTF_8);

response.setContentType("text/plain");
Expand All @@ -128,7 +129,7 @@ public void previewTemplate(@PathVariable("name") TemplateResource name, @PathVa
HttpServletResponse response) throws IOException {


Locale loc = Locale.forLanguageTag(locale);
Locale loc = LocaleUtil.forLanguageTag(locale);

if (organizationId != null) {
Event event;
Expand Down
43 changes: 14 additions & 29 deletions src/main/java/alfio/controller/api/support/TicketHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,9 @@
import org.apache.commons.lang3.tuple.Triple;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.servlet.support.RequestContextUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
Expand Down Expand Up @@ -82,20 +78,18 @@ public Optional<Triple<ValidationResult, Event, Ticket>> assignTicket(String eve
String ticketIdentifier,
UpdateTicketOwnerForm updateTicketOwner,
Optional<Errors> bindingResult,
HttpServletRequest request,
Consumer<Triple<ValidationResult, Event, Ticket>> reservationConsumer,
Locale fallbackLocale,
Optional<UserDetails> userDetails,
boolean addPrefix) {

Optional<Triple<ValidationResult, Event, Ticket>> triple = ticketReservationManager.fetchComplete(eventName, ticketIdentifier)
.map(result -> assignTicket(updateTicketOwner, bindingResult, request, userDetails, result, addPrefix ? "tickets["+ticketIdentifier+"]" : ""));
triple.ifPresent(reservationConsumer);
.map(result -> assignTicket(updateTicketOwner, bindingResult, fallbackLocale, userDetails, result, addPrefix ? "tickets["+ticketIdentifier+"]" : ""));
return triple;
}

private Triple<ValidationResult, Event, Ticket> assignTicket(UpdateTicketOwnerForm updateTicketOwner,
Optional<Errors> bindingResult,
HttpServletRequest request,
Locale fallbackLocale,
Optional<UserDetails> userDetails,
Triple<Event, TicketReservation, Ticket> result,
String formPrefix) {
Expand Down Expand Up @@ -123,7 +117,7 @@ private Triple<ValidationResult, Event, Ticket> assignTicket(UpdateTicketOwnerFo
Validator.AdvancedValidationContext context = new Validator.AdvancedValidationContext(updateTicketOwner, fieldConf, t.getCategoryId(), t.getUuid(), formPrefix);
ValidationResult validationResult = Validator.validateTicketAssignment(updateTicketOwner, ticketFieldFilterer.getFieldsForTicket(t.getUuid()), bindingResult, event, formPrefix, sameCountryValidator)
.or(Validator.performAdvancedValidation(advancedValidator, context, bindingResult.orElse(null)))
.ifSuccess(() -> updateTicketOwner(updateTicketOwner, request, t, event, ticketReservation, userDetails));
.ifSuccess(() -> updateTicketOwner(updateTicketOwner, fallbackLocale, t, event, ticketReservation, userDetails));
return Triple.of(validationResult, event, ticketRepository.findByUUID(t.getUuid()));
}

Expand All @@ -135,29 +129,21 @@ public Optional<Triple<ValidationResult, Event, Ticket>> preAssignTicket(String
String ticketIdentifier,
UpdateTicketOwnerForm updateTicketOwner,
Optional<Errors> bindingResult,
HttpServletRequest request,
Consumer<Triple<ValidationResult, Event, Ticket>> reservationConsumer,
Locale fallbackLocale,
Optional<UserDetails> userDetails) {

Optional<Triple<ValidationResult, Event, Ticket>> triple = ticketReservationManager.from(eventName, reservationId, ticketIdentifier)
.filter(temp -> PENDING_RESERVATION_STATUSES.contains(temp.getMiddle().getStatus()) && temp.getRight().getStatus() == Ticket.TicketStatus.PENDING)
.map(result -> assignTicket(updateTicketOwner, bindingResult, request, userDetails, result, "tickets["+ticketIdentifier+"]"));
triple.ifPresent(reservationConsumer);
.map(result -> assignTicket(updateTicketOwner, bindingResult, fallbackLocale, userDetails, result, "tickets["+ticketIdentifier+"]"));
return triple;
}

public Optional<Triple<ValidationResult, Event, Ticket>> assignTicket(String eventName,
String ticketIdentifier,
UpdateTicketOwnerForm updateTicketOwner,
Optional<Errors> bindingResult,
HttpServletRequest request,
Model model) {
return assignTicket(eventName, ticketIdentifier, updateTicketOwner, bindingResult, request, t -> {
model.addAttribute("value", t.getRight());
model.addAttribute("validationResult", t.getLeft());
model.addAttribute("countries", getLocalizedCountries(RequestContextUtils.getLocale(request)));
model.addAttribute("event", t.getMiddle());
}, Optional.empty(), false);
Locale locale) {
return assignTicket(eventName, ticketIdentifier, updateTicketOwner, bindingResult, locale, Optional.empty(), false);
}

public Optional<Triple<ValidationResult, Event, Ticket>> directTicketAssignment(String eventName,
Expand All @@ -168,8 +154,7 @@ public Optional<Triple<ValidationResult, Event, Ticket>> directTicketAssignment(
String lastName,
String userLanguage,
Optional<Errors> bindingResult,
HttpServletRequest request,
Model model) {
Locale locale) {
List<Ticket> tickets = ticketReservationManager.findTicketsInReservation(reservationId);
if(tickets.size() > 1) {
return Optional.empty();
Expand All @@ -182,7 +167,7 @@ public Optional<Triple<ValidationResult, Event, Ticket>> directTicketAssignment(
form.setFirstName(firstName);
form.setLastName(lastName);
form.setUserLanguage(userLanguage);
return assignTicket(eventName, ticketUuid, form, bindingResult, request, model);
return assignTicket(eventName, ticketUuid, form, bindingResult, locale);
}

public static List<Pair<String, String>> getLocalizedCountries(Locale locale) {
Expand Down Expand Up @@ -215,13 +200,13 @@ private static List<Pair<String, String>> mapISOCountries(Stream<String> isoCoun
.collect(Collectors.toList());
}

private void updateTicketOwner(UpdateTicketOwnerForm updateTicketOwner, HttpServletRequest request, Ticket t, Event event, TicketReservation ticketReservation, Optional<UserDetails> userDetails) {
private void updateTicketOwner(UpdateTicketOwnerForm updateTicketOwner, Locale fallBackLocale, Ticket t, Event event, TicketReservation ticketReservation, Optional<UserDetails> userDetails) {
Locale language = Optional.ofNullable(updateTicketOwner.getUserLanguage())
.filter(StringUtils::isNotBlank)
.map(Locale::forLanguageTag)
.orElseGet(() -> RequestContextUtils.getLocale(request));
.map(LocaleUtil::forLanguageTag)
.orElse(fallBackLocale);
TicketCategory category = ticketCategoryRepository.getById(t.getCategoryId());
var ticketLanguage = LocaleUtil.getTicketLanguage(t, request);
var ticketLanguage = LocaleUtil.getTicketLanguage(t, fallBackLocale);
ticketReservationManager.updateTicketOwner(t, language, event, updateTicketOwner,
getConfirmationTextBuilder(ticketLanguage, event, ticketReservation, t, category),
getOwnerChangeTextBuilder(ticketLanguage, t, event),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import alfio.manager.system.ConfigurationManager;
import alfio.model.system.ConfigurationKeys;
import alfio.util.CustomResourceBundleMessageSource;
import alfio.util.LocaleUtil;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.web.bind.annotation.GetMapping;
Expand Down Expand Up @@ -62,7 +63,7 @@ public Map<String, String> getAdminTranslations(@PathVariable("lang") String lan
}

private Map<String, String> getBundleAsMap(String baseName, String lang) {
var locale = new Locale(lang);
var locale = LocaleUtil.forLanguageTag(lang);
return messageSource.getKeys(baseName, locale)
.stream()
.collect(Collectors.toMap(Function.identity(), k -> messageSource.getMessage(k, EMPTY_ARRAY, locale)
Expand All @@ -72,17 +73,17 @@ private Map<String, String> getBundleAsMap(String baseName, String lang) {

@GetMapping("/public/i18n/countries/{lang}")
public List<LocalizedCountry> getCountries(@PathVariable("lang") String lang) {
return fromPair(TicketHelper.getLocalizedCountries(Locale.forLanguageTag(lang)));
return fromPair(TicketHelper.getLocalizedCountries(LocaleUtil.forLanguageTag(lang)));
}

@GetMapping("/public/i18n/countries-vat/{lang}")
public List<LocalizedCountry> getCountriesForVat(@PathVariable("lang") String lang) {
return fromPair(TicketHelper.getLocalizedCountriesForVat(Locale.forLanguageTag(lang)));
return fromPair(TicketHelper.getLocalizedCountriesForVat(LocaleUtil.forLanguageTag(lang)));
}

@GetMapping("/public/i18n/eu-countries-vat/{lang}")
public List<LocalizedCountry> getEuCountriesForVat(@PathVariable("lang") String lang) {
var countries = TicketHelper.getLocalizedEUCountriesForVat(Locale.forLanguageTag(lang),
var countries = TicketHelper.getLocalizedEUCountriesForVat(LocaleUtil.forLanguageTag(lang),
configurationManager.getFor(ConfigurationKeys.EU_COUNTRIES_LIST).getRequiredValue());
return fromPair(countries);
}
Expand Down
Loading

0 comments on commit 8646913

Please sign in to comment.