public class CompositeClassBasedMetaobjectProtocol extends java.lang.Object implements ClassBasedMetaobjectProtocol, java.io.Serializable
ClassBasedMetaobjectProtocol instances.
Every operation is dispatched first to the the first member that claims
authority over the class of the target object. If it returns a
non-authoritative answer the operation is also dispatched (where reasonable)
to the first member that claims authority over the class of the property id
object.BaseMetaobjectProtocol.Result| Constructor and Description |
|---|
CompositeClassBasedMetaobjectProtocol(ClassBasedMetaobjectProtocol[] members)
Creates a new composite class-based metaobject protocol from the
specified members.
|
| Modifier and Type | Method and Description |
|---|---|
java.lang.Object |
call(java.lang.Object callable,
CallProtocol callProtocol,
java.util.Map args)
Calls a callable object with named arguments.
|
java.lang.Object |
call(java.lang.Object callable,
CallProtocol callProtocol,
java.lang.Object... args)
Calls a callable object with positional arguments.
|
java.lang.Object |
call(java.lang.Object target,
java.lang.Object callableId,
CallProtocol callProtocol,
java.util.Map args)
Calls a method on the target object with supplied named arguments.
|
java.lang.Object |
call(java.lang.Object target,
java.lang.Object callableId,
CallProtocol callProtocol,
java.lang.Object... args)
Calls a method on the target object with supplied positional arguments.
|
BaseMetaobjectProtocol.Result |
delete(java.lang.Object target,
long propertyId)
Behaves as
BaseMetaobjectProtocol.delete(Object, Object) with an
integer property ID. |
BaseMetaobjectProtocol.Result |
delete(java.lang.Object target,
java.lang.Object propertyId)
Deletes an association of a value with a property in the target object.
|
java.lang.Object |
get(java.lang.Object target,
long propertyId)
Behaves as
CallProtocol.get(Object, Object) with an
integer property ID. |
java.lang.Object |
get(java.lang.Object target,
java.lang.Object propertyId)
Retrieves the property value from the target object.
|
java.lang.Boolean |
has(java.lang.Object target,
long propertyId)
Behaves as
BaseMetaobjectProtocol.has(Object, Object) with an
integer property ID. |
java.lang.Boolean |
has(java.lang.Object target,
java.lang.Object propertyId)
Tells whether the target object has a particular property.
|
boolean |
isAuthoritativeForClass(java.lang.Class clazz)
Returns whether this metaobject protocol has authority over objects of
the specified class.
|
static MetaobjectProtocol[] |
optimize(MetaobjectProtocol[] mops)
Optimizes a list of MOPs.
|
java.util.Iterator<java.util.Map.Entry> |
properties(java.lang.Object target)
Returns an iterator over the property ID-value pairs in the target
object this MOP knows about (and chooses to expose - not all properties
must be exposed; hidden properties are allowed).
|
java.util.Iterator<? extends java.lang.Object> |
propertyIds(java.lang.Object target)
Returns an iterator over the property IDs in the target object this MOP
knows about (and chooses to expose - not all properties must be exposed;
hidden properties are allowed).
|
BaseMetaobjectProtocol.Result |
put(java.lang.Object target,
long propertyId,
java.lang.Object value,
CallProtocol callProtocol)
Behaves as
BaseMetaobjectProtocol.put(Object, Object, Object,CallProtocol)
with an integer property ID. |
BaseMetaobjectProtocol.Result |
put(java.lang.Object target,
java.lang.Object propertyId,
java.lang.Object value,
CallProtocol callProtocol)
Associates a value with a property in the target object.
|
java.lang.Object |
representAs(java.lang.Object object,
java.lang.Class targetClass)
Returns a representation of the specified target object as an object of
the specified target class.
|
public CompositeClassBasedMetaobjectProtocol(ClassBasedMetaobjectProtocol[] members)
members - the member metaobject protocols.public static MetaobjectProtocol[] optimize(MetaobjectProtocol[] mops)
ClassBasedMetaobjectProtocol, they will be replaced
with a single instance of CompositeClassBasedMetaobjectProtocol
that contains them.mops - the list of MOPs to optimizepublic boolean isAuthoritativeForClass(java.lang.Class clazz)
ClassBasedMetaobjectProtocolBaseMetaobjectProtocol.Result.noAuthority for certain objects.
In that case - when used in CompositeClassBasedMetaobjectProtocol
- the other participating MOPs will also be given the chance to handle
the object after this MOP was given the chance first.isAuthoritativeForClass in interface ClassBasedMetaobjectProtocolclazz - the class of the handled objectpublic java.lang.Object call(java.lang.Object callable,
CallProtocol callProtocol,
java.util.Map args)
CallProtocolcall in interface CallProtocolcallable - the callable objectcallProtocol - a marshaller that should be used by this
metaobject protocol to convert the arguments to conform to expected
argument types for the call.args - the named arguments for the callable object. null must
be treated as empty map. Usually, the map keys are strings, but it is
possible that some protocols support non-string keys.BaseMetaobjectProtocol.Result.notCallable is returned if the protocol can
authoritatively decide that the target is not a callable, or is not
callable with named arguments. BaseMetaobjectProtocol.Result.doesNotExist is returned
if the callable does not exist at all. BaseMetaobjectProtocol.Result.noAuthority is
returned if the protocol can not authoritatively decide whether the
target is callable.public java.lang.Object call(java.lang.Object target,
java.lang.Object callableId,
CallProtocol callProtocol,
java.util.Map args)
MetaobjectProtocol
Object callable = get(target, callableId);
if(callable instanceof Result) {
return callable;
}
return call(callable, args);
call in interface MetaobjectProtocoltarget - the target objectcallableId - the ID of the method to callcallProtocol - a marshaller that should be used by this
metaobject protocol to convert the arguments to conform to expected
argument types for the call.args - the arguments of the callCallProtocol.get(Object, Object)
would return while looking up the callable. Can also return any return
value that CallProtocol.call(Object, CallProtocol, Map)
would return while calling.public java.lang.Object call(java.lang.Object target,
java.lang.Object callableId,
CallProtocol callProtocol,
java.lang.Object... args)
MetaobjectProtocol
Object callable = get(target, callableId);
if(callable instanceof Result) {
return callable;
}
return call(callable, args);
call in interface MetaobjectProtocoltarget - the target objectcallableId - the ID of the method to callcallProtocol - a marshaller that should be used by this
metaobject protocol to convert the arguments to conform to expected
argument types for the call.args - the arguments of the callCallProtocol.get(Object, Object)
would return while looking up the callable. Can also return any return
value that CallProtocol.call(Object, CallProtocol, Object[])
would return while calling.public java.lang.Object call(java.lang.Object callable,
CallProtocol callProtocol,
java.lang.Object... args)
CallProtocolcall in interface CallProtocolcallable - the callable objectcallProtocol - a marshaller that should be used by this
metaobject protocol to convert the arguments to conform to expected
argument types for the call.args - the positional arguments for the callable object. null must
be treated as empty array.BaseMetaobjectProtocol.Result.notCallable is returned if the protocol can
authoritatively decide that the target is not a callable, or is not
callable with positional arguments. BaseMetaobjectProtocol.Result.doesNotExist is
returned if the callable does not exist at all.
BaseMetaobjectProtocol.Result.noAuthority is returned if the protocol can not
authoritatively decide whether the target is callable.public BaseMetaobjectProtocol.Result delete(java.lang.Object target, long propertyId)
MetaobjectProtocolBaseMetaobjectProtocol.delete(Object, Object) with an
integer property ID.delete in interface MetaobjectProtocoltarget - the target objectpropertyId - the ID of the property.BaseMetaobjectProtocol.delete(Object, Object).public BaseMetaobjectProtocol.Result delete(java.lang.Object target, java.lang.Object propertyId)
BaseMetaobjectProtocoldelete in interface BaseMetaobjectProtocoltarget - the target objectpropertyId - the ID of the property. Usually a String or an
Integer, but other property ID types can also be supported.BaseMetaobjectProtocol.Result.doesNotExist. If the protocol authoritatively decides
that the property can not be deleted, it will return
BaseMetaobjectProtocol.Result.notDeleteable. If the protocol doesn't have the
authority to delete the property, it will leave the object unchanged,
and return BaseMetaobjectProtocol.Result.noAuthority. If the operation succeeds,
BaseMetaobjectProtocol.Result.ok is returned.public java.lang.Object get(java.lang.Object target,
long propertyId)
MetaobjectProtocolCallProtocol.get(Object, Object) with an
integer property ID.get in interface MetaobjectProtocoltarget - the target objectpropertyId - the ID of the property.CallProtocol.get(Object, Object).public java.lang.Object get(java.lang.Object target,
java.lang.Object propertyId)
CallProtocolget in interface CallProtocoltarget - the target objectpropertyId - the ID of the property. Usually a String or an
Integer, but other property ID types can also be supported.BaseMetaobjectProtocol.Result.doesNotExist. If the protocol decides that
the property exists, but is not readable, it will return
BaseMetaobjectProtocol.Result.notReadable. If the protocol can not make
an authoritative decision, it will return BaseMetaobjectProtocol.Result.noAuthority.public java.lang.Boolean has(java.lang.Object target,
long propertyId)
MetaobjectProtocolBaseMetaobjectProtocol.has(Object, Object) with an
integer property ID.has in interface MetaobjectProtocoltarget - the target objectpropertyId - the ID of the property.BaseMetaobjectProtocol.has(Object, Object).public java.lang.Boolean has(java.lang.Object target,
java.lang.Object propertyId)
BaseMetaobjectProtocolhas in interface BaseMetaobjectProtocoltarget - the target objectpropertyId - the ID of the property. Usually a String or an
Integer, but other property ID types can also be supported.Boolean.TRUE or Boolean.FALSE if the protocol
can authoritatively decide whether the target has or has not the
property, or null if it does not have the authority to decide.public java.util.Iterator<java.util.Map.Entry> properties(java.lang.Object target)
BaseMetaobjectProtocolproperties in interface BaseMetaobjectProtocoltarget - the target objectpublic java.util.Iterator<? extends java.lang.Object> propertyIds(java.lang.Object target)
MetaobjectProtocolpropertyIds in interface MetaobjectProtocoltarget - the target objectpublic BaseMetaobjectProtocol.Result put(java.lang.Object target, long propertyId, java.lang.Object value, CallProtocol callProtocol)
MetaobjectProtocolBaseMetaobjectProtocol.put(Object, Object, Object,CallProtocol)
with an integer property ID.
Associates a value with a property in the target object.put in interface MetaobjectProtocoltarget - the target objectpropertyId - the ID of the property. Usually a String or an
Integer, but other property ID types can also be supported.value - the new value for the propertycallProtocol - a marshaller that is used to convert the value in
case the property can only accept values of certain types, and the
metaobject protocol allows automatic coercing to those types.BaseMetaobjectProtocol.Result.doesNotExist. If the protocol can not set the new value,
it will return BaseMetaobjectProtocol.Result.notWritable. If the protocol
doesn't have the authority to put the new property value, it will leave
the object unchanged, and return BaseMetaobjectProtocol.Result.noAuthority. If the
operation succeeds, BaseMetaobjectProtocol.Result.ok is returned.public BaseMetaobjectProtocol.Result put(java.lang.Object target, java.lang.Object propertyId, java.lang.Object value, CallProtocol callProtocol)
BaseMetaobjectProtocolput in interface BaseMetaobjectProtocoltarget - the target objectpropertyId - the ID of the property. Usually a String or an
Integer, but other property ID types can also be supported.value - the new value for the propertycallProtocol - a marshaller that is used to convert the value in
case the property can only accept values of certain types, and the
metaobject protocol allows automatic coercing to those types.BaseMetaobjectProtocol.Result.doesNotExist. If the protocol
authoritatively decides that the property is read-only, it will return
BaseMetaobjectProtocol.Result.notWritable. If the property has a limitation on types
it can take as values, and the supplied marshaller is not able to
provide a suitable representation, then the value of the property is not
changed, and BaseMetaobjectProtocol.Result.noRepresentation is returned. Finally, if
the protocol doesn't have the authority to put the new property value,
it will leave the property value unchanged, and return
BaseMetaobjectProtocol.Result.noAuthority. If the operation succeeds,
BaseMetaobjectProtocol.Result.ok is returned.public java.lang.Object representAs(java.lang.Object object,
java.lang.Class targetClass)
CallProtocolrepresentAs in interface CallProtocolobject - the object to representtargetClass - the target class for representation.BaseMetaobjectProtocol.Result.noAuthority is returned if the
marshaller can not authoritatively decide on a representation;
BaseMetaobjectProtocol.Result.noRepresentation is returned if
the marshaller can authoritatively decide that the requested
representation is not possible. representation of null should be null,
except when the target class is a primitive type in which case
BaseMetaobjectProtocol.Result.noRepresentation should be
returned.