1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.jboss.as.quickstarts.kitchensink_ear.rest;
18
19 import java.util.HashMap;
20 import java.util.HashSet;
21 import java.util.List;
22 import java.util.Map;
23 import java.util.Set;
24 import java.util.logging.Logger;
25
26 import javax.enterprise.context.RequestScoped;
27 import javax.inject.Inject;
28 import javax.persistence.NoResultException;
29 import javax.validation.ConstraintViolation;
30 import javax.validation.ConstraintViolationException;
31 import javax.validation.ValidationException;
32 import javax.validation.Validator;
33 import javax.ws.rs.Consumes;
34 import javax.ws.rs.GET;
35 import javax.ws.rs.POST;
36 import javax.ws.rs.Path;
37 import javax.ws.rs.PathParam;
38 import javax.ws.rs.Produces;
39 import javax.ws.rs.WebApplicationException;
40 import javax.ws.rs.core.MediaType;
41 import javax.ws.rs.core.Response;
42
43 import org.jboss.as.quickstarts.kitchensink_ear.data.MemberRepository;
44 import org.jboss.as.quickstarts.kitchensink_ear.model.Member;
45 import org.jboss.as.quickstarts.kitchensink_ear.service.MemberRegistration;
46
47
48
49
50
51
52 @Path("/members")
53 @RequestScoped
54 public class MemberResourceRESTService {
55 @Inject
56 private Logger log;
57
58 @Inject
59 private Validator validator;
60
61 @Inject
62 private MemberRepository repository;
63
64 @Inject
65 MemberRegistration registration;
66
67 @GET
68 @Produces(MediaType.APPLICATION_JSON)
69 public List<Member> listAllMembers() {
70 return repository.findAllOrderedByName();
71 }
72
73 @GET
74 @Path("/{id:[0-9][0-9]*}")
75 @Produces(MediaType.APPLICATION_JSON)
76 public Member lookupMemberById(@PathParam("id") long id) {
77 Member member = repository.findById(id);
78 if (member == null) {
79 throw new WebApplicationException(Response.Status.NOT_FOUND);
80 }
81 return member;
82 }
83
84
85
86
87
88 @POST
89 @Consumes(MediaType.APPLICATION_JSON)
90 @Produces(MediaType.APPLICATION_JSON)
91 public Response createMember(Member member) {
92
93 Response.ResponseBuilder builder = null;
94
95 try {
96
97 validateMember(member);
98
99 registration.register(member);
100
101
102 builder = Response.ok();
103 } catch (ConstraintViolationException ce) {
104
105 builder = createViolationResponse(ce.getConstraintViolations());
106 } catch (ValidationException e) {
107
108 Map<String, String> responseObj = new HashMap<String, String>();
109 responseObj.put("email", "Email taken");
110 builder = Response.status(Response.Status.CONFLICT).entity(responseObj);
111 } catch (Exception e) {
112
113 Map<String, String> responseObj = new HashMap<String, String>();
114 responseObj.put("error", e.getMessage());
115 builder = Response.status(Response.Status.BAD_REQUEST).entity(responseObj);
116 }
117
118 return builder.build();
119 }
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 private void validateMember(Member member) throws ConstraintViolationException, ValidationException {
136
137 Set<ConstraintViolation<Member>> violations = validator.validate(member);
138
139 if (!violations.isEmpty()) {
140 throw new ConstraintViolationException(new HashSet<ConstraintViolation<?>>(violations));
141 }
142
143
144 if (emailAlreadyExists(member.getEmail())) {
145 throw new ValidationException("Unique Email Violation");
146 }
147 }
148
149
150
151
152
153
154
155
156 private Response.ResponseBuilder createViolationResponse(Set<ConstraintViolation<?>> violations) {
157 log.fine("Validation completed. violations found: " + violations.size());
158
159 Map<String, String> responseObj = new HashMap<String, String>();
160
161 for (ConstraintViolation<?> violation : violations) {
162 responseObj.put(violation.getPropertyPath().toString(), violation.getMessage());
163 }
164
165 return Response.status(Response.Status.BAD_REQUEST).entity(responseObj);
166 }
167
168
169
170
171
172
173
174
175 public boolean emailAlreadyExists(String email) {
176 Member member = null;
177 try {
178 member = repository.findByEmail(email);
179 } catch (NoResultException e) {
180
181 }
182 return member != null;
183 }
184 }