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 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
@@ -13,6 +13,6 @@ public class UserDtoToEntityContext { @@ -13,6 +13,6 @@ public class UserDtoToEntityContext {
13 13
14 public Profile profile; 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,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 }