1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.acegisecurity.domain.service;
17
18 import org.acegisecurity.domain.PersistableEntity;
19 import org.acegisecurity.domain.dao.PaginatedList;
20
21 import java.io.Serializable;
22
23 import java.util.Collection;
24 import java.util.List;
25
26 /***
27 * Provides fundamental services layer capabilities for a single concrete {@link
28 * PersistableEntity}, using JDK 1.5 generics.
29 *
30 * <P>
31 * This interface provides a remoting protocol compliant approach to accessing
32 * services layer logic for a given application. A generics-based services
33 * layer interface decreases development time because the basic CRUD and finder
34 * operations can be specified in a typesafe fashion that reuses superclass
35 * code.
36 * </p>
37 *
38 * <p>
39 * It is not envisioned that this interface will provide <b>all</b> services layer
40 * functions. The significant value of a services layer is the value-add beyond
41 * simply fronting the DAO or applying validation/binding logic that is better
42 * situated in the domain object or its validator. The type of value-adds
43 * expected to be provided by a services layer include incrementing business
44 * identifiers (eg an invoice number); generating messages for logging/audit
45 * purposes (thus such messages are at a business transaction level of granularity,
46 * instead of DAO/persistence granularity where the overall context of the
47 * the message becomes unclear); updating related domain objects via
48 * their respective services layer beans (eg an invoice services layer bean
49 * would call the general journal services layer bean to create the accrual
50 * accounting entries); making changes to a domain object that requires
51 * logic that is unsuitable to put into a validator because it extends
52 * beyond a single domain object instance or requires access to other persistent
53 * entities (eg computing taxation appliable to an invoice based on a break-down
54 * of each item on the order, its delivery destination, and the customer);
55 * producing messages (eg notify another system the invoice was created or
56 * email the customer via SMTP); provide a layer to locate transaction and
57 * security configuration; expose a reasonably protocol-independent interface
58 * to the application that can be used by a variety of web services and
59 * client types; ensure any returned objects are eagerly loaded to a well-defined
60 * interface contract etc.
61 * </p>
62 *
63 * <P>
64 * A single <code>ImmutableManager</code> implementation will typically exist for each
65 * {@link org.acegisecurity.domain.PersistableEntity}, particularly given
66 * a <code>PersistableEntity</code> is allowed to manage multiple
67 * {@link org.acegisecurity.domain.impl.PersistableValue}s.
68 * The particular <code>PersistableEntity</code> an implementation supports
69 * will be expressed by the {@link #supports(Class)} method.
70 * </p>
71 *
72 * <p>No other part of the Domain subproject relies on this interface. If
73 * you would prefer to write your own services layer interfaces from scratch,
74 * this is not a problem at all.
75 *
76 * @author Ben Alex
77 * @version $Id: ImmutableManager.java,v 1.2 2005/11/17 00:55:51 benalex Exp $
78 */
79 public interface ImmutableManager<E extends PersistableEntity> {
80
81
82 /***
83 * Return all persistent instances, including subclasses.
84 *
85 * @return all persistence instances (an empty <code>List</code> will be
86 * returned if no matches are found)
87 */
88 public List<E> findAll();
89
90 /***
91 * Find a <code>List</code> of <code>PersistableEntity</code>s, searched by
92 * their identifiers.
93 *
94 * @param ids collection of identifiers to locate
95 *
96 * @return the values with those identifiers (an empty <code>List</code>
97 * will be returned if no matches are found)
98 */
99 public List<E> findId(Collection<Serializable> ids);
100
101 /***
102 * Load a persistent instance by its identifier, although some properties
103 * may be lazy loaded depending on the underlying DAO implementation and/or
104 * persistence engine mapping document.
105 *
106 * @param id the identifier of the persistent instance desired to be
107 * retrieved
108 *
109 * @return the request item, or <code>null</code> if not found
110 */
111 public E readId(Serializable id);
112
113 /***
114 * Loads a persistent instance by its identifier, along with any
115 * lazy loaded properties associated with that instance.
116 *
117 * @param id the identifier of the persistent instance desired to be
118 * retrieved
119 *
120 * @return the request item, or <code>null</code> if not found
121 */
122 public E readPopulatedId(Serializable id);
123
124 /***
125 * Find persistent instances with properties matching those of the passed
126 * <code>PersistableEntity</code>.
127 *
128 * <P>
129 * Persistent instances are matched on the basis of query by example.
130 * Properties whose value is <code>null</code>, empty
131 * <code>String</code>s, and any <code>Collection</code>s are ignored in
132 * the query by example evaluation.
133 * </p>
134 *
135 * @param value parameters to filter on (the class of this object will
136 * be added to the filter)
137 * @param firstElement the first result (start at zero to obtain all
138 * results)
139 * @param maxElements the maximum number of results desired for this page
140 * of the result set
141 *
142 * @return the requested page of the result list (a properly formed
143 * <code>PaginatedList</code> is returned if no results match)
144 */
145 public PaginatedList<E> scroll(E value, int firstElement,
146 int maxElements);
147
148 /***
149 * Find persistent instances with properties matching those of the passed
150 * <code>PersistableEntity</code>, with a guarantee the returned results
151 * will have each of the <code>value</code> class' immediate properties
152 * initialized.
153 *
154 * <P>
155 * Persistent instances are matched on the basis of query by example.
156 * Properties whose value is <code>null</code>, empty
157 * <code>String</code>s, and any <code>Collection</code>s are ignored in
158 * the query by example evaluation.
159 * </p>
160 *
161 * @param value parameters to filter on (the class of this object will
162 * be added to the filter)
163 * @param firstElement the first result (start at zero to obtain all
164 * results)
165 * @param maxElements the maximum number of results desired for this page
166 * of the result set
167 *
168 * @return the requested page of the result list (a properly formed
169 * <code>PaginatedList</code> is returned if no results match)
170 */
171 public PaginatedList<E> scrollPopulated(E value, int firstElement,
172 int maxElements);
173
174 /***
175 * Find persistent instances with properties matching those of the passed
176 * <code>PersistableEntity</code>, ignoring the class of the passed
177 * <code>PersistableEntity</code> (useful if you pass a superclass, as you
178 * want to find all subclass instances which match).
179 *
180 * @param value parameters to filter on (the class of this object will
181 * NOT be added to the filter)
182 * @param firstElement the first result (start at zero to obtain all
183 * results)
184 * @param maxElements the maximum number of results desired for this page
185 * of the result set
186 *
187 * @return the requested page of the result list (a properly formed
188 * <code>PaginatedList</code> is returned if no results match)
189 */
190 public PaginatedList<E> scrollWithSubclasses(E value, int firstElement,
191 int maxElements);
192
193 /***
194 * Find persistent instances with properties matching those of the passed
195 * <code>PersistableEntity</code>, ignoring the class of the passed
196 * <code>PersistableEntity</code> (useful if you pass a superclass, as you
197 * want to find all subclass instances which match). Guarantees the returned
198 * results will have each of the DAO's <code>supports</code> class' immediate
199 * properties initialized.
200 *
201 * @param value parameters to filter on (the class of this object will
202 * NOT be added to the filter)
203 * @param firstElement the first result (start at zero to obtain all
204 * results)
205 * @param maxElements the maximum number of results desired for this page
206 * of the result set
207 *
208 * @return the requested page of the result list (a properly formed
209 * <code>PaginatedList</code> is returned if no results match)
210 */
211 public PaginatedList<E> scrollPopulatedWithSubclasses(E value, int firstElement,
212 int maxElements);
213
214 /***
215 * Indicates whether the DAO instance provides persistence services for the
216 * specified class.
217 *
218 * @param clazz to test, which should be an implementation of
219 * <code>PersistableEntity</code>
220 *
221 * @return <code>true</code> or <code>false</code>, indicating whether or
222 * not the passed class is supported by this DAO instance
223 */
224 public boolean supports(Class clazz);
225
226 }