|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object java.util.AbstractMap<K,V> org.norther.tammi.acorn.util.ConcurrentAbstractMap<K,V> org.norther.tammi.acorn.util.ConcurrentReadMap<K,V> org.norther.tammi.acorn.util.OrderedHashMap<String,Object> org.norther.tammi.core.config.Configuration
public class Configuration
An extension to java.util.Properties
adding the possibility to
use the same key many times concatenating the value strings instead of
overwriting them.
The extended properties syntax is explained below:
key = value
, or
alternatively key: value
.include = additional.propertieswill include the additional.properties file as if it was part of the original property file. The suffix of the include property, e.g. "include.resource", is used as a key for the path finder. The root folder is applied if the key is not specified.
Here is an example of a valid extended properties file:
## # Lines starting with # are comments. # This is the simplest property. key = value ## # A long property may be separated on multiple lines. longvalue = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ## # This is a property with many tokens. tokens_on_a_line = first token, second token ## # This sequence generates exactly the same result. tokens_on_multiple_lines = first token tokens_on_multiple_lines = second token ## # Separators may be escaped in tokens. commas.excaped = Hi\, what'up?
NOTE : this class has not been written for performance nor low memory usage. In fact, it's way slower than it could be and generates too much memory garbage. But since performance is not an issue during intialization (and there is not much time to improve it), I wrote it this way. If you don't like it, go ahead and tune it up!
Based on ExtendedProperties
in the Apache Jakarta Commons
project.
Nested Class Summary | |
---|---|
protected static class |
Configuration.PropertiesReader
This class is used to read properties lines. |
Nested classes/interfaces inherited from class org.norther.tammi.acorn.util.ConcurrentAbstractMap |
---|
ConcurrentAbstractMap.ConcurrentEntry<K,V>, ConcurrentAbstractMap.Modification |
Nested classes/interfaces inherited from class java.util.AbstractMap |
---|
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V> |
Nested classes/interfaces inherited from interface java.util.Map |
---|
Map.Entry<K,V> |
Field Summary |
---|
Fields inherited from class org.norther.tammi.acorn.util.ConcurrentReadMap |
---|
DEFAULT_CAPACITY, MAXIMUM_CAPACITY, MINIMUM_CAPACITY |
Fields inherited from class org.norther.tammi.acorn.util.ConcurrentAbstractMap |
---|
DEFAULT_LOAD_FACTOR |
Constructor Summary | |
---|---|
Configuration()
Creates an empty extended properties instance. |
|
Configuration(Configuration defs)
Creates an empty extended properties instance with defaults. |
|
Configuration(MBeanReference<?> reference)
Creates an empty extended properties instance for the specified MBean. |
|
Configuration(MBeanReference<?> reference,
Configuration defs)
Creates an empty extended properties instance for the specified MBean with defaults. |
|
Configuration(MBeanReference<?> reference,
String path)
Creates and loads extended properties from the specified file for the specified MBean. |
|
Configuration(MBeanReference<?> reference,
String path,
String defaultPath)
Creates and loads extended properties from the specified file with default values from another file for the specified MBean. |
|
Configuration(String path)
Creates and loads extended properties from the specified file. |
|
Configuration(String path,
String defaultPath)
Creates and loads extended properties from the specified file with default values from another file. |
Method Summary | |
---|---|
boolean |
add(String key,
Object value)
Associates the specified value with the specified key in this map if not already mapped. |
boolean |
addAt(int index,
String key,
Object value)
Associates the specified value with the specified key at the specified index in this map if not already mapped. |
void |
addProperties(int index,
String key,
String[] values)
Adds multivalued property values at the specified index. |
void |
addProperties(int index,
String key,
String[] values,
String separator)
Adds multivalued property values at the specified index with the specified separator. |
void |
addProperties(String key,
String[] values)
Adds multivalued property values. |
void |
addProperty(int index,
String key,
String value)
Adds a multivalued property value at the specified index. |
void |
addProperty(String key,
String value)
Adds a multivalued property value. |
void |
addTraceListener(TraceListener listener)
Adds a listener if not already present. |
void |
clear()
|
void |
clearLastModified()
Clears the timestamp of the last modification of the traced object. |
void |
clearTraceListeners()
Clears all listeners from this traceable. |
Object |
clone()
|
boolean |
containsProperty(String key)
Checks whether a property is available. |
boolean |
getBoolean(String key)
Gets a boolean property value. |
boolean |
getBoolean(String key,
boolean defaultValue)
Gets a boolean property value with a default. |
Boolean |
getBoolean(String key,
Boolean defaultValue)
Gets a Boolean property value with a default. |
byte |
getByte(String key)
Gets a byte property value. |
byte |
getByte(String key,
byte defaultValue)
Gets a byte property value with a default. |
Byte |
getByte(String key,
Byte defaultValue)
Gets a Byte property value with a default. |
static String |
getDelimiterKey()
Gets the property key for a key delimiter. |
double |
getDouble(String key)
Gets a double property value. |
double |
getDouble(String key,
double defaultValue)
Gets a double property value with a default. |
Double |
getDouble(String key,
Double defaultValue)
Gets a Double property value with a default. |
float |
getFloat(String key)
Gets a float property value. |
float |
getFloat(String key,
float defaultValue)
Gets a float property value with a default. |
Float |
getFloat(String key,
Float defaultValue)
Gets a Float property value with a default. |
static String |
getIncludeKey()
Gets the property key for including other properties files. |
int |
getInt(String key)
Gets an int property value. |
int |
getInt(String key,
int defaultValue)
Gets an int property value with a default. |
Integer |
getInteger(String key,
Integer defaultValue)
Gets an Integer property value with a default. |
String |
getItemSeparator()
Gets the item separator(s). |
String |
getKeyDelimiter()
Gets the key delimiters(s). |
long |
getLastModified()
Gets the timestamp of the last modification of the traced object. |
long |
getLastModified(Object key)
Gets the timestamp of the last modification of the specified resource. |
long |
getLong(String key)
Gets a long property value. |
long |
getLong(String key,
long defaultValue)
Gets a long property value with a default. |
Long |
getLong(String key,
Long defaultValue)
Gets a Long property value with a default. |
static String |
getNullKey()
Gets the property key for a null value. |
String |
getNullValue()
Gets the null value. |
String[] |
getProperties(String key)
Gets a multivalued property value. |
String[] |
getProperties(String key,
String[] defaultValues)
Gets multivalued property values with defaults. |
String |
getProperty(String key)
Gets a property value. |
String |
getProperty(String key,
String defaultValue)
Gets a property value with a default. |
static String |
getSeparatorKey()
Gets the property key for a list separator. |
short |
getShort(String key)
Gets a short property value. |
short |
getShort(String key,
short defaultValue)
Gets a short property value with a default. |
Short |
getShort(String key,
Short defaultValue)
Gets a Short property value with a default. |
int |
indexOfProperty(String key,
String value)
Returns the index of a multivalued property value. |
void |
load(InputStream input)
Loads the properties from an input stream by applying the ISO-8859-1 encoding to be compatible with java.util.Properties . |
void |
load(InputStream input,
String encoding)
Loads the properties from an input stream using the specified encoding. |
void |
load(Properties props)
Loads the properties from properties. |
void |
load(Reader reader)
Loads the properties from a reader. |
void |
loadFromXML(InputStream input)
Loads the properties represented by the XML document on the specified input stream into this configuration. |
void |
loadProperty(String key,
String value)
Loads a property by applying the same escaping rules as other load methods. |
void |
merge(Map<String,Object> map)
Merges the specified map to this configuration. |
Enumeration<String> |
propertyNames()
Returns an enumeration of all property names including the defaults. |
Object |
put(int index,
String key,
Object value)
Associates the specified value with the specified key at the specified index in this map. |
Object |
put(String key,
Object value)
|
Object |
putIfAbsent(int index,
String key,
Object value)
Associates the specified value with the specified key at the specified index in this map if not already mapped. |
Object |
putIfAbsent(String key,
Object value)
|
Object |
remove(Object key)
|
boolean |
remove(Object key,
Object value)
|
Map.Entry<String,Object> |
removeAt(int index)
Removes the indexed element in this map. |
boolean |
removeProperties(String key,
String[] values)
Removes multivalued property values. |
Object |
removeProperty(String key)
Removes a property. |
boolean |
removeProperty(String key,
String value)
Removes a multivalued property value. |
void |
removeTraceListener(TraceListener listener)
Removes a listener. |
Object |
replace(int index,
Object value)
Replaces the indexed element in this map. |
Object |
replace(String key,
Object value)
|
boolean |
replace(String key,
Object oldValue,
Object newValue)
|
static void |
setDelimiterKey(String key)
Sets the property key for a key delimiter. |
static void |
setIncludeKey(String key)
Sets the property key for including other properties files. |
void |
setItemSeparator(String separator)
Sets the item separator(s). |
void |
setKeyDelimiter(String delimiter)
Sets the key delimiter(s). |
void |
setLastModified(Object key,
long timestamp)
Sets the timestamp of the last modification of the specified resource. |
static void |
setNullKey(String key)
Sets the property key for a null value. |
void |
setNullValue(String nul)
Sets the null value. |
Object |
setProperties(String key,
String[] values)
Sets a multivalued property value. |
Object |
setProperty(String key,
String value)
Sets a property value. |
static void |
setSeparatorKey(String key)
Sets the property key for a list separator. |
void |
store(OutputStream output,
String header)
Stores the properties to the given output stream using uencoding. |
void |
store(OutputStream output,
String header,
String encoding)
Stores the properties to the given output stream using the specified encoding. |
void |
store(Writer writer,
String header)
Stores the properties to the given writer. |
void |
storeToXML(OutputStream output,
String header)
Stores an XML document representing the properties contained in this configuration by applying the UTF-8 encoding. |
void |
storeToXML(OutputStream output,
String header,
String encoding)
Stores an XML document representing the properties contained in this configuration by applying the specified encoding. |
Set<String> |
stringPropertyNames()
Returns a set of all property names including the defaults. |
Configuration |
subset(String prefix)
Returns a configuration that is a subset of this one. |
Configuration |
subset(String prefix,
String suffix)
Returns a configuration that is a subset of this one. |
Properties |
toProperties()
Converts this configuration to properties. |
Properties |
toProperties(String prefix)
Converts a subset of this configuration to properties. |
Methods inherited from class org.norther.tammi.acorn.util.OrderedHashMap |
---|
elements, entryList, entrySet, get, getEntryAt, getKeyAt, indexOfKey, isModifiable, keyList, keys, keySet, putAll, putEntry, removeEntry, set, shift, valueList, values |
Methods inherited from class org.norther.tammi.acorn.util.ConcurrentReadMap |
---|
capacity, containsValue, getEntry, getEntryTable, isEmpty, putAll, rehash, replaceEntry, setEntryTable, size |
Methods inherited from class org.norther.tammi.acorn.util.ConcurrentAbstractMap |
---|
capacity, contains, containsKey, get |
Methods inherited from class java.util.AbstractMap |
---|
equals, hashCode, toString |
Methods inherited from class java.lang.Object |
---|
finalize, getClass, notify, notifyAll, wait, wait, wait |
Methods inherited from interface java.util.Map |
---|
containsKey, containsValue, equals, get, hashCode, isEmpty, putAll, size |
Constructor Detail |
---|
public Configuration()
public Configuration(Configuration defs)
defs
- the default configuration.public Configuration(String path) throws IOException
path
- the pathname of the properties file.
IOException
- on I/O errors.public Configuration(String path, String defaultPath) throws IOException
path
- the pathname of the properties file.defaultPath
- the pathname of the defaults file.
IOException
- on I/O errors.public Configuration(MBeanReference<?> reference)
reference
- the MBean reference.public Configuration(MBeanReference<?> reference, Configuration defs)
reference
- the MBean reference.defs
- the default configuration.public Configuration(MBeanReference<?> reference, String path) throws IOException
reference
- the MBean reference.path
- the pathname of the properties file.
IOException
- on I/O errors.public Configuration(MBeanReference<?> reference, String path, String defaultPath) throws IOException
reference
- the MBean reference.path
- the pathname of the properties file.defaultPath
- the pathname of the defaults file.
IOException
- on I/O errors.Method Detail |
---|
public static String getNullKey()
public static void setNullKey(String key)
key
- the null value property key.public static String getDelimiterKey()
public static void setDelimiterKey(String key)
key
- the key delimiter property key.public static String getSeparatorKey()
public static void setSeparatorKey(String key)
key
- the list separator property key.public static String getIncludeKey()
public static void setIncludeKey(String key)
key
- the include property key.public Object clone()
clone
in class OrderedHashMap<String,Object>
public void clear()
clear
in interface Map<String,Object>
clear
in class OrderedHashMap<String,Object>
public Object put(String key, Object value)
put
in interface Map<String,Object>
put
in class ConcurrentAbstractMap<String,Object>
public Object remove(Object key)
remove
in interface Map<String,Object>
remove
in class ConcurrentAbstractMap<String,Object>
public Object putIfAbsent(String key, Object value)
putIfAbsent
in interface ConcurrentMap<String,Object>
putIfAbsent
in class ConcurrentAbstractMap<String,Object>
public boolean add(String key, Object value)
ConcurrentAbstractMap
add
in interface OrderedMap<String,Object>
add
in class ConcurrentAbstractMap<String,Object>
key
- key with which the specified value is to be associated.value
- value to be associated with the specified key.
public Object replace(String key, Object value)
replace
in interface ConcurrentMap<String,Object>
replace
in class ConcurrentAbstractMap<String,Object>
public boolean replace(String key, Object oldValue, Object newValue)
replace
in interface ConcurrentMap<String,Object>
replace
in class ConcurrentAbstractMap<String,Object>
public boolean remove(Object key, Object value)
remove
in interface ConcurrentMap<String,Object>
remove
in class ConcurrentAbstractMap<String,Object>
public Object put(int index, String key, Object value)
OrderedMap
put
in interface OrderedMap<String,Object>
put
in class OrderedHashMap<String,Object>
index
- the index.key
- the key with which the specified value is to be associated.value
- the value to be associated with the specified key.
public Object putIfAbsent(int index, String key, Object value)
OrderedMap
putIfAbsent
in interface OrderedMap<String,Object>
putIfAbsent
in class OrderedHashMap<String,Object>
index
- the index.key
- the key with which the specified value is to be associated.value
- the value to be associated with the specified key.
public boolean addAt(int index, String key, Object value)
OrderedMap
addAt
in interface OrderedMap<String,Object>
addAt
in class OrderedHashMap<String,Object>
index
- the index.key
- the key with which the specified value is to be associated.value
- the value to be associated with the specified key.
public Object replace(int index, Object value)
OrderedMap
replace
in interface OrderedMap<String,Object>
replace
in class OrderedHashMap<String,Object>
index
- the index.value
- the new value.
public Map.Entry<String,Object> removeAt(int index)
OrderedMap
removeAt
in interface OrderedMap<String,Object>
removeAt
in class OrderedHashMap<String,Object>
index
- the index.
public long getLastModified()
Traceable
getLastModified
in interface Traceable
public long getLastModified(Object key)
Traceable
getLastModified
in interface Traceable
key
- the key of the resource.
public void setLastModified(Object key, long timestamp)
Traceable
setLastModified
in interface Traceable
key
- the key of the resource.timestamp
- the modification timestamp.public void clearLastModified()
Traceable
clearLastModified
in interface Traceable
public void addTraceListener(TraceListener listener)
Traceable
addTraceListener
in interface Traceable
listener
- a listener to add.public void removeTraceListener(TraceListener listener)
Traceable
removeTraceListener
in interface Traceable
listener
- the listener to remove.public void clearTraceListeners()
Traceable
clearTraceListeners
in interface Traceable
public String getNullValue()
public void setNullValue(String nul)
nul
- the null.public String getKeyDelimiter()
public void setKeyDelimiter(String delimiter)
delimiter
- the delimiters(s).public String getItemSeparator()
public void setItemSeparator(String separator)
separator
- the separator(s).public void loadFromXML(InputStream input) throws IOException, InvalidPropertiesFormatException
The XML document must be compatible with the following DTD:
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
input
- the input stream.
IOException
- on I/O errors.
InvalidPropertiesFormatException
- for invalid data.public void storeToXML(OutputStream output, String header) throws IOException
The defaults are not included in the document by this method.
output
- the output stream.header
- an optional header.
IOException
- on I/O errors.public void storeToXML(OutputStream output, String header, String encoding) throws IOException
The defaults are not included in the document by this method.
output
- the output stream.header
- an optional header.encoding
- the encoding.
IOException
- on I/O errors.public void load(InputStream input) throws IOException
java.util.Properties
.
input
- the input stream.
IOException
- on I/O errors.public void load(InputStream input, String encoding) throws IOException
input
- the input stream.encoding
- the encoding.
IOException
- on I/O errors.public void load(Reader reader) throws IOException
reader
- the reader.
IOException
- on I/O errors.public void store(OutputStream output, String header) throws IOException
The defaults are not stored by this method.
output
- the output stream.header
- an optional header.
IOException
- on I/O errors.public void store(OutputStream output, String header, String encoding) throws IOException
The defaults are not stored by this method.
output
- the output stream.header
- an optional header.encoding
- the encoding.
IOException
- on I/O errors.public void store(Writer writer, String header) throws IOException
The defaults are not stored by this method.
writer
- the writer.header
- an optional header.
IOException
- on I/O errors.public void load(Properties props)
props
- the properties.public void merge(Map<String,Object> map)
map
- the map to merge.public Configuration subset(String prefix)
The corresponding subset of the defaults is included as the defaults of the subset, if any.
prefix
- a selection prefix (may be null).
public Configuration subset(String prefix, String suffix)
The corresponding subset of the defaults is included as the defaults of the subset, if any.
prefix
- a selection prefix (may be null).suffix
- a selection suffix (may be null).
public Properties toProperties()
The corresponding subset of the defaults is included as the defaults of the subset, if any.
public Properties toProperties(String prefix)
The corresponding subset of the defaults is included as the defaults of the subset, if any.
prefix
- a property name prefix.
public boolean containsProperty(String key)
key
- the key of the property.
public String getProperty(String key)
key
- the key of the property.
public String getProperty(String key, String defaultValue)
key
- the key of the property.defaultValue
- the default value.
public Object setProperty(String key, String value)
key
- the key of the property.value
- the value of the property.
public String[] getProperties(String key)
key
- the key of the property.
public String[] getProperties(String key, String[] defaultValues)
key
- the key of the property.defaultValues
- the default values.
public Object setProperties(String key, String[] values)
key
- the key of the property.values
- the values of the property.
public Object removeProperty(String key)
key
- the key of the property.
public int indexOfProperty(String key, String value)
key
- the key of the property.value
- the value of the property.
public void addProperty(String key, String value)
key
- the key of the property.value
- the value of the property.public void addProperty(int index, String key, String value)
index
- the index.key
- the key of the property.value
- the value of the property.public boolean removeProperty(String key, String value)
key
- the key of the property.value
- the value of the property.
public void addProperties(String key, String[] values)
key
- the key of the property.values
- the values of the property.public void addProperties(int index, String key, String[] values)
index
- the index.key
- the key of the property.values
- the values of the property.public boolean removeProperties(String key, String[] values)
key
- the key of the property.values
- the values of the property.
public void loadProperty(String key, String value)
key
- the key of the property.value
- the value of the property.public Enumeration<String> propertyNames()
public Set<String> stringPropertyNames()
public boolean getBoolean(String key)
key
- the key of the property.
NoSuchElementException
- if the key doesn't map to an existing
object.
ClassCastException
- if the key maps to an object that is not a
Boolean.public boolean getBoolean(String key, boolean defaultValue)
key
- the key of the property.defaultValue
- the default value.
ClassCastException
- if the key maps to an object that is not a
Boolean.public Boolean getBoolean(String key, Boolean defaultValue)
key
- the key of the property.defaultValue
- the default value.
ClassCastException
- if the key maps to an object that is not a
Boolean.public byte getByte(String key)
key
- the key of the property.
NoSuchElementException
- if the key doesn't map to an existing
object.
ClassCastException
- if the key maps to an object that is not a
Byte.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public byte getByte(String key, byte defaultValue)
key
- the key of the property.defaultValue
- the default value.
ClassCastException
- if the key maps to an object that is not a
Byte.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public Byte getByte(String key, Byte defaultValue)
key
- the key of the property.defaultValue
- the default value.
ClassCastException
- if the key maps to an object that is not a
Byte.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public short getShort(String key)
key
- the key of the property.
NoSuchElementException
- if the key doesn't map to an existing
object.
ClassCastException
- if the key maps to an object that is not a
Short.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public short getShort(String key, short defaultValue)
key
- the key of the property.defaultValue
- the default value.
ClassCastException
- if the key maps to an object that is not a
Short.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public Short getShort(String key, Short defaultValue)
key
- the key of the property.defaultValue
- the default value.
ClassCastException
- if the key maps to an object that is not a
Short.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public int getInt(String key)
key
- the key of the property.
NoSuchElementException
- if the key doesn't map to an existing
object.
ClassCastException
- if the key maps to an object that is not a
Integer.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public int getInt(String key, int defaultValue)
key
- the key of the property.defaultValue
- the default value.
ClassCastException
- if the key maps to an object that is not a
Integer.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public Integer getInteger(String key, Integer defaultValue)
key
- the key of the property.defaultValue
- the default value.
ClassCastException
- if the key maps to an object that is not a
Integer.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public long getLong(String key)
key
- the key of the property.
NoSuchElementException
- if the key doesn't map to an existing
object.
ClassCastException
- if the key maps to an object that is not a
Long.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public long getLong(String key, long defaultValue)
key
- the key of the property.defaultValue
- the default value.
ClassCastException
- if the key maps to an object that is not a
Long.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public Long getLong(String key, Long defaultValue)
key
- the key of the property.defaultValue
- the default value.
ClassCastException
- if the key maps to an object that is not a
Long.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public float getFloat(String key)
key
- the key of the property.
NoSuchElementException
- if the key doesn't map to an existing
object.
ClassCastException
- if the key maps to an object that is not a
Float.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public float getFloat(String key, float defaultValue)
key
- the key of the property.defaultValue
- the default value.
ClassCastException
- if the key maps to an object that is not a
Float.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public Float getFloat(String key, Float defaultValue)
key
- the key of the property.defaultValue
- the default value.
ClassCastException
- if the key maps to an object that is not a
Float.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public double getDouble(String key)
key
- the key of the property.
NoSuchElementException
- if the key doesn't map to an existing
object.
ClassCastException
- if the key maps to an object that is not a
Double.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public double getDouble(String key, double defaultValue)
key
- the key of the property.defaultValue
- the default value.
ClassCastException
- if the key maps to an object that is not a
Double.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public Double getDouble(String key, Double defaultValue)
key
- the key of the property.defaultValue
- the default value.
ClassCastException
- if the key maps to an object that is not a
double.
NumberFormatException
- if the value mapped by the key has not a
valid number format.public void addProperties(int index, String key, String[] values, String separator)
index
- the index (-1 = end).key
- the key of the property.values
- the values of the property.separator
- the item separator.
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |