|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object edu.northwestern.at.utils.db.hibernate.HibernatePersistenceManager
public class HibernatePersistenceManager
A Hibernate persistence manager.
This class encapsulates all of the base calls to the Hibernate persistence API.
The static init
method must be called to initialize
Hibernate before using the constructor to create any HibernatePersistenceManager
objects.
Each persistence manager has its own Hibernate session. Hibernate sessions are not thread safe, so separate threads should use separate persistence managers.
The begin
, commit
, and
rollback
methods are used for transactions.
Object creation, deletion, and
mutation should be done inside transactions. For object use without mutation
(plain old Java object graph navigation), it is not necessary to use
transactions, or any of the other methods of this class.
The save
and delete
methods are used to
save newly constructed objects and collections of objects (make them
persistent) and to delete objects and collections of objects (rendering
the copies of the objects in memory transient or non-persistent). Static
convenience forms of the methods are called doSave
and
doDelete
.
The load
method fetches a persistent object given its "handle"
(Java class and unique id). This may be a proxy object.
The get
method fetches a persistent object given its "handle"
(Java class and unique id). A get nominally never returns a proxy object,
but we have observed that they do. Hence there appears to be no reliable
method of converting a proxy object to a real object.
The refresh
method refreshes a persistent object
ignoring any copies in the cache.
The contains
method checks if an object has been
checked out in the context of the current thread's persistence manager.
The corresponding static convenience method is
doContains
.
The clear
method clears the Hibernate first-level cache.
The evict
methods clear the Hibernate second-level cache.
Several variants of the query
method provide for running
queries and retrieving results in a list. There are also static
doQuery
methods for performing queries using the persistence manager for the
current thread. The countQuery
methods provide for
retrieving an integer count as the result of a query.
A thread-local variable holds the persistence manager for
each thread, whicb is created as needed when doQuery is called. The
static closePM
method should be called at the end
of the thread to close the persistence manager.
Most exceptions thrown by Hibernate are wrapped in our own
PersistenceException
exceptions and rethrown. Some of the
static convenience methods absorb Hibernate exceptions and pass back
null values or boolean values representing the success or failure
of the persistence operation.
Field Summary | |
---|---|
static int |
JDBC_BATCH_SIZE
JDBC batch size. |
protected org.hibernate.Session |
session
The Hibernate session. |
protected static org.hibernate.SessionFactory |
sessionFactory
The Hibernate session factory. |
protected static boolean |
stackTracesEnabled
True to enable stack trace output for static persistence methods. |
protected org.hibernate.Transaction |
t
The current Hibernate transaction, or null if there is no transaction currently in progress. |
protected static java.lang.ThreadLocal |
threadPM
The thread-based persistence manager. |
Constructor Summary | |
---|---|
HibernatePersistenceManager()
Creates a new persistence manager. |
Method Summary | |
---|---|
void |
begin()
Begins a transaction if one is not already in progress. |
void |
clear()
Clear the first-level cache. |
void |
close()
Closes the persistence manager. |
static void |
closePM(HibernatePersistenceManager pm)
Close a persistence manager. |
void |
commit()
Commits a transaction if one is in progress. |
boolean |
contains(java.lang.Object obj)
Check if an object is loaded in the current session. |
int |
countQuery(java.lang.String queryString,
java.lang.String[] paramNames,
java.lang.Object[] paramValues)
Perform count query. |
void |
delete(java.util.Collection collection)
Deletes a collection of objects. |
void |
delete(java.lang.Object obj)
Deletes an object. |
int |
deleteViaQuery(java.lang.String queryString)
Delete objects via query. |
int |
deleteViaQuery(java.lang.String queryString,
java.lang.String[] paramNames,
java.lang.Object[] paramValues)
Delete objects via query. |
int |
deleteViaSQL(java.lang.String queryString)
Delete objects via SQL query. |
static void |
doClear()
Clear the first-level cache. |
static boolean |
doContains(java.lang.Object obj)
Check if an object is loaded in the current session. |
static int |
doCountQuery(java.lang.String queryString,
java.lang.String[] paramNames,
java.lang.Object[] paramValues)
Perform count query. |
static boolean |
doDelete(java.util.Collection collection)
Deletes a collection of objects. |
static boolean |
doDelete(java.lang.Object obj)
Deletes an object. |
static void |
doEvict(java.lang.Class evictionClass)
Clear all objects of the specified class from the second-level cache. |
static void |
doEvict(java.lang.Object obj)
Evict an object from the session cache. |
static java.lang.Object |
doGet(java.lang.Class type,
java.lang.Long id)
Loads a persistent object by class and id. |
static int |
doInsertViaSQL(java.lang.String insertString)
Insert data via SQL. |
static java.lang.Object |
doLoad(java.lang.Class type,
java.lang.Long id)
Loads a persistent object by class and id. |
static java.util.List |
doQuery(java.lang.String queryString)
Perform query. |
static java.util.List |
doQuery(java.lang.String queryString,
boolean cacheQuery)
Perform query. |
static java.util.List |
doQuery(java.lang.String queryString,
int maxResults)
Perform query. |
static java.util.List |
doQuery(java.lang.String queryString,
java.lang.String[] paramNames,
java.lang.Object[] paramValues)
Perform query. |
static java.util.List |
doQuery(java.lang.String queryString,
java.lang.String[] paramNames,
java.lang.Object[] paramValues,
boolean cacheQuery)
Perform query. |
static java.util.List |
doQuery(java.lang.String queryString,
java.lang.String[] paramNames,
java.lang.Object[] paramValues,
boolean cacheQuery,
int maxResults)
Perform query. |
static void |
doRefresh(java.lang.Object obj)
Refresh an object. |
static boolean |
doSave(java.util.Collection collection)
Saves a collection of objects. |
static boolean |
doSave(java.lang.Object obj)
Saves an object. |
static org.hibernate.ScrollableResults |
doScrollableQuery(java.lang.String queryString)
Perform scrollable query. |
static org.hibernate.ScrollableResults |
doScrollableQuery(java.lang.String queryString,
boolean cacheQuery)
Perform scrollable query. |
static org.hibernate.ScrollableResults |
doScrollableQuery(java.lang.String queryString,
java.lang.String[] paramNames,
java.lang.Object[] paramValues)
Perform scrollable query. |
static org.hibernate.ScrollableResults |
doScrollableQuery(java.lang.String queryString,
java.lang.String[] paramNames,
java.lang.Object[] paramValues,
boolean cacheQuery)
Perform scrollable query. |
static org.hibernate.ScrollableResults |
doScrollableQuery(java.lang.String queryString,
java.lang.String[] paramNames,
java.lang.Object[] paramValues,
boolean cacheQuery,
int maxResults)
Perform scrollable query. |
static boolean |
doUpdate(java.util.Collection collection)
Updates a collection. |
static boolean |
doUpdate(java.lang.Object obj)
Updates an object. |
static void |
enableStackTraces(boolean enableTraces)
Enable or disable stack trace output for static methods. |
void |
evict(java.lang.Class evictionClass)
Clear all objects of the specified class from the second-level cache. |
void |
evict(java.lang.Object obj)
Evict an object from the session cache. |
void |
flush()
Flushes current transaction state. |
java.lang.Object |
get(java.lang.Class type,
java.lang.Long id)
Loads a persistent object by class and id. |
static int |
getBatchSize()
Return the JDBC batch size. |
java.sql.Connection |
getConnection()
Gets the JDBC connection. |
org.hibernate.connection.ConnectionProvider |
getConnectionProvider()
Gets the connection provider. |
static HibernatePersistenceManager |
getHPM()
Get the current thread's persistence manager. |
org.hibernate.Session |
getSession()
Get the session from this persistence manager. |
static void |
init(java.lang.Class[] persistentClasses)
Initializes Hibernate using the default configuration file. |
static void |
init(java.lang.Class[] persistentClasses,
boolean cache2)
Initializes Hibernate using the default configuration file. |
static void |
init(java.lang.String configFilePath,
java.lang.Class[] persistentClasses)
Initializes Hibernate using the "hibernate.properties" file. |
static void |
init(java.lang.String url,
java.lang.String username,
java.lang.String password,
java.lang.String configFilePath,
java.lang.Class[] persistentClasses,
boolean cache2)
Initializes Hibernate. |
int |
insertViaSQL(java.lang.String insertString)
Insert data via SQL. |
java.lang.Object |
load(java.lang.Class type,
java.lang.Long id)
Loads a persistent object by class and id. |
int |
performBatchInserts(java.lang.String[] insertStatements)
Performs batch inserts using prepared MySQL insert statements. |
java.util.List |
query(java.lang.String queryString)
Perform query. |
java.util.List |
query(java.lang.String queryString,
boolean cacheQuery)
Perform query. |
java.util.List |
query(java.lang.String queryString,
java.lang.String[] paramNames,
java.lang.Object[] paramValues)
Perform query. |
java.util.List |
query(java.lang.String queryString,
java.lang.String[] paramNames,
java.lang.Object[] paramValues,
boolean cacheQuery)
Perform query. |
java.util.List |
query(java.lang.String queryString,
java.lang.String[] paramNames,
java.lang.Object[] paramValues,
boolean cacheQuery,
int maxResults)
Perform query. |
void |
refresh(java.lang.Object obj)
Refresh an object. |
void |
rollback()
Rolls back a transaction if one is in progress. |
void |
save(java.util.Collection collection)
Saves a collection of objects. |
void |
save(java.lang.Object obj)
Saves an object (makes it persistent). |
org.hibernate.ScrollableResults |
scrollableQuery(java.lang.String queryString)
Perform scrollable query. |
org.hibernate.ScrollableResults |
scrollableQuery(java.lang.String queryString,
boolean cacheQuery)
Perform scrollable query. |
org.hibernate.ScrollableResults |
scrollableQuery(java.lang.String queryString,
java.lang.String[] paramNames,
java.lang.Object[] paramValues)
Perform scrollable query. |
org.hibernate.ScrollableResults |
scrollableQuery(java.lang.String queryString,
java.lang.String[] paramNames,
java.lang.Object[] paramValues,
boolean cacheQuery)
Perform scrollable query. |
org.hibernate.ScrollableResults |
scrollableQuery(java.lang.String queryString,
java.lang.String[] paramNames,
java.lang.Object[] paramValues,
boolean cacheQuery,
int maxResults)
Perform scrollable query. |
void |
setQueryParams(org.hibernate.Query query,
java.lang.String[] paramNames,
java.lang.Object[] paramValues,
boolean cacheQuery,
boolean singleResult,
int maxResults)
Set query parameters and values. |
void |
update(java.util.Collection collection)
Updates collection of objects. |
void |
update(java.lang.Object obj)
Updates an object. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
protected static org.hibernate.SessionFactory sessionFactory
Note that this field is static - there is only one session factory for the entire program.
protected org.hibernate.Session session
Note that this field is not static - each HibernatePersistenceManager has its own private Hibernate session, generated by the factory when the persistence manager is constructed.
protected org.hibernate.Transaction t
protected static final java.lang.ThreadLocal threadPM
protected static boolean stackTracesEnabled
public static final int JDBC_BATCH_SIZE
Constructor Detail |
---|
public HibernatePersistenceManager() throws PersistenceException
PersistenceException
Method Detail |
---|
public static void init(java.lang.String url, java.lang.String username, java.lang.String password, java.lang.String configFilePath, java.lang.Class[] persistentClasses, boolean cache2) throws PersistenceException
url
- URL for MySQL database, or null to use the
"hibernate.properties" or
"hibernate.cfg.xml" for setting
the Hibernate parameters.username
- Username for MySQL database access. Ignored
if url = null.password
- Password for MySQL database access. Ignored
if url = null.configFilePath
- The full path to the configuration file.
May be either a properties file or an
xml file. Ignored if null.persistentClasses
- Array of persistent classes. Should not be
null.cache2
- true to use second level cache.
PersistenceException
public static void init(java.lang.String configFilePath, java.lang.Class[] persistentClasses) throws PersistenceException
configFilePath
- The full path to the configuration file.
May be either a properties file or an
xml file. Ignored if null.persistentClasses
- Array of persistent classes. Should not be
null.
PersistenceException
public static void init(java.lang.Class[] persistentClasses, boolean cache2) throws PersistenceException
persistentClasses
- Array of persistent classes. Should not be
null.cache2
- true to use second level cache.
PersistenceException
public static void init(java.lang.Class[] persistentClasses) throws PersistenceException
persistentClasses
- Array of persistent classes. Should not be
null.
PersistenceException
public org.hibernate.Session getSession()
public void clear()
public static void doClear()
public java.sql.Connection getConnection() throws PersistenceException
PersistenceException
public boolean contains(java.lang.Object obj)
obj
- The object to check.
public static boolean doContains(java.lang.Object obj)
obj
- The object to check.
public void refresh(java.lang.Object obj)
obj
- The object to refresh. public static void doRefresh(java.lang.Object obj)
obj
- The object to refresh. public void evict(java.lang.Class evictionClass) throws PersistenceException
evictionClass
- The persistent class whose cached objects
should be evicted.
PersistenceException
public static void doEvict(java.lang.Class evictionClass)
evictionClass
- The persistent class whose cached objects
should be evicted. public void evict(java.lang.Object obj) throws PersistenceException
obj
- The object to evict.
PersistenceException
public static void doEvict(java.lang.Object obj)
obj
- The object to evict.
PersistenceException
public void close() throws PersistenceException
You should close persistence managers when you are finished with them. Persistence managers may not be reused after they have been closed.
PersistenceException
public static void closePM(HibernatePersistenceManager pm)
pm
- The persistence manager to close.
Any errors are thrown away.
public void begin() throws PersistenceException
PersistenceException
public void commit() throws PersistenceException
PersistenceException
public void flush() throws PersistenceException
PersistenceException
public void rollback() throws PersistenceException
PersistenceException
public void save(java.lang.Object obj) throws PersistenceException
If a transaction is not already in progress, a new transaction is started and commited for the operation.
obj
- The object.
PersistenceException
public void save(java.util.Collection collection) throws PersistenceException
If a transaction is not already in progress, a new transaction is started and committed for the operation.
collection
- Collection of objects.
PersistenceException
public static boolean doSave(java.lang.Object obj)
If a transaction is not already in progress, a new transaction is started and committed for the operation.
obj
- Object to save.
public static boolean doSave(java.util.Collection collection)
If a transaction is not already in progress, a new transaction is started and committed for the operation.
collection
- Collection of objects.
public void delete(java.lang.Object obj) throws PersistenceException
If a transaction is not already in progress, a new transaction is started and commited for the operation.
obj
- The object.
PersistenceException
public void delete(java.util.Collection collection) throws PersistenceException
If a transaction is not already in progress, a new transaction is started and commited for the operation.
collection
- Collection of objects.
PersistenceException
public static boolean doDelete(java.lang.Object obj)
If a transaction is not already in progress, a new transaction is started and committed for the operation.
obj
- Object to delete.
public static boolean doDelete(java.util.Collection collection)
If a transaction is not already in progress, a new transaction is started and committed for the operation.
collection
- Collection of objects to delete.
public static HibernatePersistenceManager getHPM() throws PersistenceException
A new persistence manager for the current thread is created if it does not yet exist.
PersistenceException
public java.lang.Object get(java.lang.Class type, java.lang.Long id) throws PersistenceException
Note that every model object has a unique persistent id of type Long. These id's are assigned by Hibernate and MySQL. The combination of a persistent object's Java type (class) and its id uniquely identifies the object. The returned object is never supposed to be a proxy object.
type
- The object's class.id
- The object's id.
PersistenceException
public static java.lang.Object doGet(java.lang.Class type, java.lang.Long id)
type
- The object's class.id
- The object's id.
public java.lang.Object load(java.lang.Class type, java.lang.Long id) throws PersistenceException
Note that every model object has a unique persistent id of type Long. These id's are assigned by Hibernate and MySQL. The combination of a persistent object's Java type (class) and its id uniquely identifies the object. The returned object may be a proxy object.
type
- The object's class.id
- The object's id.
PersistenceException
public static java.lang.Object doLoad(java.lang.Class type, java.lang.Long id)
type
- The object's class.id
- The object's id.
public void update(java.lang.Object obj) throws PersistenceException
obj
- The persistent object to update on the database.
PersistenceException
public void update(java.util.Collection collection) throws PersistenceException
collection
- The collection containing persistence objects
to update on the database.
PersistenceException
public static boolean doUpdate(java.lang.Object obj)
obj
- The persistent object to update on the database.
public static boolean doUpdate(java.util.Collection collection)
collection
- The collection containing persistence objects
to update on the database.
public int deleteViaQuery(java.lang.String queryString, java.lang.String[] paramNames, java.lang.Object[] paramValues) throws PersistenceException
queryString
- The query string.paramNames
- Parameter names used in the query.paramValues
- Parameter values for each paramName.
PersistenceException
public int deleteViaQuery(java.lang.String queryString) throws PersistenceException
queryString
- The query string.
PersistenceException
public int deleteViaSQL(java.lang.String queryString) throws PersistenceException
queryString
- The query string.
PersistenceException
- This method provides for executing a standard SQL "delete from" query. Until the Hibernate parser handles all queries and batch deletes correctly, this is the fastest way to perform batch deletes.
public void setQueryParams(org.hibernate.Query query, java.lang.String[] paramNames, java.lang.Object[] paramValues, boolean cacheQuery, boolean singleResult, int maxResults)
query
- The query for which to set parameters and values.paramNames
- The query parameter names.paramValues
- The parameter values.cacheQuery
- True to cache the query.singleResult
- true if query will return single result.maxResults
- Maximum number of results to return.
0 = no limit. public java.util.List query(java.lang.String queryString, java.lang.String[] paramNames, java.lang.Object[] paramValues, boolean cacheQuery, int maxResults) throws PersistenceException
queryString
- The query string.paramNames
- Parameter names used in the query.paramValues
- Parameter values for each paramName.cacheQuery
- True to cache the query.maxResults
- Maximum number of results to return.
0 = no limit.
PersistenceException
- Any parameter that is not of type String, Integer, Long, Boolean, or Collection is assumed to be an entity reference.
public java.util.List query(java.lang.String queryString, java.lang.String[] paramNames, java.lang.Object[] paramValues, boolean cacheQuery) throws PersistenceException
queryString
- The query string.paramNames
- Parameter names used in the query.paramValues
- Parameter values for each paramName.cacheQuery
- True to cache the query.
PersistenceException
- Any parameter that is not of type String, Integer, Long, Boolean, or Collection is assumed to be an entity reference.
public java.util.List query(java.lang.String queryString, java.lang.String[] paramNames, java.lang.Object[] paramValues) throws PersistenceException
queryString
- The query string.paramNames
- Parameter names used in the query.paramValues
- Parameter values for each paramName.
PersistenceException
- Any parameter that is not of type String, Integer, or Long is assumed to be an entity reference.
public static java.util.List doQuery(java.lang.String queryString, java.lang.String[] paramNames, java.lang.Object[] paramValues, boolean cacheQuery, int maxResults)
queryString
- The query string.paramNames
- Parameter names used in the query.paramValues
- Parameter values for each paramName.cacheQuery
- True to cache query.maxResults
- Maximum number of result rows to retrieve.
public static java.util.List doQuery(java.lang.String queryString, java.lang.String[] paramNames, java.lang.Object[] paramValues, boolean cacheQuery)
queryString
- The query string.paramNames
- Parameter names used in the query.paramValues
- Parameter values for each paramName.cacheQuery
- True to cache query.
public static java.util.List doQuery(java.lang.String queryString, java.lang.String[] paramNames, java.lang.Object[] paramValues)
queryString
- The query string.paramNames
- Parameter names used in the query.paramValues
- Parameter values for each paramName.
public java.util.List query(java.lang.String queryString, boolean cacheQuery) throws PersistenceException
queryString
- The query string.cacheQuery
- True to cache query.
PersistenceException
public java.util.List query(java.lang.String queryString) throws PersistenceException
queryString
- The query string.
PersistenceException
public static java.util.List doQuery(java.lang.String queryString, boolean cacheQuery)
queryString
- The query string.cacheQuery
- True to cache the query results.
public static java.util.List doQuery(java.lang.String queryString, int maxResults)
queryString
- The query string.maxResults
- Maximum number of results.
public static java.util.List doQuery(java.lang.String queryString)
queryString
- The query string.
public int countQuery(java.lang.String queryString, java.lang.String[] paramNames, java.lang.Object[] paramValues) throws PersistenceException
queryString
- The query string.
A "select count(*) " phrase is added to
the front, so DO NOT specify this in the
input query string.paramNames
- Parameter names used in the query.paramValues
- Parameter values for each paramName.
PersistenceException
public static int doCountQuery(java.lang.String queryString, java.lang.String[] paramNames, java.lang.Object[] paramValues)
queryString
- The query string.paramNames
- Parameter names used in the query.paramValues
- Parameter values for each paramName.
public int insertViaSQL(java.lang.String insertString) throws PersistenceException
insertString
- The SQL insert string.
PersistenceException
- This method provides for executing a standard SQL "insert" query. This is much faster than using standard Hibernate facilities for large batches of inserts.
public static int doInsertViaSQL(java.lang.String insertString)
insertString
- The SQL insert string.
public org.hibernate.ScrollableResults scrollableQuery(java.lang.String queryString, java.lang.String[] paramNames, java.lang.Object[] paramValues, boolean cacheQuery, int maxResults) throws PersistenceException
queryString
- The query string.paramNames
- Parameter names used in the query.paramValues
- Parameter values for each paramName.cacheQuery
- True to cache the query.maxResults
- Maximum number of results to return.
0 = no limit.
PersistenceException
- Any parameter that is not of type String, Integer, Long, Boolean, or Collection is assumed to be an entity reference.
public org.hibernate.ScrollableResults scrollableQuery(java.lang.String queryString, java.lang.String[] paramNames, java.lang.Object[] paramValues, boolean cacheQuery) throws PersistenceException
queryString
- The query string.paramNames
- Parameter names used in the query.paramValues
- Parameter values for each paramName.cacheQuery
- True to cache the query.
PersistenceException
- Any parameter that is not of type String, Integer, Long, Boolean, or Collection is assumed to be an entity reference.
public org.hibernate.ScrollableResults scrollableQuery(java.lang.String queryString, java.lang.String[] paramNames, java.lang.Object[] paramValues) throws PersistenceException
queryString
- The query string.paramNames
- Parameter names used in the query.paramValues
- Parameter values for each paramName.
PersistenceException
- Any parameter that is not of type String, Integer, or Long is assumed to be an entity reference.
public static org.hibernate.ScrollableResults doScrollableQuery(java.lang.String queryString, java.lang.String[] paramNames, java.lang.Object[] paramValues, boolean cacheQuery, int maxResults)
queryString
- The query string.paramNames
- Parameter names used in the query.paramValues
- Parameter values for each paramName.cacheQuery
- True to cache query.maxResults
- Maximum number of result rows to retrieve.
public static org.hibernate.ScrollableResults doScrollableQuery(java.lang.String queryString, java.lang.String[] paramNames, java.lang.Object[] paramValues, boolean cacheQuery)
queryString
- The query string.paramNames
- Parameter names used in the query.paramValues
- Parameter values for each paramName.cacheQuery
- True to cache query.
public static org.hibernate.ScrollableResults doScrollableQuery(java.lang.String queryString, java.lang.String[] paramNames, java.lang.Object[] paramValues)
queryString
- The query string.paramNames
- Parameter names used in the query.paramValues
- Parameter values for each paramName.
public org.hibernate.ScrollableResults scrollableQuery(java.lang.String queryString, boolean cacheQuery) throws PersistenceException
queryString
- The query string.cacheQuery
- True to cache query.
PersistenceException
public org.hibernate.ScrollableResults scrollableQuery(java.lang.String queryString) throws PersistenceException
queryString
- The query string.
PersistenceException
public static org.hibernate.ScrollableResults doScrollableQuery(java.lang.String queryString, boolean cacheQuery)
queryString
- The query string.cacheQuery
- True to cache the query results.
public static org.hibernate.ScrollableResults doScrollableQuery(java.lang.String queryString)
queryString
- The query string.
public static void enableStackTraces(boolean enableTraces)
enableTraces
- true to enable tracing. public static int getBatchSize()
public org.hibernate.connection.ConnectionProvider getConnectionProvider()
public int performBatchInserts(java.lang.String[] insertStatements) throws PersistenceException
insertStatements
- String array of MySQL insert statements.
PersistenceException
WordHoardError
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |