-
Notifications
You must be signed in to change notification settings - Fork 65
/
ResourceRepositoryBase.java
125 lines (110 loc) · 3.56 KB
/
ResourceRepositoryBase.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package io.katharsis.repository;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Iterator;
import io.katharsis.core.internal.utils.PreconditionUtil;
import io.katharsis.errorhandling.exception.ResourceNotFoundException;
import io.katharsis.queryspec.FilterOperator;
import io.katharsis.queryspec.FilterSpec;
import io.katharsis.queryspec.QuerySpec;
import io.katharsis.resource.list.ResourceList;
import io.katharsis.resource.registry.RegistryEntry;
import io.katharsis.resource.registry.ResourceRegistry;
import io.katharsis.resource.registry.ResourceRegistryAware;
/**
* Recommended base class to implement a resource repository making use of the
* QuerySpec and ResourceList. Note that the former
* {@link ResourceRepositoryBase} will be removed in the near future.
*
* Base implements for {@link ResourceRepositoryV2} implementing most of the
* methods. Unless {@link #save(T)} and {@link #delete(I)} get
* overridden, this repository is read-only. Only {@link #findAll(QuerySpec)}
* needs to be implemented to have a working repository.
*
* @param <T>
* resource type
* @param <I>
* identity type
*/
public abstract class ResourceRepositoryBase<T, I extends Serializable> implements ResourceRepositoryV2<T, I>, ResourceRegistryAware {
private Class<T> resourceClass;
private ResourceRegistry resourceRegistry;
protected ResourceRepositoryBase(Class<T> resourceClass) {
this.resourceClass = resourceClass;
}
@Override
public Class<T> getResourceClass() {
return resourceClass;
}
/**
* Forwards to {@link #findAll(QuerySpec)}
*
* @param id
* of the resource
* @param querySpec
* for field and relation inclusion
* @return resource
*/
@Override
public T findOne(I id, QuerySpec querySpec) {
RegistryEntry entry = resourceRegistry.findEntry(resourceClass);
String idName = entry.getResourceInformation().getIdField().getUnderlyingName();
QuerySpec idQuerySpec = querySpec.duplicate();
idQuerySpec.addFilter(new FilterSpec(Arrays.asList(idName), FilterOperator.EQ, id));
Iterable<T> iterable = findAll(idQuerySpec);
Iterator<T> iterator = iterable.iterator();
if (iterator.hasNext()) {
T resource = iterator.next();
PreconditionUtil.assertFalse("expected unique result", iterator.hasNext());
return resource;
} else {
throw new ResourceNotFoundException("resource not found");
}
}
/**
* Forwards to {@link #findAll(QuerySpec)}
*
* @param ids
* of the resources
* @param querySpec
* for field and relation inclusion
* @return resources
*/
@Override
public ResourceList<T> findAll(Iterable<I> ids, QuerySpec querySpec) {
RegistryEntry entry = resourceRegistry.findEntry(resourceClass);
String idName = entry.getResourceInformation().getIdField().getUnderlyingName();
QuerySpec idQuerySpec = querySpec.duplicate();
idQuerySpec.addFilter(new FilterSpec(Arrays.asList(idName), FilterOperator.EQ, ids));
return findAll(idQuerySpec);
}
/**
* read-only by default
*
* @param resource
* to save
* @return saved resource
*/
@Override
public <S extends T> S save(S resource) {
throw new UnsupportedOperationException();
}
@Override
public <S extends T> S create(S resource) {
return save(resource);
}
/**
* read-only by default
*
* @param id
* of resource to delete
*/
@Override
public void delete(I id) {
throw new UnsupportedOperationException();
}
@Override
public void setResourceRegistry(ResourceRegistry resourceRegistry) {
this.resourceRegistry = resourceRegistry;
}
}