diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/DifficulteController.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/DifficulteController.java new file mode 100644 index 0000000..4ca0b1f --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/DifficulteController.java @@ -0,0 +1,29 @@ +package fr.iut.sciencequest.sae.controllers; + + +import fr.iut.sciencequest.sae.entities.Difficulte; +import fr.iut.sciencequest.sae.services.DifficulteService; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + + +@RestController +@RequestMapping("/api/v1/difficultes") +public class DifficulteController { + + public final DifficulteService difficulteService; + + public DifficulteController(DifficulteService difficulteService){ + this.difficulteService = difficulteService; + } + + @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(HttpStatus.OK) + public Iterable getAllDifficultes(){ + return this.difficulteService.findAll(); + } +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/QuestionController.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/QuestionController.java index 484b1c7..1050120 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/QuestionController.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/QuestionController.java @@ -1,7 +1,5 @@ package fr.iut.sciencequest.sae.controllers; -import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; - import fr.iut.sciencequest.sae.entities.Question; import fr.iut.sciencequest.sae.exceptions.IncorrectPageException; import fr.iut.sciencequest.sae.repositories.QuestionRepository; @@ -13,13 +11,15 @@ import org.springframework.hateoas.CollectionModel; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; import org.springframework.http.MediaType; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; -import java.util.Optional; import java.util.List; +import java.util.Optional; + +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; -@Controller +@RestController @RequestMapping("/api/v1/questions") public class QuestionController { diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ScientifiqueController.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ScientifiqueController.java index 27c0dcf..d16cc0c 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ScientifiqueController.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ScientifiqueController.java @@ -1,14 +1,12 @@ package fr.iut.sciencequest.sae.controllers; -import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; - +import fr.iut.sciencequest.sae.entities.IidAndLibelleOnly; import fr.iut.sciencequest.sae.entities.Indice; import fr.iut.sciencequest.sae.entities.Scientifique; import fr.iut.sciencequest.sae.exceptions.DuplicatedFieldException; import fr.iut.sciencequest.sae.exceptions.IncorrectPageException; -import fr.iut.sciencequest.sae.exceptions.ScientifiqueNotFoundException; import fr.iut.sciencequest.sae.repositories.IndiceRepository; -import fr.iut.sciencequest.sae.repositories.ScientifiqueRepository; +import fr.iut.sciencequest.sae.services.interfaces.IScientifiqueService; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -25,25 +23,27 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; + @RestController @RequestMapping("/api/v1/scientifiques") public class ScientifiqueController { - private static final int PAGE_SIZE = 1; - - private final ScientifiqueRepository scientifiqueRepository; + private final IScientifiqueService scientifiqueService; private final IndiceRepository indiceRepository; - public ScientifiqueController(ScientifiqueRepository scientifiqueRepository, IndiceRepository indiceRepository) { - this.scientifiqueRepository = scientifiqueRepository; + private final int PAGE_SIZE = 1; + + public ScientifiqueController(IScientifiqueService scientifiqueService, IndiceRepository indiceRepository) { + this.scientifiqueService = scientifiqueService; this.indiceRepository = indiceRepository; } - private CollectionModel> getPageableCollectionModel(Page pagedResult, Optional page, Method method, Object... args) { + private CollectionModel> getPageableCollectionModel(Page pagedResult, Integer page, Method method, Object... args) { List> entities = pagedResult.map(EntityModel::of).toList(); - List selfObj = new ArrayList<>(List.of(args)); selfObj.add(page.orElse(0)); - Link selfLink = linkTo(ScientifiqueController.class, method, selfObj.toArray()).withSelfRel().expand(page.orElse(0)); + List selfObj = new ArrayList<>(List.of(args)); selfObj.add(page); + Link selfLink = linkTo(ScientifiqueController.class, method, selfObj.toArray()).withSelfRel().expand(page); CollectionModel> result = CollectionModel.of(entities, selfLink); @@ -63,41 +63,30 @@ public class ScientifiqueController { @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public CollectionModel> getAllScientists(@RequestParam(name = "page") Optional page) { - try { - Pageable paging = PageRequest.of(page.orElse(0), PAGE_SIZE); - Page pagedResult = scientifiqueRepository.findAll(paging); - - return getPageableCollectionModel(pagedResult, page, ScientifiqueController.class.getMethod("getAllScientists", Optional.class)); - } catch (IllegalArgumentException e) { - throw new IncorrectPageException("numéro de page incorrect"); - } catch (NoSuchMethodException e) { - throw new RuntimeException(e); - } + return this.scientifiqueService.findAll(page.orElse(0)); } @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public EntityModel> getScientistById(@PathVariable int id) { - Optional scientifiqueOptional = this.scientifiqueRepository.findById(id); - Scientifique scientifique = scientifiqueOptional.orElseThrow(() -> new ScientifiqueNotFoundException("Scientifique non trouvé avec l'ID : " + id)); - - Link selfLink = linkTo(methodOn(ScientifiqueController.class).getScientistById(id)).withSelfRel(); - return EntityModel.of(Optional.ofNullable(scientifique), selfLink); + return this.scientifiqueService.findById(id); } @GetMapping(value="/{id}/indices", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - public CollectionModel> getScientistHints(@PathVariable int id, @RequestParam(name = "page") Optional page) { - try { + public /*CollectionModel>*/ Iterable getScientistHints(@PathVariable int id, @RequestParam(name = "page") Optional page) { + return this.indiceRepository.findByScientifiqueId(id); + + /*try { Pageable paging = PageRequest.of(page.orElse(0), PAGE_SIZE); Page pagedResult = indiceRepository.findAll(paging); - return getPageableCollectionModel(pagedResult, page, ScientifiqueController.class.getMethod("getScientistHints", int.class, Optional.class), id); + return this.getPageableCollectionModel(pagedResult, page.orElse(0), ScientifiqueController.class.getMethod("getScientistHints", int.class, Optional.class), id); } catch (IllegalArgumentException e) { throw new IncorrectPageException("numéro de page incorrect"); } catch (NoSuchMethodException e) { throw new RuntimeException(e); - } + }*/ } @PostMapping(value="/{id}/indices", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ThematiqueController.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ThematiqueController.java index 88c5116..82211c7 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ThematiqueController.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ThematiqueController.java @@ -1,7 +1,7 @@ package fr.iut.sciencequest.sae.controllers; import fr.iut.sciencequest.sae.entities.Thematique; -import fr.iut.sciencequest.sae.services.ThematiqueService; +import fr.iut.sciencequest.sae.services.interfaces.IThematiqueService; import jakarta.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -10,10 +10,9 @@ import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/v1/thematiques") public class ThematiqueController { + private final IThematiqueService thematiqueService; - private final ThematiqueService thematiqueService; - - public ThematiqueController(ThematiqueService thematiqueService) { + public ThematiqueController(IThematiqueService thematiqueService) { this.thematiqueService = thematiqueService; } @@ -23,7 +22,6 @@ public class ThematiqueController { return this.thematiqueService.findAll(); } - //TODO : gestion des erreurs remontées par @Valid //TODO : ajouter liens hateos @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/IidAndLibelleOnly.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/IidAndLibelleOnly.java new file mode 100644 index 0000000..d72c322 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/IidAndLibelleOnly.java @@ -0,0 +1,6 @@ +package fr.iut.sciencequest.sae.entities; + +public interface IidAndLibelleOnly{ + int getId(); + String getLibelle(); +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Indice.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Indice.java index 1f98e69..dead84e 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Indice.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Indice.java @@ -22,6 +22,8 @@ public class Indice { private String libelle; @NotNull - @Column(name="idscientifique") - private int idScientifique; + @JoinColumn(name="idscientifique") + @ManyToOne + private Scientifique scientifique; } + diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/IndiceRepository.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/IndiceRepository.java index 62fa68b..08a0543 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/IndiceRepository.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/IndiceRepository.java @@ -1,5 +1,6 @@ package fr.iut.sciencequest.sae.repositories; +import fr.iut.sciencequest.sae.entities.IidAndLibelleOnly; import fr.iut.sciencequest.sae.entities.Indice; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.PagingAndSortingRepository; @@ -7,5 +8,6 @@ import org.springframework.stereotype.Repository; @Repository public interface IndiceRepository extends PagingAndSortingRepository, CrudRepository { + Iterable findByScientifiqueId(int id); } \ No newline at end of file diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ScientifiqueRepository.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ScientifiqueRepository.java index c47a28a..f68fe74 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ScientifiqueRepository.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ScientifiqueRepository.java @@ -6,4 +6,5 @@ import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.stereotype.Repository; @Repository -public interface ScientifiqueRepository extends PagingAndSortingRepository, CrudRepository {} +public interface ScientifiqueRepository extends PagingAndSortingRepository, CrudRepository { +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/DifficulteService.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/DifficulteService.java new file mode 100644 index 0000000..f9d46cc --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/DifficulteService.java @@ -0,0 +1,20 @@ +package fr.iut.sciencequest.sae.services; + +import fr.iut.sciencequest.sae.entities.Difficulte; +import fr.iut.sciencequest.sae.repositories.DifficulteRepository; +import fr.iut.sciencequest.sae.services.interfaces.IDifficulteService; +import org.springframework.stereotype.Service; + +@Service +public class DifficulteService implements IDifficulteService { + private final DifficulteRepository difficulteRepository; + + public DifficulteService(DifficulteRepository difficulteRepository){ + this.difficulteRepository = difficulteRepository; + } + + @Override + public Iterable findAll(){ + return this.difficulteRepository.findAll(); + } +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/ScientifiqueService.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/ScientifiqueService.java new file mode 100644 index 0000000..8338bbe --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/ScientifiqueService.java @@ -0,0 +1,90 @@ +package fr.iut.sciencequest.sae.services; + +import fr.iut.sciencequest.sae.controllers.ScientifiqueController; +import fr.iut.sciencequest.sae.entities.Scientifique; +import fr.iut.sciencequest.sae.exceptions.IncorrectPageException; +import fr.iut.sciencequest.sae.exceptions.ScientifiqueNotFoundException; +import fr.iut.sciencequest.sae.repositories.IndiceRepository; +import fr.iut.sciencequest.sae.repositories.ScientifiqueRepository; +import fr.iut.sciencequest.sae.services.interfaces.IScientifiqueService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.Link; +import org.springframework.stereotype.Service; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; + +@Service +public class ScientifiqueService implements IScientifiqueService { + + private static final int PAGE_SIZE = 1; + + private final ScientifiqueRepository scientifiqueRepository; + + public ScientifiqueService(ScientifiqueRepository scientifiqueRepository) { + this.scientifiqueRepository = scientifiqueRepository; + } + + private CollectionModel> getPageableCollectionModel(Page pagedResult, Integer page, Method method, Object... args) { + List> entities = pagedResult.map(EntityModel::of).toList(); + + List selfObj = new ArrayList<>(List.of(args)); selfObj.add(page); + Link selfLink = linkTo(ScientifiqueController.class, method, selfObj.toArray()).withSelfRel().expand(page); + + CollectionModel> result = CollectionModel.of(entities, selfLink); + + if (pagedResult.hasPrevious()) { + List previousObj = new ArrayList<>(List.of(args)); previousObj.add(pagedResult.previousPageable().getPageNumber()); + result.add(linkTo(ScientifiqueController.class, method, previousObj.toArray()).withRel("previous")); + } + + if (pagedResult.hasNext()) { + List nextObj = new ArrayList<>(List.of(args)); nextObj.add(pagedResult.nextPageable().getPageNumber()); + result.add(linkTo(ScientifiqueController.class, method, nextObj.toArray()).withRel("next")); + } + + return result; + } + + @Override + public Scientifique update(Scientifique scientifique) { + return null; + } + + @Override + public Scientifique create(Scientifique scientifique) { + return null; + } + + @Override + public CollectionModel> findAll(Integer page) { + try { + Pageable paging = PageRequest.of(page, PAGE_SIZE); + Page pagedResult = scientifiqueRepository.findAll(paging); + + return getPageableCollectionModel(pagedResult, page, ScientifiqueController.class.getMethod("getAllScientists", Optional.class)); + } catch (IllegalArgumentException e) { + throw new IncorrectPageException("numéro de page incorrect"); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + + @Override + public EntityModel> findById(int id) { + Optional scientifiqueOptional = this.scientifiqueRepository.findById(id); + Scientifique scientifique = scientifiqueOptional.orElseThrow(() -> new ScientifiqueNotFoundException("Scientifique non trouvé avec l'ID : " + id)); + + Link selfLink = linkTo(methodOn(ScientifiqueController.class).getScientistById(id)).withSelfRel(); + return EntityModel.of(Optional.ofNullable(scientifique), selfLink); + } +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/ThematiqueService.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/ThematiqueService.java index 2c29ab7..9781563 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/ThematiqueService.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/ThematiqueService.java @@ -1,12 +1,48 @@ package fr.iut.sciencequest.sae.services; - import fr.iut.sciencequest.sae.entities.Thematique; +import fr.iut.sciencequest.sae.exceptions.DuplicatedFieldException; +import fr.iut.sciencequest.sae.exceptions.DuplicatedIdException; +import fr.iut.sciencequest.sae.exceptions.EntityNotFoundException; +import fr.iut.sciencequest.sae.repositories.ThematiqueRepository; +import fr.iut.sciencequest.sae.services.interfaces.IThematiqueService; +import org.springframework.stereotype.Service; + +@Service +public class ThematiqueService implements IThematiqueService { + + private final ThematiqueRepository thematiqueRepository; + + public ThematiqueService(ThematiqueRepository thematiqueRepository){ + this.thematiqueRepository = thematiqueRepository; + } + + private void checkFieldsConstraints(Thematique thematique){ + if(this.thematiqueRepository.existsByLibelle(thematique.getLibelle())){ + throw new DuplicatedFieldException("libelle"); + } + } + @Override + public Thematique update(Thematique thematique){ + if(!this.thematiqueRepository.existsById(thematique.getId())){ + throw new EntityNotFoundException(); + } + this.checkFieldsConstraints(thematique); + return this.thematiqueRepository.save(thematique); + } -public interface ThematiqueService { - public Thematique update(Thematique thematique); + @Override + public Thematique create(Thematique thematique){ + if(this.thematiqueRepository.existsById(thematique.getId())){ + throw new DuplicatedIdException(); + } + this.checkFieldsConstraints(thematique); + return this.thematiqueRepository.save(thematique); + } - public Thematique create(Thematique thematique); + @Override + public Iterable findAll(){ + return this.thematiqueRepository.findAll(); + } - public Iterable findAll(); } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/ThematiqueServiceImpl.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/ThematiqueServiceImpl.java deleted file mode 100644 index 92458fa..0000000 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/ThematiqueServiceImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package fr.iut.sciencequest.sae.services; - -import fr.iut.sciencequest.sae.entities.Thematique; -import fr.iut.sciencequest.sae.exceptions.DuplicatedFieldException; -import fr.iut.sciencequest.sae.exceptions.DuplicatedIdException; -import fr.iut.sciencequest.sae.exceptions.EntityNotFoundException; -import fr.iut.sciencequest.sae.repositories.ThematiqueRepository; -import org.springframework.stereotype.Service; - -@Service -public class ThematiqueServiceImpl implements ThematiqueService{ - - private final ThematiqueRepository thematiqueRepository; - - public ThematiqueServiceImpl(ThematiqueRepository thematiqueRepository){ - this.thematiqueRepository = thematiqueRepository; - } - - private void checkFieldsConstraints(Thematique thematique){ - if(this.thematiqueRepository.existsByLibelle(thematique.getLibelle())){ - throw new DuplicatedFieldException("libelle"); - } - } - @Override - public Thematique update(Thematique thematique){ - if(!this.thematiqueRepository.existsById(thematique.getId())){ - throw new EntityNotFoundException(); - } - this.checkFieldsConstraints(thematique); - return this.thematiqueRepository.save(thematique); - } - - @Override - public Thematique create(Thematique thematique){ - if(this.thematiqueRepository.existsById(thematique.getId())){ - throw new DuplicatedIdException(); - } - this.checkFieldsConstraints(thematique); - return this.thematiqueRepository.save(thematique); - } - - @Override - public Iterable findAll(){ - return this.thematiqueRepository.findAll(); - } - -} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/interfaces/IDifficulteService.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/interfaces/IDifficulteService.java new file mode 100644 index 0000000..2d0a7f4 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/interfaces/IDifficulteService.java @@ -0,0 +1,7 @@ +package fr.iut.sciencequest.sae.services.interfaces; + +import fr.iut.sciencequest.sae.entities.Difficulte; + +public interface IDifficulteService { + Iterable findAll(); +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/interfaces/IScientifiqueService.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/interfaces/IScientifiqueService.java new file mode 100644 index 0000000..74fdbd2 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/interfaces/IScientifiqueService.java @@ -0,0 +1,17 @@ +package fr.iut.sciencequest.sae.services.interfaces; + +import fr.iut.sciencequest.sae.entities.Scientifique; +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.EntityModel; + +import java.util.Optional; + +public interface IScientifiqueService { + Scientifique update(Scientifique scientifique); + + Scientifique create(Scientifique scientifique); + + CollectionModel> findAll(Integer page); + + EntityModel> findById(int id); +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/interfaces/IThematiqueService.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/interfaces/IThematiqueService.java new file mode 100644 index 0000000..8296cf3 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/interfaces/IThematiqueService.java @@ -0,0 +1,12 @@ +package fr.iut.sciencequest.sae.services.interfaces; + + +import fr.iut.sciencequest.sae.entities.Thematique; + +public interface IThematiqueService { + Thematique update(Thematique thematique); + + Thematique create(Thematique thematique); + + Iterable findAll(); +}