|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectinfo.sswap.impl.empire.model.ModelImpl
info.sswap.impl.empire.model.SourceModelImpl
public abstract class SourceModelImpl
Implementation of SSWAP model that is directly backed by a Jena model.
Nested Class Summary |
---|
Nested classes/interfaces inherited from interface com.clarkparsia.empire.SupportsRdfId |
---|
com.clarkparsia.empire.SupportsRdfId.BNodeKey, com.clarkparsia.empire.SupportsRdfId.RdfKey<T>, com.clarkparsia.empire.SupportsRdfId.URIKey |
Field Summary | |
---|---|
private java.util.Map<java.util.Set<SSWAPType>,SSWAPType> |
cachedIntersectionTypes
A cache for intersection types created via this source model (to avoid recreating them) The keys are set of the types in the intersection and the value is the corresponding intersection type |
private SSWAPDocument |
closedWorldModel
|
private boolean |
closureEnabled
Flag whether closure computation is enabled for this source model |
private com.hp.hpl.jena.rdf.model.Model |
closureModel
The Jena model containing the closure. |
private java.util.Map<java.net.URI,DatatypeImpl> |
datatypeImpls
|
private java.util.List<ModelImpl> |
dependentModels
All other SSWAPModels that are based on the information from the Jena model. |
private java.util.Map<java.net.URI,java.util.List<ModelImpl>> |
dependentModelsMap
Mapping of URIs of dependent models to actual models. |
private javax.persistence.EntityManager |
entityManager
The entity manager that creates Empire objects based on the information from the Jena model. |
private ExpressivityChecker |
expressivityChecker
|
private long |
maxClosureBytes
A model-specific limit on the number of bytes during closure retrieval. |
private int |
maxClosureThreads
A model-specific limit on number of threads during closure retrieval. |
private long |
maxClosureTime
A model-specific limit on time (in ms) during closure retrieval. |
private com.hp.hpl.jena.rdf.model.Model |
model
The actual Jena model |
private ModelResolver |
mResolver
|
private static java.lang.String |
OWL_IMPORTS_URI
The URI for "owl:imports" property |
private static java.lang.String |
OWL_ONTOLOGY_URI
The URI for "owl:Ontology" resource |
private boolean |
owlDlRequired
|
private java.util.Map<java.net.URI,PredicateImpl> |
predicateImpls
|
private static java.lang.String |
RDF_TYPE_URI
The URI for "rdf:type" property |
private ReasoningServiceImpl |
reasoningServiceImpl
The reasoning service (wrapping a PelletReasoner) for this Jena model. |
static java.lang.String |
SSWAP_ONTOLOGY_URI
The URI used for ontology imports |
private java.util.Map<java.net.URI,TypeImpl> |
typeImpls
A cache of all SSWAP type implementations defined in this Jena model. |
private boolean |
valueValidationEnabled
|
Constructor Summary | |
---|---|
SourceModelImpl()
Initializes an empty, undereferenced SourceModel |
Method Summary | ||
---|---|---|
void |
addDependentModel(ModelImpl dependentModel)
Adds a dependent SSWAP Model to this source model (i.e., a SSWAP model that is created based on the information read from the Jena model) |
|
void |
addImport(java.net.URI uri)
Adds an import to the list of OWL imports of this model. |
|
boolean |
checkProfile(Expressivity expressivity)
Checks whether the model fits a particular expressivity profile (e.g., OWL2 DL) |
|
SSWAPDatatype |
createAnonymousDatatype()
Creates an anonymous SSWAPDatatype |
|
SSWAPType |
createAnonymousRestrictionType()
|
|
SSWAPType |
createAnonymousType()
Creates anonymous type. |
|
protected
|
createCopyObject(T sourceIndividual,
java.net.URI copyURI)
|
|
SSWAPIndividual |
createIndividual()
Creates an anonymous SSWAPIndividual (blank node). |
|
SSWAPIndividual |
createIndividual(java.net.URI uri)
Creates a SSWAPIndividual representation of a specific resource (URI). |
|
SSWAPType |
createIntersectionOf(java.util.Collection<SSWAPType> types)
Creates a SSWAPType in the specified model that is an intersection of the given types. |
|
SSWAPList |
createList()
Creates an empty list. |
|
SSWAPLiteral |
createLiteral(java.lang.String value)
Creates a literal with the specified value. |
|
private com.hp.hpl.jena.rdf.model.Resource |
createOwlOntologyResource()
Creates a correct main owl:Ontology resource in the model (i.e., the one with URI of http://sswapmeet.sswap.info/sswap/owlImports) and typed as owl:Ontology. |
|
SSWAPLiteral |
createTypedLiteral(java.lang.String value,
java.net.URI datatypeURI)
Creates a SSWAPElement that is a typed literal with the specified value. |
|
SSWAPType |
createUnionOf(java.util.Collection<SSWAPType> types)
Creates a SSWAPType in the specified model that is a union of the given types. |
|
void |
dereference()
If the object is not dereferenced, it dereferences it. |
|
void |
dereference(java.io.InputStream is)
Dereferences the object (if it is not yet dereferenced) but it reads the data from the given stream, rather than trying to to retrieve the URI of this object. |
|
void |
dereference(com.hp.hpl.jena.rdf.model.Model model)
Attempts to populate the model with data retrieved from the given Jena model. |
|
int |
doClosure()
Computes closure for this model. |
|
private void |
doDereference(java.lang.Object source)
Performs actual dereferencing |
|
boolean |
equals(java.lang.Object o)
|
|
com.hp.hpl.jena.rdf.model.Model |
getClosedWorldModel()
Gets the model that is used to close the worlds for specific parts of this model (but the statements from the closed world model should not "pollute" the main model). |
|
com.hp.hpl.jena.rdf.model.Model |
getClosureModel()
Gets the Jena model containing the closure. |
|
private static int |
getConnectTimeout()
|
|
SSWAPDatatype |
getDatatype(java.net.URI uri)
Gets a named datatype object |
|
SSWAPModel |
getDependentModel(java.net.URI uri)
Returns the dependent model, identified by its URI, for this source model |
|
|
getDependentModel(java.net.URI uri,
java.lang.Class<T> clazz)
|
|
private java.util.List<ModelImpl> |
getDependentModelList(java.net.URI uri)
|
|
java.util.Collection<SSWAPModel> |
getDependentModels(java.net.URI uri)
Returns all dependent models with the specified uri |
|
javax.persistence.EntityManager |
getEntityManager()
Gets the Empire Entity manager that manages objects created based on the information from that Jena model |
|
private ExpressivityChecker |
getExpressivityChecker()
|
|
java.util.Collection<java.lang.String> |
getImports()
Gets the list of OWL imports in this model (the top-level only). |
|
SSWAPDocument |
getInferredABox()
|
|
SSWAPDocument |
getInferredTBox()
|
|
SSWAPType |
getIntersectionType(java.util.Set<SSWAPType> intersectionComponents)
|
|
long |
getMaxClosureBytes()
|
|
long |
getMaxClosureThreads()
|
|
long |
getMaxClosureTime()
|
|
com.hp.hpl.jena.rdf.model.Model |
getModel()
Gets the underlying Jena model. |
|
protected ModelResolver |
getModelResolver()
|
|
java.util.Map<java.lang.String,java.lang.String> |
getNsPrefixMap()
Gets the map of currently defined namespace prefixes. |
|
private com.hp.hpl.jena.rdf.model.Resource |
getOwlOntologyResource()
Gets the main owl:Ontology resource in the model, if there is one. |
|
SSWAPPredicate |
getPredicate(java.net.URI uri)
Gets a SSWAPPredicate object for the given property URI. |
|
private static int |
getReadTimeout()
|
|
ReasoningService |
getReasoningService()
Gets the reasoning service associated with the underlying RDF data |
|
SSWAPType |
getType(java.net.URI uri)
Gets a SSWAPType for an URI. |
|
int |
hashCode()
Overridden hash code method to make sure that the generated hashcodes are consistent with the overriden equals() method. |
|
protected boolean |
hasJenaModel()
|
|
boolean |
isClosureEnabled()
Returns information whether this source model will perform the closure to deliver terms to its reasoning service |
|
protected boolean |
isOwlDlRequired()
|
|
boolean |
isValueValidationEnabled()
Returns information whether this source model performs validation of values for properties. |
|
|
newIndividual(T sourceIndividual)
Creates a new, anonymous individual, and populates it with data from the sourceIndividual (essentially clones the source individual). |
|
|
newIndividual(T sourceIndividual,
java.net.URI copyURI)
Copies the data from the sourceIndividual into the
individual whose URI is passed as targetURI . |
|
void |
persist()
Writes back any changes to the entity manager and underlying model |
|
void |
refresh()
Refreshes the information encoded in this SSWAP model (and all dependent models) with the information stored in the underlying Jena model. |
|
void |
removeDependentModel(ModelImpl dependentModel)
Removes a dependent SSWAP model from this source model |
|
void |
removeImport(java.net.URI uri)
Removes an import from the list of imports |
|
void |
removeNsPrefix(java.lang.String prefix)
Removes a namespace prefix. |
|
protected void |
resetReasoningService()
|
|
void |
serialize(java.io.OutputStream os)
Serializes the contents of this object to the specified stream as RDF/XML. |
|
void |
serialize(java.io.OutputStream os,
RDFRepresentation rdfRepresentation,
boolean commentedOutput)
Serializes the contents of this object to the specified stream. |
|
void |
setClosureEnabled(boolean closureEnabled)
Sets flag whether this source model will perform the closure to deliver terms to its reasoning service, or whether the reasoning service should solely rely on terms in this source model. |
|
protected void |
setClosureModel(com.hp.hpl.jena.rdf.model.Model clModel)
|
|
void |
setEntityManager(javax.persistence.EntityManager entityManager)
Sets the Empire Entity manager that manages objects created based on the information from that Jena model. |
|
void |
setMaxClosureBytes(long maxClosureBytes)
Sets a model-specific byte limit for retrieving closure for this source model, or restores the system-wide limit. |
|
void |
setMaxClosureThreads(int maxClosureThreads)
Sets a model-specific concurrent thread limit for retrieving closure for this source model, or restores the system-wide limit. |
|
void |
setMaxClosureTime(long maxClosureTime)
Sets a model-specific time limit for retrieving closure for this source model, or restores the system-wide limit. |
|
void |
setModel(com.hp.hpl.jena.rdf.model.Model model)
Replaces the underlying Jena model with another one. |
|
void |
setNsPrefix(java.lang.String prefix,
java.net.URI uri)
Sets a namespace prefix that will be used in serialization of this model. |
|
protected void |
setOwlDlRequired(boolean owlDlRequired)
|
|
void |
setValueValidationEnabled(boolean validationEnabled)
Turns on or off validation of values for properties in this model (i.e., values set via SSWAPIndividual.addProperty() and SSWAPIndividual.setProperty() methods) |
|
void |
validate()
Verifies whether the underlying RDF data conforms to SSWAP syntax and requirements. |
|
void |
validate(boolean strict)
|
Methods inherited from class info.sswap.impl.empire.model.ModelImpl |
---|
assertModel, assertSourceModel, getAllDependentObjects, getDependentObject, getDocument, getExpressivity, getInputStream, getSourceModel, getTypeSignature, getURI, hasSourceModel, hasSourceModelWithEntityManager, isDereferenced, rdfIdEquals, rdfIdHashCode, refreshSiblings, setDereferenced, setSourceModel, setURI |
Methods inherited from class java.lang.Object |
---|
clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait |
Methods inherited from interface info.sswap.impl.empire.model.SourceModel |
---|
isDereferenced |
Methods inherited from interface info.sswap.api.model.SSWAPModel |
---|
getDocument, getInputStream, getTypeSignature, getURI |
Methods inherited from interface com.clarkparsia.empire.SupportsRdfId |
---|
getRdfId, setRdfId |
Field Detail |
---|
public static final java.lang.String SSWAP_ONTOLOGY_URI
private static final java.lang.String OWL_ONTOLOGY_URI
private static final java.lang.String OWL_IMPORTS_URI
private static final java.lang.String RDF_TYPE_URI
private javax.persistence.EntityManager entityManager
private com.hp.hpl.jena.rdf.model.Model model
private com.hp.hpl.jena.rdf.model.Model closureModel
private SSWAPDocument closedWorldModel
private long maxClosureBytes
private long maxClosureTime
private int maxClosureThreads
private boolean closureEnabled
private java.util.List<ModelImpl> dependentModels
private java.util.Map<java.net.URI,java.util.List<ModelImpl>> dependentModelsMap
private ReasoningServiceImpl reasoningServiceImpl
private boolean owlDlRequired
private java.util.Map<java.net.URI,TypeImpl> typeImpls
private java.util.Map<java.util.Set<SSWAPType>,SSWAPType> cachedIntersectionTypes
private java.util.Map<java.net.URI,PredicateImpl> predicateImpls
private java.util.Map<java.net.URI,DatatypeImpl> datatypeImpls
private ExpressivityChecker expressivityChecker
private final ModelResolver mResolver
private boolean valueValidationEnabled
Constructor Detail |
---|
public SourceModelImpl()
Method Detail |
---|
public void addDependentModel(ModelImpl dependentModel)
SourceModel
addDependentModel
in interface SourceModel
dependentModel
- the dependent modelprivate java.util.List<ModelImpl> getDependentModelList(java.net.URI uri)
public void removeDependentModel(ModelImpl dependentModel)
SourceModel
removeDependentModel
in interface SourceModel
dependentModel
- the dependent model to be removedpublic boolean isValueValidationEnabled()
SourceModel
isValueValidationEnabled
in interface SourceModel
public void setValueValidationEnabled(boolean validationEnabled)
SourceModel
setValueValidationEnabled
in interface SourceModel
validationEnabled
- true if the values should be validated, false if the validation should be turned offpublic boolean isClosureEnabled()
SourceModel
isClosureEnabled
in interface SourceModel
public void setClosureEnabled(boolean closureEnabled)
SourceModel
setClosureEnabled
in interface SourceModel
public SSWAPModel getDependentModel(java.net.URI uri)
SourceModel
getDependentModel
in interface SourceModel
public java.util.Collection<SSWAPModel> getDependentModels(java.net.URI uri)
SourceModel
getDependentModels
in interface SourceModel
uri
- the uri
public <T extends SSWAPModel> T getDependentModel(java.net.URI uri, java.lang.Class<T> clazz)
public javax.persistence.EntityManager getEntityManager()
SourceModel
getEntityManager
in interface SourceModel
public com.hp.hpl.jena.rdf.model.Model getModel()
SourceModel
getModel
in interface SourceModel
public com.hp.hpl.jena.rdf.model.Model getClosureModel()
SourceModel
getClosureModel
in interface SourceModel
public com.hp.hpl.jena.rdf.model.Model getClosedWorldModel()
SourceModel
getClosedWorldModel
in interface SourceModel
public void setEntityManager(javax.persistence.EntityManager entityManager)
SourceModel
setEntityManager
in interface SourceModel
entityManager
- the Empire entity manager for the Jena modelpublic void setModel(com.hp.hpl.jena.rdf.model.Model model)
SourceModel
setModel
in interface SourceModel
model
- the new model.private static int getConnectTimeout()
private static int getReadTimeout()
public void dereference() throws DataAccessException
SSWAPModel
dereference
in interface SSWAPModel
dereference
in interface SourceModel
dereference
in class ModelImpl
DataAccessException
- if an error occurred while trying to read the data (e.g., the data source is unavailable or it is impossible to parse)public void dereference(java.io.InputStream is) throws DataAccessException
SSWAPModel
dereference
in interface SSWAPModel
dereference
in interface SourceModel
dereference
in class ModelImpl
is
- the input stream from which the data should be read instead of establishing a network connection
DataAccessException
- if an error occurred while trying to read the data (e.g., the data source is unavailable or it is impossible to parse)private void doDereference(java.lang.Object source) throws DataAccessException
source
-
DataAccessException
- if a problem should occur while accessing the underlying data sourcepublic void dereference(com.hp.hpl.jena.rdf.model.Model model)
SourceModel
dereference
in interface SourceModel
model
- the Jena model that contains the datapublic int doClosure()
doClosure
in interface SSWAPModel
doClosure
in interface SourceModel
doClosure
in class ModelImpl
private ExpressivityChecker getExpressivityChecker()
public boolean checkProfile(Expressivity expressivity)
SSWAPModel
checkProfile
in interface SSWAPModel
checkProfile
in interface SourceModel
checkProfile
in class ModelImpl
expressivity
- expressivity profile
public void refresh()
refresh
in class ModelImpl
public ReasoningService getReasoningService()
SSWAPModel
getReasoningService
in interface SSWAPModel
getReasoningService
in interface SourceModel
getReasoningService
in class ModelImpl
public SSWAPType getType(java.net.URI uri)
SSWAPDocument
getType
in interface SSWAPDocument
uri
- the URI of the type
public SSWAPType getIntersectionType(java.util.Set<SSWAPType> intersectionComponents)
public SSWAPPredicate getPredicate(java.net.URI uri)
SSWAPDocument
getPredicate
in interface SSWAPDocument
uri
- the URI of the property
public SSWAPDatatype getDatatype(java.net.URI uri)
SSWAPDocument
getDatatype
in interface SSWAPDocument
uri
- the URI of the datatype
public void persist()
persist
in class ModelImpl
public void serialize(java.io.OutputStream os)
SSWAPModel
serialize
in interface SSWAPModel
serialize
in interface SourceModel
serialize
in class ModelImpl
os
- output streampublic void serialize(java.io.OutputStream os, RDFRepresentation rdfRepresentation, boolean commentedOutput)
SSWAPModel
serialize
in interface SSWAPModel
serialize
in interface SourceModel
serialize
in class ModelImpl
os
- output streamrdfRepresentation
- the representation, in which the contents should be written (e.g., RDF/XML).commentedOutput
- true, if the output should contain comments about various standard sections of an RDG (valid only for
RDF/XML)public void setNsPrefix(java.lang.String prefix, java.net.URI uri)
SSWAPModel
setNsPrefix
in interface SSWAPModel
setNsPrefix
in interface SourceModel
setNsPrefix
in class ModelImpl
prefix
- the prefixuri
- the corresponding URIpublic void removeNsPrefix(java.lang.String prefix)
SSWAPModel
removeNsPrefix
in interface SSWAPModel
removeNsPrefix
in interface SourceModel
removeNsPrefix
in class ModelImpl
prefix
- the prefix to be removed.public java.util.Map<java.lang.String,java.lang.String> getNsPrefixMap()
SSWAPModel
getNsPrefixMap
in interface SSWAPModel
getNsPrefixMap
in interface SourceModel
getNsPrefixMap
in class ModelImpl
private com.hp.hpl.jena.rdf.model.Resource getOwlOntologyResource()
private com.hp.hpl.jena.rdf.model.Resource createOwlOntologyResource()
public java.util.Collection<java.lang.String> getImports()
ModelImpl
getImports
in interface SSWAPModel
getImports
in interface SourceModel
getImports
in class ModelImpl
public void addImport(java.net.URI uri)
ModelImpl
addImport
in interface SSWAPModel
addImport
in interface SourceModel
addImport
in class ModelImpl
uri
- the URI of the import to be addedpublic void removeImport(java.net.URI uri)
ModelImpl
removeImport
in interface SSWAPModel
removeImport
in interface SourceModel
removeImport
in class ModelImpl
uri
- the import to be removedprotected boolean hasJenaModel()
protected boolean isOwlDlRequired()
protected void setOwlDlRequired(boolean owlDlRequired)
public void validate() throws ValidationException
SSWAPModel
validate
in interface SSWAPModel
validate
in class ModelImpl
ValidationException
- if the data violates SSWAP syntax or requirementspublic void validate(boolean strict) throws ValidationException
ValidationException
public SSWAPType createAnonymousType()
SSWAPDocument
createAnonymousType
in interface SSWAPDocument
public SSWAPType createAnonymousRestrictionType()
public SSWAPIndividual createIndividual()
SSWAPDocument
createIndividual
in interface SSWAPDocument
public SSWAPIndividual createIndividual(java.net.URI uri)
SSWAPDocument
createIndividual
in interface SSWAPDocument
uri
- the URI of the individual to be created; may be null,
in which case an anonymous individual is created
public SSWAPList createList()
SSWAPDocument
createList
in interface SSWAPDocument
public SSWAPLiteral createLiteral(java.lang.String value)
SSWAPDocument
createLiteral
in interface SSWAPDocument
value
- the value of the literal
public SSWAPLiteral createTypedLiteral(java.lang.String value, java.net.URI datatypeURI) throws java.lang.IllegalArgumentException
SSWAPDocument
createTypedLiteral
in interface SSWAPDocument
value
- the value of the literaldatatypeURI
- the URI of the datatype
java.lang.IllegalArgumentException
- if the value is not valid according to the declared datatype URIpublic SSWAPType createIntersectionOf(java.util.Collection<SSWAPType> types)
SSWAPDocument
createIntersectionOf
in interface SSWAPDocument
types
- the types
public SSWAPType createUnionOf(java.util.Collection<SSWAPType> types)
SSWAPDocument
createUnionOf
in interface SSWAPDocument
types
- the types
public SSWAPDatatype createAnonymousDatatype()
SSWAPDocument
createAnonymousDatatype
in interface SSWAPDocument
public SSWAPDocument getInferredTBox()
public SSWAPDocument getInferredABox()
public void setMaxClosureBytes(long maxClosureBytes)
SourceModel
setMaxClosureBytes
in interface SourceModel
maxClosureBytes
- the new model-specific byte limit for closure for this model, or -1 to restore the
system-wide limitpublic long getMaxClosureBytes()
public void setMaxClosureTime(long maxClosureTime)
SourceModel
setMaxClosureTime
in interface SourceModel
maxClosureTime
- the new model-specific time limit (in ms) for closure for this model, or -1 to restore the
system-wide limitpublic long getMaxClosureTime()
public void setMaxClosureThreads(int maxClosureThreads)
SourceModel
setMaxClosureThreads
in interface SourceModel
maxClosureThreads
- the new model-specific concurrent thread limit for closure for this model, or -1 to restore the
system-wide limitpublic long getMaxClosureThreads()
public boolean equals(java.lang.Object o)
equals
in class java.lang.Object
public int hashCode()
hashCode
in class java.lang.Object
protected void setClosureModel(com.hp.hpl.jena.rdf.model.Model clModel)
protected ModelResolver getModelResolver()
protected void resetReasoningService()
public <T extends SSWAPIndividual> T newIndividual(T sourceIndividual)
SSWAPDocument
sourceIndividual
(essentially clones the source individual).
This method is equivalent to
newIndividual(sourceIndividual,null)
;
newIndividual
in interface SSWAPDocument
T
- the type of the individualsourceIndividual
- the individual to be used as a source of data for populating
the new individual
SSWAPDocument.newIndividual(SSWAPIndividual, URI)
public <T extends SSWAPIndividual> T newIndividual(T sourceIndividual, java.net.URI copyURI)
SSWAPDocument
sourceIndividual
into the
individual whose URI is passed as targetURI
. If there is not
yet an individual with such a URI, it is created. If
targetURI
is null, an anonymous individual is created.
Notes:
sourceIndividual
is a deep copy;
i.e., if there are any object properties with anonymous
individuals as values, a deep copy is performed on those individuals
recursively. If there are any object properties with named individuals as
values, those named individual are not copied.SSWAPType
) and its properties (SSWAPProperty
).
In particular, associations with SSWAPNodes
are not copied
(e.g., if a SSWAPSubject
is being copied, the copy
will not contain references to SSWAPObjects
or
SSWAPGraphs
; if desired, these must be made explicitly).SSWAPDocument
to this method) --
a deep copy will be made across the documents, including named
individuals. The restriction specified in (2) still holds (i.e.,
references to SSWAPNodes
are not copied across documents).SSWAPNodes
(e.g., SSWAPResource
,
SSWAPSubject
, SSWAPObject
) are supported only
in SSWAPProtocol
documents (e.g., RDG
,
RIG
, RRG
, RQG
). An attempt to copy
them into a generic SSWAPDocument
(e.g., a document
containing a definition of SSWAPType
or
owl:Class
) throws an IllegalArgumentException
.
newIndividual
in interface SSWAPDocument
T
- the type of the individualsourceIndividual
- the individual with the data to be copiedcopyURI
- the URI of the new individual; may be null for an anonymous
individual
protected <T extends SSWAPIndividual> T createCopyObject(T sourceIndividual, java.net.URI copyURI)
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |