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