cd934163d9de9f68fbcd716e71cdafd52ea84e17
[JavaForFun] /
1 package org.resthub.web.controller;
2
3 import java.io.Serializable;
4 import java.util.Set;
5
6 import org.resthub.common.exception.NotFoundException;
7 import org.resthub.common.service.CrudService;
8 import org.springframework.data.domain.Page;
9 import org.springframework.data.domain.PageRequest;
10 import org.springframework.data.domain.Sort;
11 import org.springframework.util.Assert;
12 import org.springframework.web.bind.annotation.PathVariable;
13 import org.springframework.web.bind.annotation.RequestBody;
14 import org.springframework.web.bind.annotation.RequestParam;
15
16 /**
17  * Abstract REST controller using a service implementation
18  * <p/>
19  * <p>You should extend this class when you want to use a 3 layers pattern : Repository, Service and Controller
20  * If you don't have a real service (also called business layer), consider using RepositoryBasedRestController</p>
21  * <p/>
22  * <p>Default implementation uses "id" field (usually a Long) in order to identify resources in web request.
23  * If your want to identity resources by a slug (human readable identifier), your should override findById() method with for example :
24  * <p/>
25  * <pre>
26  * <code>
27  * {@literal @}Override
28  * public Sample findById({@literal @}PathVariable String id) {
29  * Sample sample = this.service.findByName(id);
30  * if (sample == null) {
31  * throw new NotFoundException();
32  * }
33  * return sample;
34  * }
35  * </code>
36  * </pre>
37  *
38  * @param <T>  Your resource class to manage, maybe an entity or DTO class
39  * @param <ID> Resource id type, usually Long or String
40  * @param <S>  The service class
41  * @see RepositoryBasedRestController
42  */
43 public abstract class ServiceBasedRestController<T, ID extends Serializable, S extends CrudService> implements
44         RestController<T, ID> {
45
46     protected S service;
47
48     /**
49      * You should override this setter in order to inject your service with @Inject annotation
50      *
51      * @param service The service to be injected
52      */
53     public void setService(S service) {
54         this.service = service;
55     }
56
57     /**
58      * {@inheritDoc}
59      */
60     @Override
61     public T create(@RequestBody T resource) {
62         return (T) this.service.create(resource);
63     }
64
65     /**
66      * {@inheritDoc}
67      */
68     @Override
69     public T update(@PathVariable ID id, @RequestBody T resource) {
70         Assert.notNull(id, "id cannot be null");
71
72         T retreivedResource = this.findById(id);
73         if (retreivedResource == null) {
74             throw new NotFoundException();
75         }
76
77         return (T) this.service.update(resource);
78     }
79
80     /**
81      * {@inheritDoc}
82      */
83     @Override
84     public Iterable<T> findAll() {
85         return service.findAll();
86     }
87
88     /**
89      * {@inheritDoc}
90      */
91     @Override
92     public Page<T> findPaginated(@RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
93                                  @RequestParam(value = "size", required = false, defaultValue = "10") Integer size,
94                                  @RequestParam(value = "direction", required = false, defaultValue = "") String direction,
95                                  @RequestParam(value = "properties", required = false) String properties) {
96         Assert.isTrue(page > 0, "Page index must be greater than 0");
97         Assert.isTrue(direction.isEmpty() || direction.equalsIgnoreCase(Sort.Direction.ASC.toString()) || direction.equalsIgnoreCase(Sort.Direction.DESC.toString()), "Direction should be ASC or DESC");
98         if (direction.isEmpty()) {
99             return this.service.findAll(new PageRequest(page - 1, size));
100         } else {
101             Assert.notNull(properties);
102             return this.service.findAll(new PageRequest(page - 1, size, new Sort(Sort.Direction.fromString(direction.toUpperCase()), properties.split(","))));
103         }
104     }
105
106     /**
107      * {@inheritDoc}
108      */
109     @Override
110     public T findById(@PathVariable ID id) {
111         T resource = (T) this.service.findById(id);
112         if (resource == null) {
113             throw new NotFoundException();
114         }
115
116         return resource;
117     }
118
119     /**
120      * {@inheritDoc}
121      */
122     @Override
123     public Iterable<T> findByIds(@RequestParam(value = "ids[]") Set<ID> ids) {
124         Assert.notNull(ids, "ids list cannot be null");
125         return this.service.findByIds(ids);
126     }
127
128
129     /**
130      * {@inheritDoc}
131      */
132     @Override
133     public void delete() {
134         this.service.deleteAllWithCascade();
135     }
136
137     /**
138      * {@inheritDoc}
139      */
140     @Override
141     public void delete(@PathVariable ID id) {
142         T resource = this.findById(id);
143         this.service.delete(resource);
144     }
145 }
146