|
![]() |
||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectjavax.swing.tree.DefaultMutableTreeNode
PIRL.PVL.Parameter
PIRL.Messenger.Message
public class Message
A Message contains a message and its routing information.
A Message is a Parameter Aggregate and the message routing information. A Message is typically managed by a Messenger.
Parameter
,
Messenger
,
Serialized FormField Summary | |
---|---|
static String |
ACK_ACTION
Acknowledgment Message ACTION_PARAMETER_NAME value. |
static String |
ACTION_PARAMETER_NAME
A Message parameter specifying the action associated with the message. |
static String |
CLASS_ID_PARAMETER_NAME
Class ID parameter name. |
static String |
CONTENT_AMOUNT_PARAMETER_NAME
A label parameter of a transmitted message with a value that is the number of message label characters to follow. |
static String |
DONE_ACTION
End of messaging - no further messages can be expected - Message ACTION_PARAMETER_NAME value. |
static char |
ERROR_MESSAGE_MARKER
Marks the first character of a Message String
representation when there was a problem rendering the Message
content into valid PVL syntax. |
static String |
ID
Class identification name with source code version and date. |
static String |
IDENTIFY_ACTION
Identify request Message ACTION_PARAMETER_NAME value. |
static String |
IDENTITY_ACTION
Identity Message ACTION_PARAMETER_NAME value. |
static String |
NACK_ACTION
Negative acknowledgment Message ACTION_PARAMETER_NAME value. |
static String |
NAME_PARAMETER_NAME
Sender name in an IDENTIFY_ACTION or IDENTITY_ACTION
action Message. |
static String |
ROUTE_FROM_PARAMETER_NAME
A label parameter of a transmitted message with a value that is the Message route-from list . |
static String |
ROUTE_TO_PARAMETER_NAME
A label parameter of a transmitted message with a value that is the Message route-to list . |
static String |
START_MARKER
Synchronization sequence at the beginning of a trasmitted message. |
static char |
START_MARKER_DELIMITER
Separates the label START_MARKER from its label
size value in a transmitted message. |
static char |
START_MARKER_END
Marks the end of the message label size value and the required message transmission start sequence. |
Fields inherited from class PIRL.PVL.Parameter |
---|
AGGREGATE, ASSIGNMENT, BEGIN_GROUP, BEGIN_OBJECT, END, END_AGGREGATE, END_GROUP, END_OBJECT, END_PVL, GROUP, HIGHEST_BIT, LOWEST_BIT, MASK, OBJECT, TOKEN, UNKNOWN |
Fields inherited from class javax.swing.tree.DefaultMutableTreeNode |
---|
allowsChildren, children, EMPTY_ENUMERATION, parent, userObject |
Constructor Summary | |
---|---|
Message()
Construct an empty Message. |
|
Message(ByteBuffer content)
Construct a Message from the contents of a ByteBuffer. |
|
Message(Message message)
Construct a copy of another Message. |
|
Message(Parameter parameter)
Construct a Message as a copy of a Parameter. |
|
Message(String token)
Construct a Message from a token name. |
Method Summary | |
---|---|
String |
Action()
Get the action associated with this Message. |
static Message |
Action(String action)
Get a Message intitialized with an ACTION_PARAMETER_NAME . |
Message |
Add(Parameter parameter)
Add a Parameter to the Message. |
Message |
Add(String name,
Parameter parameter)
Add a parameter to the Message. |
Message |
Clear_Route_From()
Clear the Message route-from list. |
Message |
Clear_Route_To()
Clear the Message route-to list. |
protected int |
Content_Amount()
Get the value of the CONTENT_AMOUNT_PARAMETER_NAME from the
Message. |
static String |
Content_String(ByteBuffer content)
Get the String representation of Message content bytes. |
Message |
Content(ByteBuffer content)
Set the Message content. |
String |
Destination_Address()
Get the address from the front of the route-to list. |
static Message |
Done()
Get a Message intitialized with a DONE_ACTION ACTION_PARAMETER_NAME . |
String |
From()
Get the next address from the end of the route-from
list. |
Message |
From(String from)
Add an address to the route-from list. |
String |
Get(String name)
Get a named parameter value as a String. |
static Message |
Identify()
Get a Message intitialized with an IDENTIFY_ACTION ACTION_PARAMETER_NAME . |
static Message |
Identity()
Get a Message intitialized with an IDENTITY_ACTION ACTION_PARAMETER_NAME . |
static Message |
Identity(String name)
Get a Message intitialized with an IDENTITY_ACTION ACTION_PARAMETER_NAME and a NAME_PARAMETER_NAME with a
specified name value. |
String |
Matching(String pattern)
Get the String value of a parameter with a name matching a pattern. |
static Message |
NACK()
Get a Message intitialized with a NACK_ACTION ACTION_PARAMETER_NAME . |
protected String |
Packet_Label(int content_amount)
Get the message transmission packet label for a Message |
ByteBuffer |
Packet()
Get the Message content as a transmittable packet. |
String |
Pop_From()
Get the next address off of the end of the route-from list. |
String |
Pop_To()
Get the next address off of the end of the route-to list. |
static Lister |
PVL_Lister()
Get a PVL Lister configured for Message content representation. |
static Parser |
PVL_Parser()
Get a PVL Parser configured for parsing an input stream into Message content. |
String |
PVL()
Get the Message content as a PVL String representation. |
boolean |
Remove_All(String pathname)
Remove all occurances of a named parameter from the Message. |
Parameter |
Remove(String pathname)
Remove a named parameter from the Message. |
Message |
Reply_To(Message message)
Set a Message to be routed back to the sender of another Message. |
int |
Route_From_Count()
Get the count of route-from adresses. |
Value |
Route_From()
Get the Message route-from list. |
Message |
Route_From(Value from)
Set the Message route-from list. |
int |
Route_To_Count()
Get the count of route-to adresses. |
Value |
Route_To()
Get the Message route-to list. |
Message |
Route_To(Message message)
Apply the route-to list from another Message to
this Message. |
Message |
Route_To(Value to)
Set the Message route-to list. |
String |
Routing()
Get the routing description. |
Message |
Set_Token(String name)
Set a named parameter token. |
Message |
Set_Token(String name,
int index)
Set a named parameter token. |
Message |
Set(String name,
double value)
Set a named parameter value. |
Message |
Set(String name,
double value,
int index)
Set a named parameter value. |
Message |
Set(String name,
long value)
Set a named parameter value. |
Message |
Set(String name,
long value,
int index)
Set a named parameter value. |
Message |
Set(String name,
Object value)
Set a named parameter value. |
Message |
Set(String name,
Object value,
int index)
Set a named parameter value at a list index. |
Message |
Set(String name,
String value)
Set a named parameter value. |
Message |
Set(String name,
String value,
int index)
Set a named parameter value. |
String |
Source_Address()
Get the address from the front of the route-from list. |
String |
To()
Get the next address from the end of the route-to
list. |
Message |
To(String to)
Add an address to the route-to list. |
String |
toString()
Get the Message content as a printable PVL String representation. |
static String |
Unescape(String string)
Replace escape sequences in a String with their unescaped equivalents. |
static Value |
Valid_Route(Value value)
Check that a Value is a valid routing address list. |
Value |
Value_of_Matching(String pattern)
Get the Value of a parameter with a name matching a pattern. |
Value |
Value_of(String name)
Get a named parameter value as a Value. |
Methods inherited from class java.lang.Object |
---|
finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Field Detail |
---|
public static final String ID
public static final String ACTION_PARAMETER_NAME
public static final String IDENTIFY_ACTION
ACTION_PARAMETER_NAME
value.
public static final String IDENTITY_ACTION
ACTION_PARAMETER_NAME
value.
public static final String CLASS_ID_PARAMETER_NAME
public static final String NAME_PARAMETER_NAME
IDENTIFY_ACTION
or IDENTITY_ACTION
action Message.
public static final String ACK_ACTION
ACTION_PARAMETER_NAME
value.
public static final String NACK_ACTION
ACTION_PARAMETER_NAME
value.
public static final String DONE_ACTION
ACTION_PARAMETER_NAME
value.
public static final String START_MARKER
Packet_Label(int)
,
Constant Field Valuespublic static final char START_MARKER_DELIMITER
START_MARKER
from its label
size value in a transmitted message.
Packet_Label(int)
,
Constant Field Valuespublic static final char START_MARKER_END
Packet_Label(int)
,
Constant Field Valuespublic static final String CONTENT_AMOUNT_PARAMETER_NAME
Packet_Label(int)
,
Constant Field Valuespublic static final String ROUTE_TO_PARAMETER_NAME
route-to list
.
Packet_Label(int)
,
Constant Field Valuespublic static final String ROUTE_FROM_PARAMETER_NAME
route-from list
.
Packet_Label(int)
,
Constant Field Valuespublic static final char ERROR_MESSAGE_MARKER
String
representation
when there was a problem rendering the Message
content into valid PVL syntax.
Constructor Detail |
---|
public Message()
The Message will be an empty Group with emtpy route-to
and route-from
address lists. The
Name of the Message will be the Parser.CONTAINER_NAME
.
public Message(String token)
A single Token Parameter with a name the same as the token and no Value is added to the new empty Message.
token
- A Token Parameter name.Message()
public Message(Message message) throws PVL_Exception
The Message Name, Parameter content and route-to
and route-from
address lists are
copied into this Message.
message
- The Message to be copied.
PVL_Exception
- If the message contains an invalid Parameter.public Message(Parameter parameter) throws PVL_Exception
The contents of the parameter are copied into an empty Message.
If the copied Parameter is an Assignment it becomes the sole
Parameter in this Message. If it is an Aggregate its Parameter list
becomes the list of Parameters in this Message and its name
becomes the name of this Message.
parameter
- The Parameter to copy into the new Message.
PVL_Exception
- If the Parameter is or contains an invalid
Parameter.Message()
public Message(ByteBuffer content) throws PVL_Exception
content
- The ByteBuffer containing the Message content.
PVL_Exception
Content(ByteBuffer)
,
Message()
Method Detail |
---|
public Message Content(ByteBuffer content) throws PVL_Exception
The current Message content is removed and the new content is added
by parsing
the ByteBuffer data.
N.B.: The ByteBuffer must be positioned at the beginning of
the content data and its limit must be at or beyond the end of the
content data. The position and limit will be unchanged when this
method completes, whether normally or by throwing an exception.
The ByteBuffer content data must be PVL formatted parameters. All the parameters found in the content buffer are added to the Message. The Message itself will retain its name.
content
- The ByteBuffer containing the Message content. If null
the current content of this Message is simply emptied.
PVL_Exception
- If the content can not be parsed by the
Message PVL parser
.public static String Content_String(ByteBuffer content)
If the content buffer has an accessible backing array its contents, from the array offset to the first byte of the buffer plus the buffer position up to the buffer remaining amount, are converted. Otherwise the buffer content, from the buffer position up to the buffer remaining amount, are copied into a temporary array for conversion.
The byte buffer content array is converted to a new String using the
PVL Parser.CHARACTER_ENCODING
.
content
- A ByteBuffer containing the remaining bytes starting
at its current position to be converted to a String.
public ByteBuffer Packet() throws PVL_Exception
A Message packet is a ByteBuffer that contains Message routing information and Message content in a form that can be transmitted over a stream.
The packet begins with a set of label
parameters. The packet label is followed by the Message content as
PVL formatted text
.
All content is US_ASCII encoded that ensurces that 7-bit characters, one character per byte, will be used for the PVL text.
PVL_Exception
- If a valid PVL representation can not be
produced for the Message content.Packet_Label(int)
protected String Packet_Label(int content_amount)
A Message label section contains PVL with the following parts:
START_MARKER
START_MARKER_DELIMITER
START_MARKER
from the label size value that
immediately follows. There are no spaces around the START_MARKER_DELIMITER
character ('=') that separates the parameter
name from its value.
START_MARKER
, START_MARKER_DELIMITER
, the label size representation characters
nor the START_MARKER_END
that immediately follows.
START_MARKER_END
CONTENT_AMOUNT_PARAMETER_NAME
CONTENT_AMOUNT_PARAMETER_NAME
name and
the content amount as its assigned value. An end-of-line sequence
ends the parameter.
ROUTE_TO_PARAMETER_NAME
ROUTE_TO_PARAMETER_NAME
name and the
route-to list
of addresses as its assigned value
array. An end-of-line sequence
ends the
parameter. If this Message has an empty route-to list this parameter
is not included in the label.
ROUTE_FROM_PARAMETER_NAME
ROUTE_FROM_PARAMETER_NAME
name and the
route-from list
of addresses as its assigned
value array. An end-of-line sequence
ends the
parameter. If this Message has an empty route-from list this
parameter is not included in the label.
content_amount
- The value to be assigned to the CONTENT_AMOUNT_PARAMETER_NAME
.
Packet()
protected int Content_Amount() throws PVL_Exception
CONTENT_AMOUNT_PARAMETER_NAME
from the
Message.
This convenience method is used to obtain from a Message label the amount of content data that follows the label section.
CONTENT_AMOUNT_PARAMETER_NAME
.
PVL_Exception
- If the content amount parameter was not
found or its Value could not produce an integer.Packet_Label(int)
public String PVL()
The Message's PVL description
String is generated using a suitably configured PVL Lister
. If the Name of the Message is not the Parser.CONTAINER_NAME
it is temporarily changed to this special name
so a PVL "END" statement will always be provided.
N.B.: If the first character of the resultant String is the
ERROR_MESSAGE_MARKER
character then a problem was
encountered while attempting to generate the PVL syntax from the
Message content. In this case the returned String is an error report.
toString()
public String toString()
The Message's PVL description
String
is generated in standard format. Any escape sequences are converted
to their original character values. As a
result, parameter string values containing new-line sequences, for
example, will be printed as multiple lines. If the Message name
is not the Parser.CONTAINER_NAME
a top-level
group with this name will be included in the PVL represenation and no
PVL "END" statement will be provided; otherwise the top-level
container group will not be included but the "END" statement will be.
N.B.: If the first character of the resultant String is the
ERROR_MESSAGE_MARKER
character then a problem was
encountered while attempting to generate the PVL syntax from the
Message content. In this case the returned String is an error report.
toString
in class Parameter
PVL()
public String Get(String name)
The named Parameter must be an Assignment of a single non-Array Value.
name
- The String naming the parameter to be found. If null,
null will be returned.
Value_of(String)
public String Matching(String pattern)
The matching Parameter must be an Assignment of a single non-Array Value.
pattern
- A regular expression pattern String. If null, null
is returned.
Value_of_Matching(String)
public Value Value_of(String name)
Only an Assignment parameter will be found. The first Assignment parameter with the matching name is returned.
name
- The String naming the parameter to be found. If null,
null is returned.
Get(String)
public Value Value_of_Matching(String pattern)
Only an Assignment parameter will be found.
pattern
- A regular expression pattern String. If null, null
is returned.
public Message Set(String name, Object value, int index) throws PVL_Exception
If a Parameter with the specified name is found its Value is set to the specified value; any existing Value is replaced. If no Parameter is found a new one with the specified Value is added to the parameter list at the specified index.
The specified value may be any object suitable for providing the
data of a Value
. If the specified value is
null and an existing Parameter is found, the Parameter is removed.
If, however, no Parameter is found a null value does nothing.
name
- The name of the Parameter to be assigned the value.
If null nothing is done.value
- A Object that contains the value to be applied,
or null if an existing parameter is to be removed.index
- The index in the parameter list at which to insert
a new Parameter. If less than zero a new parameter will be added
to the beginning of the list (index zero); if greater than or equal
to the size of the parameter list a new parameter will be added
to the end of the list (index equal to the list size).
PVL_Exception
- If the value is not a suitable Object for a
Value.public Message Set(String name, Object value) throws PVL_Exception
If a Parameter with the specified name is found its Value is set to the specified value; any existing Value is replaced. If no Parameter with the specified name is found a new one with the specified value is added to the end of the parameter list.
The specified value may be any object suitable for providing the
data of a Value
. If the specified value is
null and an existing Parameter is found, the Parameter is removed.
If, however, no Parameter is found a null value does nothing.
name
- The name of the Parameter to be assigned the value.
If null nothing is done.value
- A Object that contains the value to be assigned,
or null if an existing parameter is to be removed.
PVL_Exception
- If the value is not a suitable Object for a
Value.Set(String, Object, int)
public Message Set(String name, String value)
This is a convenience method to set a String value with no possibility of an exception being thrown.
name
- The name of the Parameter to be assigned the value.
If null nothing is done.value
- A String value to be assigned, or null if an existing
parameter is to be removed.
Set(String, Object)
public Message Set(String name, String value, int index)
This is a convenience method to set a String value with no possibility of an exception being thrown.
name
- The name of the Parameter to be assigned the value.
If null nothing is done.value
- A String value to be assigned, or null if an existing
parameter is to be removed.index
- The index in the parameter list at which to insert
a new Parameter. If less than zero a new parameter will be added
to the beginning of the list (index zero); if greater than or equal
to the size of the parameter list a new parameter will be added
to the end of the list (index equal to the list size).
Set(String, Object, int)
public Message Set(String name, long value)
This is a convenience method to set an integer value with no possibility of an exception being thrown.
name
- The name of the Parameter to be assigned the value.
If null nothing is done.value
- A long integer value to be assigned.
Set(String, Object)
public Message Set(String name, long value, int index)
This is a convenience method to set an integer value with no possibility of an exception being thrown.
name
- The name of the Parameter to be assigned the value.
If null nothing is done.value
- A long integer value to be assigned.index
- The index in the parameter list at which to insert
a new Parameter. If less than zero a new parameter will be added
to the beginning of the list (index zero); if greater than or equal
to the size of the parameter list a new parameter will be added
to the end of the list (index equal to the list size).
Set(String, Object, int)
public Message Set(String name, double value)
This is a convenience method to set a real number value with no possibility of an exception being thrown.
name
- The name of the Parameter to be assigned the value.
If null nothing is done.value
- A double value to be assigned.
Set(String, Object)
public Message Set(String name, double value, int index)
This is a convenience method to set a real number value with no possibility of an exception being thrown.
name
- The name of the Parameter to be assigned the value.
If null nothing is done.value
- A double value to be assigned.index
- The index in the parameter list at which to insert
a new Parameter. If less than zero a new parameter will be added
to the beginning of the list (index zero); if greater than or equal
to the size of the parameter list a new parameter will be added
to the end of the list (index equal to the list size).
Set(String, Object, int)
public Message Set_Token(String name, int index)
A parameter token has no value. N.B.: If an existing Parameter with the specified name is found it's Value is dropped. If no Parameter with the specified name is found a new one is added to the end of the parameter list.
name
- The name of the token Parameter. If null nothing is done.index
- The index in the parameter list at which to insert
a new Parameter. If less than zero a new parameter will be added
to the beginning of the list (index zero); if greater than or equal
to the size of the parameter list a new parameter will be added
to the end of the list (index equal to the list size).
public Message Set_Token(String name)
The token will be added to the end of the parameter list.
name
- The name of the token Parameter. If null nothing is done.
Set_Token(String, int)
public Message Add(String name, Parameter parameter)
The parameter is copied. The name of the copy is set to the specified name if the specified name is non-null. Then the copy is added to the end of the Message parameter list.
name
- A String that will be the name of the new parameter.
If null, the existing name will be unchanged.parameter
- A Parameter a copy of which will be added to
the end of this Message list. If null, nothing is done.
public Message Add(Parameter parameter)
The Parameter is added to the end of the Message Parameter list. N.B.: The Parameter is not copied.
This is a convenience method to add a Parameter with no possibility of an exception being thrown.
Add
in class Parameter
parameter
- The Parameter to be added to the end of this
Message list. If null, nothing is done.
Add(String, Parameter)
public Parameter Remove(String pathname)
Any parameter at the specified pathname - relative or absolute - is removed from the Message regardless of its Classification (Token, Assignment or Aggregate). Only the first parameter found at the pathname is removed.
pathname
- The pathnname String for the parameter to be removed.
If null nothing is done.
Parameter.Remove(Parameter)
public boolean Remove_All(String pathname)
All parameters at the specified pathname - relative or absolute - are removed from the Message regardless of their Classification (Token, Assignment or Aggregate).
pathname
- The pathnname String for the parameters to be removed.
If null nothing is done.
Parameter.Remove(Parameter)
public String Action()
If an ACTION_PARAMETER_NAME
is found its value is returned.
Otherwise, if the Message contains at least one parameter and
the first parameter is a token (a parameter without a value),
then the token name is returned.
public Message To(String to)
route-to
list.
to
- A Messenger address
.
public String To()
route-to
list.
The address is not removed from the list.
public String Destination_Address()
route-to
list.
The address is not removed from the list.
public String Pop_To()
route-to
list.
The address is removed from the list.
public Value Route_To()
The addresses in the list are LIFO ordered: The last entry is the address of the first Messenger to which the Message should be sent (not the Messenger that sends the Message); the first entry is the intended recipient Messenger where the Message is to be delivered. A Message with an empty route-to list will be delivered by the Messenger that receives it.
Messenger addresses
. This is a copy of
the list owned by the Message.Route_To(Value)
public Message Route_To(Value to) throws PVL_Exception
to
- An Array Value containing zero or more Messenger addresses
. The Value will be
copied into this Message replacing the previous route-to list. If
the Value is null the current list is emptied.
PVL_Exception
- If the Value is not an Array of STRING type
Values.public Message Clear_Route_To()
public Message Route_To(Message message)
route-to list
from another Message to
this Message.
message
- The Message from which to obtain the route-to list.
If the message is the same as this Message, nothing is done.
public int Route_To_Count()
route-to
adresses.
public Message From(String from)
route-from
list.
from
- A Messenger address
.
public String From()
route-from
list.
The address is not removed from the list.
public String Source_Address()
route-from
list.
The address is not removed from the list.
public String Pop_From()
route-from
list.
The address is removed from the list.
public Value Route_From()
Each Messenger that sends a Message adds its adress to the end of the list.
Messenger addresses
. This is a copy of
the list owned by the Message.Route_From(Value)
public Message Route_From(Value from) throws PVL_Exception
from
- An Array Value containing zero or more Messenger addresses
. The Value will be
copied into this Message replacing the previous route-to list. If
the Value is null the current list is emptied.
PVL_Exception
- If the Value is not an Array of STRING type
Values.public Message Clear_Route_From()
public int Route_From_Count()
route-from
adresses.
public String Routing()
public Message Reply_To(Message message)
The route-to
list is of this Message is set
to the route-from
list of the other Message.
The route-from list of this Message is emptied.
message
- The Message to receive a reply.
public static Value Valid_Route(Value value) throws PVL_Exception
A valid routing address list is an Array of STRING Type Values.
value
- The Value to be checked. May not be null, but may
be an empty Array.
PVL_Exception
- If the Value is not an Array or one of its
Value's is not a STRING Type.public static Lister PVL_Lister()
The Lister is configured with verbatim strings
enabled, indenting
disabled and array indenting
disabled. The Lister has no writer bound to it.
Lister
public static Parser PVL_Parser()
The Parser has no source reader bound to it. It has default syntax
modes set except: verbatim
strings
is enabled and string continuation
and input
filtering
are disabled.
N.B.: The Reader that will be bound to the Parser is excpected to employ "US-ASCII" character encoding. Multi-byte characters may produce unexpected results.
N.B.: If the Parser is to be reused with more than one
parsing sequence - such as with different input readers - it
must be reset
before each reuse.
Parser
,
Parser.Set_Reader(Reader, long)
public static Message Identify()
IDENTIFY_ACTION
ACTION_PARAMETER_NAME
.
public static Message Identity(String name)
IDENTITY_ACTION
ACTION_PARAMETER_NAME
and a NAME_PARAMETER_NAME
with a
specified name value.
name
- The name String to be assigned as the value of the
NAME_PARAMETER_NAME
.
public static Message Identity()
IDENTITY_ACTION
ACTION_PARAMETER_NAME
.
public static Message NACK()
NACK_ACTION
ACTION_PARAMETER_NAME
.
public static Message Done()
DONE_ACTION
ACTION_PARAMETER_NAME
.
public static Message Action(String action)
ACTION_PARAMETER_NAME
.
action
- The String specifying the ACTION_PARAMETER_NAME
value.
public static String Unescape(String string)
When Message content contains parameters with multi-line report text, the end-of-line sequences are converted to escape sequences for transmision. This applies to other special characters such as horizontal tabs. Before printing such report text they should have any escape sequences converted back to their original character values.
string
- A String that may contain escape sequences.
|
![]() |
||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |