File tree

7 files changed

+132
-0
lines changed

7 files changed

+132
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,25 @@
55
*/
66
package org.springdoc.demo.app2.api;
77

8+
import java.util.List;
9+
10+
import javax.validation.Valid;
11+
import javax.validation.constraints.NotNull;
12+
13+
import org.springdoc.demo.app2.model.ModelApiResponse;
14+
import org.springdoc.demo.app2.model.Pet;
15+
import org.springframework.data.domain.Pageable;
16+
import org.springframework.http.ResponseEntity;
17+
import org.springframework.web.bind.annotation.DeleteMapping;
18+
import org.springframework.web.bind.annotation.GetMapping;
19+
import org.springframework.web.bind.annotation.PathVariable;
20+
import org.springframework.web.bind.annotation.PostMapping;
21+
import org.springframework.web.bind.annotation.PutMapping;
22+
import org.springframework.web.bind.annotation.RequestBody;
23+
import org.springframework.web.bind.annotation.RequestHeader;
24+
import org.springframework.web.bind.annotation.RequestParam;
25+
import org.springframework.web.bind.annotation.RequestPart;
26+
import org.springframework.web.multipart.MultipartFile;
827
import io.swagger.v3.oas.annotations.Operation;
928
import io.swagger.v3.oas.annotations.Parameter;
1029
import io.swagger.v3.oas.annotations.enums.Explode;
@@ -135,4 +154,14 @@ default ResponseEntity<ModelApiResponse> uploadFile(
135154
return getDelegate().uploadFile(petId, additionalMetadata, file);
136155
}
137156

157+
@Operation(summary = "Get all Pets paged", description = "Get all Pets paged", security = {
158+
@SecurityRequirement(name = "petstore_auth", scopes = { "write:pets", "read:pets" }) }, tags = { "pet" })
159+
@ApiResponses(value = {
160+
@ApiResponse(responseCode = "200", description = "successful operation", content = @Content(array = @ArraySchema(schema = @Schema(implementation = Pet.class))))
161+
})
162+
@GetMapping(value = "/pet", produces = { "application/xml", "application/json" })
163+
default ResponseEntity<List<Pet>> getAllPets(@NotNull Pageable pageable) {
164+
return getDelegate().getAllPets(pageable);
165+
}
166+
138167
}
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
package org.springdoc.demo.app2.api;
22

3+
import java.util.List;
4+
import java.util.Optional;
5+
6+
import javax.validation.Valid;
7+
import javax.validation.constraints.NotNull;
38
import org.springdoc.demo.app2.model.ModelApiResponse;
49
import org.springdoc.demo.app2.model.Pet;
10+
import org.springframework.data.domain.Pageable;
511
import org.springframework.http.HttpStatus;
612
import org.springframework.http.MediaType;
713
import org.springframework.http.ResponseEntity;
@@ -118,4 +124,8 @@ default ResponseEntity<ModelApiResponse> uploadFile( Long petId,
118124

119125
}
120126

127+
default ResponseEntity<List<Pet>> getAllPets(@NotNull Pageable pageable) {
128+
return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
129+
}
130+
121131
}
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,23 @@
11
package org.springdoc.demo.app2.api;
22

3+
import java.io.File;
4+
import java.io.FileOutputStream;
5+
import java.util.Arrays;
6+
import java.util.List;
7+
import java.util.Optional;
8+
import java.util.concurrent.atomic.AtomicLong;
9+
import java.util.stream.Collectors;
10+
11+
import javax.annotation.PostConstruct;
12+
import javax.validation.constraints.NotNull;
13+
314
import org.apache.tomcat.util.http.fileupload.IOUtils;
415
import org.springdoc.demo.app2.model.Category;
516
import org.springdoc.demo.app2.model.ModelApiResponse;
617
import org.springdoc.demo.app2.model.Pet;
718
import org.springdoc.demo.app2.model.Tag;
819
import org.springdoc.demo.app2.repository.PetRepository;
20+
import org.springframework.data.domain.Pageable;
921
import org.springframework.http.HttpStatus;
1022
import org.springframework.http.ResponseEntity;
1123
import org.springframework.stereotype.Service;
@@ -147,4 +159,9 @@ private static Pet createPet(long id, Category category, String name, String[] u
147159
return pet;
148160
}
149161

