Commit 62d24433810f4b834c1ecf95dc9f2a0703bdda72
1 parent
7a765da2
improvement: Kontext und Mapper für create- und updateUser() optimiert
Showing
7 changed files
with
53 additions
and
48 deletions
src/main/java/net/ziemers/swxercise/lg/user/dto/UserDto.java
| 1 | package net.ziemers.swxercise.lg.user.dto; | 1 | package net.ziemers.swxercise.lg.user.dto; |
| 2 | 2 | ||
| 3 | +import net.ziemers.swxercise.lg.model.user.User; | ||
| 4 | + | ||
| 3 | import javax.validation.constraints.NotNull; | 5 | import javax.validation.constraints.NotNull; |
| 4 | 6 | ||
| 5 | /** | 7 | /** |
| @@ -8,7 +10,7 @@ import javax.validation.constraints.NotNull; | @@ -8,7 +10,7 @@ import javax.validation.constraints.NotNull; | ||
| 8 | */ | 10 | */ |
| 9 | public class UserDto { | 11 | public class UserDto { |
| 10 | 12 | ||
| 11 | - private Long entityId; | 13 | + private User user = null; |
| 12 | 14 | ||
| 13 | @NotNull | 15 | @NotNull |
| 14 | private String username; // aus dem Profile | 16 | private String username; // aus dem Profile |
| @@ -22,12 +24,12 @@ public class UserDto { | @@ -22,12 +24,12 @@ public class UserDto { | ||
| 22 | 24 | ||
| 23 | private String mailaddress; // aus dem Profile | 25 | private String mailaddress; // aus dem Profile |
| 24 | 26 | ||
| 25 | - public Long getEntityId() { | ||
| 26 | - return entityId; | 27 | + public User getUser() { |
| 28 | + return user; | ||
| 27 | } | 29 | } |
| 28 | 30 | ||
| 29 | - public void setEntityId(Long entityId) { | ||
| 30 | - this.entityId = entityId; | 31 | + public void setUser(User user) { |
| 32 | + this.user = user; | ||
| 31 | } | 33 | } |
| 32 | 34 | ||
| 33 | public String getUsername() { | 35 | public String getUsername() { |
src/main/java/net/ziemers/swxercise/lg/user/service/EntityToUserDtoMapper.java
| @@ -9,7 +9,7 @@ import net.ziemers.swxercise.lg.user.dto.UserDto; | @@ -9,7 +9,7 @@ import net.ziemers.swxercise.lg.user.dto.UserDto; | ||
| 9 | public class EntityToUserDtoMapper { | 9 | public class EntityToUserDtoMapper { |
| 10 | 10 | ||
| 11 | /** | 11 | /** |
| 12 | - * Erzeugt ein DTO aus dem übergebenem Kontext. | 12 | + * Erzeugt ein Data Transfer Object aus dem übergebenem Kontext. |
| 13 | * | 13 | * |
| 14 | * @param ctx der Kontext | 14 | * @param ctx der Kontext |
| 15 | * @return das erzeugte DTO. | 15 | * @return das erzeugte DTO. |
| @@ -18,15 +18,15 @@ public class EntityToUserDtoMapper { | @@ -18,15 +18,15 @@ public class EntityToUserDtoMapper { | ||
| 18 | final UserDto dto = new UserDto(); | 18 | final UserDto dto = new UserDto(); |
| 19 | 19 | ||
| 20 | if (ctx.user != null) { | 20 | if (ctx.user != null) { |
| 21 | - mapEntityId(ctx, dto); | 21 | + mapUser(ctx, dto); |
| 22 | mapFirstname(ctx, dto); | 22 | mapFirstname(ctx, dto); |
| 23 | mapLastname(ctx, dto); | 23 | mapLastname(ctx, dto); |
| 24 | } | 24 | } |
| 25 | return dto; | 25 | return dto; |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | - private void mapEntityId(EntityToUserDtoContext ctx, UserDto dto) { | ||
| 29 | - dto.setEntityId(ctx.user.getId()); | 28 | + private void mapUser(EntityToUserDtoContext ctx, UserDto dto) { |
| 29 | + dto.setUser(ctx.user); | ||
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | private void mapFirstname(EntityToUserDtoContext ctx, UserDto dto) { | 32 | private void mapFirstname(EntityToUserDtoContext ctx, UserDto dto) { |
src/main/java/net/ziemers/swxercise/lg/user/service/UserDtoToEntityContext.java
src/main/java/net/ziemers/swxercise/lg/user/service/UserDtoToEntityContextService.java
| @@ -22,20 +22,27 @@ public class UserDtoToEntityContextService { | @@ -22,20 +22,27 @@ public class UserDtoToEntityContextService { | ||
| 22 | */ | 22 | */ |
| 23 | public UserDtoToEntityContext createContext(final UserDto dto) { | 23 | public UserDtoToEntityContext createContext(final UserDto dto) { |
| 24 | final UserDtoToEntityContext ctx = new UserDtoToEntityContext(); | 24 | final UserDtoToEntityContext ctx = new UserDtoToEntityContext(); |
| 25 | + final User existingUser = dto.getUser(); | ||
| 25 | 26 | ||
| 26 | // das übergebene UserDto in den Kontext füllen | 27 | // das übergebene UserDto in den Kontext füllen |
| 27 | ctx.dto = dto; | 28 | ctx.dto = dto; |
| 28 | 29 | ||
| 29 | - // einen neuen oder einen bereits existierenden Benutzer in den Kontext füllen | ||
| 30 | - ctx.user = dao.findByUsername(dto.getUsername()); | ||
| 31 | - if (ctx.user == null) { | ||
| 32 | - // es soll niemals ein Profil ohne Benutzername und Kennwort geben | ||
| 33 | - ctx.profile = new Profile(dto.getUsername(), dto.getPassword()); | 30 | + // einen neuen Benutzer in den Kontext füllen |
| 31 | + if (existingUser == null) { | ||
| 32 | + // es darf nicht mehrere Benutzer mit dem selben Benutzernamen geben! | ||
| 33 | + if (dao.findByUsername(dto.getUsername()) == null) { | ||
| 34 | + // es soll niemals ein Profil ohne Benutzername und Kennwort geben | ||
| 35 | + ctx.profile = new Profile(dto.getUsername(), dto.getPassword()); | ||
| 36 | + | ||
| 37 | + // wir füllen das User-Objekt mit Method Chaining | ||
| 38 | + ctx.user = new User(dto.getFirstname(), dto.getLastname()) | ||
| 39 | + .withProfile(ctx.profile); | ||
| 40 | + } | ||
| 41 | + } | ||
| 34 | 42 | ||
| 35 | - // wir füllen das User-Objekt mit Method Chaining | ||
| 36 | - ctx.user = new User(dto.getFirstname(), dto.getLastname()) | ||
| 37 | - .withProfile(ctx.profile); | ||
| 38 | - } else { | 43 | + // einen bereits existierenden Benutzer in den Kontext füllen |
| 44 | + else { | ||
| 45 | + ctx.user = existingUser; | ||
| 39 | ctx.profile = ctx.user.getProfile(); | 46 | ctx.profile = ctx.user.getProfile(); |
| 40 | ctx.address = ctx.user.getAddress(); | 47 | ctx.address = ctx.user.getAddress(); |
| 41 | } | 48 | } |
src/main/java/net/ziemers/swxercise/lg/user/service/UserDtoToEntityMapper.java
| @@ -11,26 +11,30 @@ import javax.ejb.Stateless; | @@ -11,26 +11,30 @@ import javax.ejb.Stateless; | ||
| 11 | public class UserDtoToEntityMapper { | 11 | public class UserDtoToEntityMapper { |
| 12 | 12 | ||
| 13 | /** | 13 | /** |
| 14 | - * Überträgt die Eigenschaften aus dem UserDto sowie dem zusätzlichen Kontext in die Zielentität. | 14 | + * Überträgt die Eigenschaften aus dem UserDto sowie dem zusätzlichen Kontext in die Zielentitäten. |
| 15 | + * Anzumerken ist, dass der Benutzername einer existierenden Profile-Entität niemals aktualisiert | ||
| 16 | + * wird. | ||
| 15 | * | 17 | * |
| 16 | * @param ctx der Kontext mit den Eigenschaften und der Zielentität | 18 | * @param ctx der Kontext mit den Eigenschaften und der Zielentität |
| 17 | * @return den Kontext. | 19 | * @return den Kontext. |
| 18 | */ | 20 | */ |
| 19 | public UserDtoToEntityContext map(UserDtoToEntityContext ctx) { | 21 | public UserDtoToEntityContext map(UserDtoToEntityContext ctx) { |
| 20 | - // User-Objekt mappen | 22 | + // ins User-Objekt mappen |
| 21 | ctx.user.setFirstname(ctx.dto.getFirstname()); | 23 | ctx.user.setFirstname(ctx.dto.getFirstname()); |
| 22 | ctx.user.setLastname(ctx.dto.getLastname()); | 24 | ctx.user.setLastname(ctx.dto.getLastname()); |
| 23 | 25 | ||
| 24 | - // Profile-Objekt mappen, falls gegeben | 26 | + // ins Profile-Objekt mappen, falls gegeben |
| 25 | if (ctx.profile != null) { | 27 | if (ctx.profile != null) { |
| 26 | ctx.user.setProfile(ctx.profile); | 28 | ctx.user.setProfile(ctx.profile); |
| 29 | + | ||
| 30 | + // eventuell ein neues Kenntwort ins Profile-Objekt mappen | ||
| 27 | if(ctx.dto.getPassword().length() > 0) { | 31 | if(ctx.dto.getPassword().length() > 0) { |
| 28 | ctx.profile.setPassword(ctx.dto.getPassword()); | 32 | ctx.profile.setPassword(ctx.dto.getPassword()); |
| 29 | } | 33 | } |
| 30 | ctx.profile.setMailaddress(ctx.dto.getMailaddress()); | 34 | ctx.profile.setMailaddress(ctx.dto.getMailaddress()); |
| 31 | } | 35 | } |
| 32 | 36 | ||
| 33 | - // Address-Objekt mappen, falls gegeben | 37 | + // ins Address-Objekt mappen, falls gegeben |
| 34 | if (ctx.address != null) { | 38 | if (ctx.address != null) { |
| 35 | ctx.user.setAddress(ctx.address); | 39 | ctx.user.setAddress(ctx.address); |
| 36 | } | 40 | } |
src/main/java/net/ziemers/swxercise/lg/user/service/UserService.java
| @@ -81,20 +81,17 @@ public class UserService { | @@ -81,20 +81,17 @@ public class UserService { | ||
| 81 | * Zwischen der Groß- und Kleinschreibung wird nicht unterschieden. | 81 | * Zwischen der Groß- und Kleinschreibung wird nicht unterschieden. |
| 82 | * | 82 | * |
| 83 | * @param dto das {@link UserDto} enthält die Eigenschaften des zu erstellenden Benutzers | 83 | * @param dto das {@link UserDto} enthält die Eigenschaften des zu erstellenden Benutzers |
| 84 | - * @return die Id des neuen Benutzers, wenn die Erstellung erfolgreich war. | 84 | + * @return <code>true</code>, wenn das Aktualisieren des Benutzers erfolgreich war. |
| 85 | */ | 85 | */ |
| 86 | - public Long createUser(final UserDto dto) { | 86 | + public boolean createUser(final UserDto dto) { |
| 87 | + // Kontext für den zu erstellenden Benutzer erzeugen; falls bereits ein Benutzer | ||
| 88 | + // mit dem selben Benutzernamen existiert, wird kein Benutzerobjekt zurückgeliefert | ||
| 87 | final UserDtoToEntityContext ctx = ctxService.createContext(dto); | 89 | final UserDtoToEntityContext ctx = ctxService.createContext(dto); |
| 88 | - mapper.map(ctx); | ||
| 89 | - return persistUserIfNew(ctx); | ||
| 90 | - } | ||
| 91 | - | ||
| 92 | - private Long persistUserIfNew(final UserDtoToEntityContext ctx) { | ||
| 93 | - // nur ein neuer Benutzer hat noch keine Id | ||
| 94 | - if (ctx.user.getId() == null) { | ||
| 95 | - return dao.save(ctx.user); | 90 | + if (ctx.user != null) { |
| 91 | + mapper.map(ctx); | ||
| 92 | + return dao.save(ctx.user) != null; | ||
| 96 | } | 93 | } |
| 97 | - return null; | 94 | + return false; |
| 98 | } | 95 | } |
| 99 | 96 | ||
| 100 | /** | 97 | /** |
| @@ -107,8 +104,12 @@ public class UserService { | @@ -107,8 +104,12 @@ public class UserService { | ||
| 107 | public boolean updateUser(final Long id, final UserDto dto) { | 104 | public boolean updateUser(final Long id, final UserDto dto) { |
| 108 | final User user = dao.findById(id); | 105 | final User user = dao.findById(id); |
| 109 | if (user != null) { | 106 | if (user != null) { |
| 110 | - // TODO noch zu implementieren | ||
| 111 | - return false; | 107 | + // auf dieses Benutzerobjekt soll sich die Aktualisierung beziehen |
| 108 | + dto.setUser(user); | ||
| 109 | + | ||
| 110 | + final UserDtoToEntityContext ctx = ctxService.createContext(dto); | ||
| 111 | + mapper.map(ctx); | ||
| 112 | + return dao.saveOrUpdate(ctx.user) != null; | ||
| 112 | } | 113 | } |
| 113 | return false; | 114 | return false; |
| 114 | } | 115 | } |
| @@ -120,16 +121,8 @@ public class UserService { | @@ -120,16 +121,8 @@ public class UserService { | ||
| 120 | * @return <code>true</code>, wenn das Aktualisieren des Benutzers erfolgreich war. | 121 | * @return <code>true</code>, wenn das Aktualisieren des Benutzers erfolgreich war. |
| 121 | */ | 122 | */ |
| 122 | public boolean updateUser(final UserDto dto) { | 123 | public boolean updateUser(final UserDto dto) { |
| 123 | - // ist zurzeit ein Benutzer angemeldet, können wir ihn aktualisieren | ||
| 124 | final User user = sessionContext.getUser(); | 124 | final User user = sessionContext.getUser(); |
| 125 | - if (user != null) { | ||
| 126 | - // der Benutzername darf sich beim Aktualisieren nicht mehr ändern! | ||
| 127 | - dto.withUsername(user.getProfile().getUsername()); | ||
| 128 | - final UserDtoToEntityContext ctx = ctxService.createContext(dto); | ||
| 129 | - mapper.map(ctx); | ||
| 130 | - return dao.saveOrUpdate(ctx.user) != null; | ||
| 131 | - } | ||
| 132 | - return false; | 125 | + return updateUser(user.getId(), dto); |
| 133 | } | 126 | } |
| 134 | 127 | ||
| 135 | /** | 128 | /** |
src/main/java/net/ziemers/swxercise/ui/UserViewController.java
| @@ -89,9 +89,8 @@ public class UserViewController { | @@ -89,9 +89,8 @@ public class UserViewController { | ||
| 89 | @Produces(MediaType.APPLICATION_JSON) | 89 | @Produces(MediaType.APPLICATION_JSON) |
| 90 | @RolesAllowed(RightState.Constants.ADMIN) | 90 | @RolesAllowed(RightState.Constants.ADMIN) |
| 91 | public RestResponse createUser(UserDto dto) { | 91 | public RestResponse createUser(UserDto dto) { |
| 92 | - final Long id = userService.createUser(dto); | ||
| 93 | - if (id != null) { | ||
| 94 | - return new RestResponse(ResponseState.SUCCESS, String.valueOf(id)); | 92 | + if (userService.createUser(dto)) { |
| 93 | + return new RestResponse(); | ||
| 95 | } | 94 | } |
| 96 | return new RestResponse(ResponseState.ALREADY_EXISTING); | 95 | return new RestResponse(ResponseState.ALREADY_EXISTING); |
| 97 | } | 96 | } |