Commit 62d24433810f4b834c1ecf95dc9f2a0703bdda72

Authored by Thomas Ziemer
1 parent 7a765da2

improvement: Kontext und Mapper für create- und updateUser() optimiert

src/main/java/net/ziemers/swxercise/lg/user/dto/UserDto.java
1 1 package net.ziemers.swxercise.lg.user.dto;
2 2  
  3 +import net.ziemers.swxercise.lg.model.user.User;
  4 +
3 5 import javax.validation.constraints.NotNull;
4 6  
5 7 /**
... ... @@ -8,7 +10,7 @@ import javax.validation.constraints.NotNull;
8 10 */
9 11 public class UserDto {
10 12  
11   - private Long entityId;
  13 + private User user = null;
12 14  
13 15 @NotNull
14 16 private String username; // aus dem Profile
... ... @@ -22,12 +24,12 @@ public class UserDto {
22 24  
23 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 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 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 14 * @param ctx der Kontext
15 15 * @return das erzeugte DTO.
... ... @@ -18,15 +18,15 @@ public class EntityToUserDtoMapper {
18 18 final UserDto dto = new UserDto();
19 19  
20 20 if (ctx.user != null) {
21   - mapEntityId(ctx, dto);
  21 + mapUser(ctx, dto);
22 22 mapFirstname(ctx, dto);
23 23 mapLastname(ctx, dto);
24 24 }
25 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 32 private void mapFirstname(EntityToUserDtoContext ctx, UserDto dto) {
... ...
src/main/java/net/ziemers/swxercise/lg/user/service/UserDtoToEntityContext.java
... ... @@ -13,6 +13,6 @@ public class UserDtoToEntityContext {
13 13  
14 14 public Profile profile;
15 15  
16   - public Address address;
  16 + public Address address = null;
17 17  
18 18 }
... ...
src/main/java/net/ziemers/swxercise/lg/user/service/UserDtoToEntityContextService.java
... ... @@ -22,20 +22,27 @@ public class UserDtoToEntityContextService {
22 22 */
23 23 public UserDtoToEntityContext createContext(final UserDto dto) {
24 24 final UserDtoToEntityContext ctx = new UserDtoToEntityContext();
  25 + final User existingUser = dto.getUser();
25 26  
26 27 // das übergebene UserDto in den Kontext füllen
27 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 46 ctx.profile = ctx.user.getProfile();
40 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 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 18 * @param ctx der Kontext mit den Eigenschaften und der Zielentität
17 19 * @return den Kontext.
18 20 */
19 21 public UserDtoToEntityContext map(UserDtoToEntityContext ctx) {
20   - // User-Objekt mappen
  22 + // ins User-Objekt mappen
21 23 ctx.user.setFirstname(ctx.dto.getFirstname());
22 24 ctx.user.setLastname(ctx.dto.getLastname());
23 25  
24   - // Profile-Objekt mappen, falls gegeben
  26 + // ins Profile-Objekt mappen, falls gegeben
25 27 if (ctx.profile != null) {
26 28 ctx.user.setProfile(ctx.profile);
  29 +
  30 + // eventuell ein neues Kenntwort ins Profile-Objekt mappen
27 31 if(ctx.dto.getPassword().length() > 0) {
28 32 ctx.profile.setPassword(ctx.dto.getPassword());
29 33 }
30 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 38 if (ctx.address != null) {
35 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 81 * Zwischen der Groß- und Kleinschreibung wird nicht unterschieden.
82 82 *
83 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 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 104 public boolean updateUser(final Long id, final UserDto dto) {
108 105 final User user = dao.findById(id);
109 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 114 return false;
114 115 }
... ... @@ -120,16 +121,8 @@ public class UserService {
120 121 * @return <code>true</code>, wenn das Aktualisieren des Benutzers erfolgreich war.
121 122 */
122 123 public boolean updateUser(final UserDto dto) {
123   - // ist zurzeit ein Benutzer angemeldet, können wir ihn aktualisieren
124 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 89 @Produces(MediaType.APPLICATION_JSON)
90 90 @RolesAllowed(RightState.Constants.ADMIN)
91 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 95 return new RestResponse(ResponseState.ALREADY_EXISTING);
97 96 }
... ...