use of org.springframework.ui.Model in project spring-framework by spring-projects.
the class ModelAttributeMethodArgumentResolver method resolveArgument.
@Override
public Mono<Object> resolveArgument(MethodParameter parameter, BindingContext context, ServerWebExchange exchange) {
ResolvableType type = ResolvableType.forMethodParameter(parameter);
ReactiveAdapter adapter = getAdapterRegistry().getAdapter(type.resolve());
ResolvableType valueType = (adapter != null ? type.getGeneric(0) : type);
Assert.state(adapter == null || !adapter.isMultiValue(), getClass().getSimpleName() + " doesn't support multi-value reactive type wrapper: " + parameter.getGenericParameterType());
String name = getAttributeName(valueType, parameter);
Mono<?> valueMono = getAttributeMono(name, valueType, context.getModel());
Map<String, Object> model = context.getModel().asMap();
MonoProcessor<BindingResult> bindingResultMono = MonoProcessor.create();
model.put(BindingResult.MODEL_KEY_PREFIX + name, bindingResultMono);
return valueMono.then(value -> {
WebExchangeDataBinder binder = context.createDataBinder(exchange, value, name);
return binder.bind(exchange).doOnError(bindingResultMono::onError).doOnSuccess(aVoid -> {
validateIfApplicable(binder, parameter);
BindingResult errors = binder.getBindingResult();
model.put(BindingResult.MODEL_KEY_PREFIX + name, errors);
model.put(name, value);
bindingResultMono.onNext(errors);
}).then(Mono.fromCallable(() -> {
BindingResult errors = binder.getBindingResult();
if (adapter != null) {
return adapter.fromPublisher(errors.hasErrors() ? Mono.error(new WebExchangeBindException(parameter, errors)) : valueMono);
} else {
if (errors.hasErrors() && !hasErrorsArgument(parameter)) {
throw new WebExchangeBindException(parameter, errors);
}
return value;
}
}));
});
}
use of org.springframework.ui.Model in project spring-framework by spring-projects.
the class ViewResolutionResultHandler method resolveAsyncAttributes.
private Mono<Void> resolveAsyncAttributes(Map<String, Object> model) {
List<String> names = new ArrayList<>();
List<Mono<?>> valueMonos = new ArrayList<>();
for (Map.Entry<String, ?> entry : model.entrySet()) {
ReactiveAdapter adapter = getAdapterRegistry().getAdapter(null, entry.getValue());
if (adapter != null) {
names.add(entry.getKey());
if (adapter.isMultiValue()) {
Flux<Object> value = Flux.from(adapter.toPublisher(entry.getValue()));
valueMonos.add(value.collectList().defaultIfEmpty(Collections.emptyList()));
} else {
Mono<Object> value = Mono.from(adapter.toPublisher(entry.getValue()));
valueMonos.add(value.defaultIfEmpty(NO_VALUE));
}
}
}
if (names.isEmpty()) {
return Mono.empty();
}
return Mono.when(valueMonos, values -> {
for (int i = 0; i < values.length; i++) {
if (values[i] != NO_VALUE) {
model.put(names.get(i), values[i]);
} else {
model.remove(names.get(i));
}
}
return NO_VALUE;
}).then();
}
use of org.springframework.ui.Model in project spring-framework by spring-projects.
the class ViewResolutionResultHandler method addBindingResult.
private void addBindingResult(BindingContext context, ServerWebExchange exchange) {
Map<String, Object> model = context.getModel().asMap();
model.keySet().stream().filter(name -> isBindingCandidate(name, model.get(name))).filter(name -> !model.containsKey(BindingResult.MODEL_KEY_PREFIX + name)).forEach(name -> {
WebExchangeDataBinder binder = context.createDataBinder(exchange, model.get(name), name);
model.put(BindingResult.MODEL_KEY_PREFIX + name, binder.getBindingResult());
});
}
use of org.springframework.ui.Model in project spring-framework by spring-projects.
the class ControllerAdviceTests method modelAttributeAdvice.
@Test
public void modelAttributeAdvice() throws Exception {
ApplicationContext context = new AnnotationConfigApplicationContext(TestConfig.class);
RequestMappingHandlerAdapter adapter = createAdapter(context);
TestController controller = context.getBean(TestController.class);
Model model = handle(adapter, controller, "handle").getModel();
assertEquals(2, model.asMap().size());
assertEquals("lAttr1", model.asMap().get("attr1"));
assertEquals("gAttr2", model.asMap().get("attr2"));
}
use of org.springframework.ui.Model in project goci by EBISPOT.
the class AssociationController method editAssociation.
//Edit existing association
// We tried to remap if the snp or genes changed.
// TODO : implement something for SNP:SNP iteration. Actually we remap.
@RequestMapping(value = "/associations/{associationId}", produces = MediaType.TEXT_HTML_VALUE, method = RequestMethod.POST)
public // TODO COULD REFACTOR TO JUST USE SUPERCLASS AS METHOD PARAMETER
String editAssociation(@ModelAttribute SnpAssociationStandardMultiForm snpAssociationStandardMultiForm, @ModelAttribute SnpAssociationInteractionForm snpAssociationInteractionForm, @PathVariable Long associationId, @RequestParam(value = "associationtype", required = true) String associationType, Model model, HttpServletRequest request, RedirectAttributes redirectAttributes) throws EnsemblMappingException {
// Establish study and association we are editing
Collection<String> previousAuthorReportedGenes = new HashSet<>();
Collection<String> authorReportedGenes = new HashSet<>();
Collection<String> previousSnps = new HashSet<>();
Collection<String> snps = new HashSet<>();
String isToRemapping = "yes";
Association associationToEdit = associationRepository.findOne(associationId);
Long studyId = associationToEdit.getStudy().getId();
Study study = studyRepository.findOne(studyId);
model.addAttribute("study", study);
AssociationReport oldAssociationReport = associationToEdit.getAssociationReport();
previousAuthorReportedGenes = associationOperationsService.getGenesIds(associationToEdit.getLoci());
previousSnps = associationOperationsService.getSpnsName(associationToEdit.getSnps());
// Determine if association is an OR or BETA type
String measurementType = associationOperationsService.determineIfAssociationIsOrType(associationToEdit);
model.addAttribute("measurementType", measurementType);
// Validate returned form depending on association type
List<AssociationValidationView> criticalErrors = new ArrayList<>();
if (associationType.equalsIgnoreCase("interaction")) {
criticalErrors = associationOperationsService.checkSnpAssociationInteractionFormErrors(snpAssociationInteractionForm, measurementType);
} else {
criticalErrors = associationOperationsService.checkSnpAssociationFormErrors(snpAssociationStandardMultiForm, measurementType);
}
// If errors found then return the edit form with all information entered by curator preserved
if (!criticalErrors.isEmpty()) {
// Get mapping details
model.addAttribute("mappingDetails", associationOperationsService.createMappingDetails(associationToEdit));
// Return any association errors
model.addAttribute("errors", criticalErrors);
model.addAttribute("criticalErrorsFound", true);
if (associationType.equalsIgnoreCase("interaction")) {
model.addAttribute("form", snpAssociationInteractionForm);
return "edit_snp_interaction_association";
} else {
model.addAttribute("form", snpAssociationStandardMultiForm);
// Determine view
if (associationToEdit.getMultiSnpHaplotype()) {
return "edit_multi_snp_association";
} else {
return "edit_standard_snp_association";
}
}
} else {
//Create association
Association editedAssociation;
// Request parameter determines how to process form and also which form to process
if (associationType.equalsIgnoreCase("interaction")) {
editedAssociation = snpInteractionAssociationService.createAssociation(snpAssociationInteractionForm);
} else {
editedAssociation = singleSnpMultiSnpAssociationService.createAssociation(snpAssociationStandardMultiForm);
// New snps to compare with the previousSnps.
Collection<SnpFormRow> newSnpsList = snpAssociationStandardMultiForm.getSnpFormRows();
if (newSnpsList != null && !newSnpsList.isEmpty()) {
for (SnpFormRow snp : newSnpsList) {
snps.add(snp.getSnp());
}
}
}
authorReportedGenes = associationOperationsService.getGenesIds(editedAssociation.getLoci());
if (oldAssociationReport != null) {
if ((previousAuthorReportedGenes.size() == authorReportedGenes.size()) && (snps.size() == snps.size())) {
//check the values
if ((authorReportedGenes.equals(previousAuthorReportedGenes)) && (snps.equals(previousSnps))) {
editedAssociation.setLastMappingDate(associationToEdit.getLastMappingDate());
editedAssociation.setLastMappingPerformedBy(associationToEdit.getLastMappingPerformedBy());
editedAssociation.setAssociationReport(oldAssociationReport);
isToRemapping = "no";
}
}
}
if ((oldAssociationReport != null) && (isToRemapping.compareTo("yes") == 0)) {
associationOperationsService.deleteAssocationReport(associationToEdit.getAssociationReport().getId());
}
// Save and validate form
String eRelease = ensemblRestTemplateService.getRelease();
Collection<AssociationValidationView> errors = associationOperationsService.saveEditedAssociationFromForm(study, editedAssociation, associationId, currentUserDetailsService.getUserFromRequest(request), eRelease);
// Determine if we have any errors rather than warnings
long errorCount = errors.stream().filter(validationError -> !validationError.getWarning()).count();
if (errorCount > 0) {
// Get mapping details for association we're editing
model.addAttribute("mappingDetails", associationOperationsService.createMappingDetails(associationToEdit));
model.addAttribute("errors", errors);
model.addAttribute("criticalErrorsFound", true);
if (associationType.equalsIgnoreCase("interaction")) {
model.addAttribute("form", snpAssociationInteractionForm);
return "edit_snp_interaction_association";
} else {
model.addAttribute("form", snpAssociationStandardMultiForm);
// Determine view
if (associationToEdit.getMultiSnpHaplotype()) {
return "edit_multi_snp_association";
} else {
return "edit_standard_snp_association";
}
}
} else {
redirectAttributes.addFlashAttribute("isToRemapping", isToRemapping);
return "redirect:/associations/" + associationId;
}
}
}
Aggregations