162+
public ResponseEntity<List<Pet>> getAllPets(@NotNull Pageable pageable) {
163+
ApiUtil.checkApiKey(request);
164+
return new ResponseEntity<List<Pet>>(petRepository.findAll(pageable), HttpStatus.OK);
165+
}
166+
150167
}
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
package org.springdoc.demo.app2.repository;
22

3+
import org.springframework.beans.BeanWrapper;
4+
import org.springframework.beans.BeanWrapperImpl;
5+
import org.springframework.data.domain.Pageable;
6+
import org.springframework.data.domain.Sort;
37
import org.springframework.data.repository.CrudRepository;
48
import org.springframework.data.repository.NoRepositoryBean;
59
import org.springframework.util.Assert;
610

11+
import java.beans.BeanInfo;
12+
import java.beans.PropertyDescriptor;
713
import java.util.*;
814

915
@NoRepositoryBean
@@ -13,6 +19,12 @@ public abstract class HashMapRepository<T, ID> implements CrudRepository<T, ID>
1319

1420
abstract <S extends T> ID getEntityId(S entity);
1521

22+
private final BeanWrapper entityBeanInfo;
23+
24+
protected HashMapRepository(Class<T> clazz) {
25+
entityBeanInfo = new BeanWrapperImpl(clazz);
26+
}
27+
1628
@Override
1729
public <S extends T> S save(S entity) {
1830
Assert.notNull(entity, "entity cannot be null");
@@ -34,6 +46,58 @@ public Collection<T> findAll() {
3446
return entities.values();
3547
}
3648

49+
public List<T> findAll(Pageable pageable) {
50+
final List<T> result;
51+
final Sort sort = pageable.getSort();
52+
if (sort != null) {
53+
Comparator<T> comp = new Comparator<T>() {
54+
@Override
55+
public int compare(T t1, T t2) {
56+
int result = 0;
57+
for (Sort.Order o : sort) {
58+
final String prop = o.getProperty();
59+
PropertyDescriptor propDesc = entityBeanInfo.getPropertyDescriptor(prop);
60+
result = ((Comparable<T>) propDesc.createPropertyEditor(t1).getValue())
61+
.compareTo((T) propDesc.createPropertyEditor(t2).getValue());
62+
if (o.isDescending()) {
63+
result = -result;
64+
}
65+
if (result != 0) break;
66+
}
67+
return result;
68+
}
69+
};
70+
final Set<T> set = new TreeSet<>(comp);
71+
set.addAll(entities.values());
72+
result = getPageSlice(pageable, set);
73+
} else {
74+
result = getPageSlice(pageable, entities.values());
75+
}
76+
return result;
77+
}
78+
79+
private List<T> getPageSlice(Pageable pageable, Collection<T> col) {
80+
final ArrayList<T> all = new ArrayList<>(col);
81+
final int size = all.size();
82+
final int psize = pageable.getPageSize();
83+
final int pnum = pageable.getPageNumber();
84+
if (pnum < 1) {
85+
throw new IllegalArgumentException("page number must be 1 or more");
86+
}
87+
if (psize < 1) {
88+
throw new IllegalArgumentException("page size must be 1 or more");
89+
}
90+
// inclusive
91+
final int begin = (pnum - 1) * psize;
92+
// exclusive
93+
final int end = Math.min(begin + psize, size);
94+
if (size < begin) {
95+
return new ArrayList<>();
96+
}
97+
// return of slice is valid because all is local to this method
98+
return all.subList(begin, end);
99+
}
100+
37101
@Override
38102
public long count() {
39103
return entities.keySet().size();
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
@Repository
77
public class OrderRepository extends HashMapRepository<Order, Long> {
88

9+
public OrderRepository() {
10+
super(Order.class);
11+
}
12+
913
@Override
1014
<S extends Order> Long getEntityId(S order) {
1115
return order.getId();
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ public class PetRepository extends HashMapRepository<Pet, Long> {
1212

1313
private Long sequenceId = 1L;
1414

15+
public PetRepository() {
16+
super(Pet.class);
17+
}
18+
1519
@Override
1620
<S extends Pet> Long getEntityId(S pet) {
1721
return pet.getId();
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
@Repository
77
public class UserRepository extends HashMapRepository<User, String> {
88

9+
public UserRepository() {
10+
super(User.class);
11+
}
12+
913
@Override
1014
<S extends User> String getEntityId(S user) {
1115
return user.getUsername();

0 commit comments

Comments
 (0)