[jboss-dev-forums] [Design the new POJO MicroContainer] - New MetaType annotations and changes
adrian@jboss.org
do-not-reply at jboss.com
Fri Feb 22 05:06:03 EST 2008
While doing the ManagedObjects for the classloading metadata
I've added a few "features" to the MetaType handling.
1) ManagedObject should be inheritable
When you have a base class handling metadata for different use cases
and versions its a pain (and probably error prone) to have to add
@ManagementObject to every one.
So I've made the annotation inheritable.
e.g. all these will pick up that this is a managed object from the base class
@ManagementObject
com.acme.BaseMetaData
com.acme.BaseMetaDataV10 extends BaseMetaData
com.acme.BaseMetaDataV20 extends BaseMetaDataV10
com.acme.UseCase1MetaData extends BaseMetaData
com.acme.UseCase2MetaData extends BaseMetaData
2) Ignoring implementation details
I had a case where I wanted to ignore some properties
when creating CompositeMetaTypes/Values, which
you can now do with an annotation
public class MyClass
{
@CompositeValue(ignore=true)
public void setImplementationDetail();
}
3) Choosing the property type exposed for management
This is really a form of aliasing. Basically you have a generic property
but for management purposes you want to expose an explicit type.
e.g. My use case is:
// Too generic to be useful for management so ignore
@CompositeValue(ignore=true)
public void setVersion(Object version) {}
// This is how we want it exposed (it's really an alias of setVersion)
@CompositeValue(name="version")
public void setTheVersion(Version version) { setVersion(version); )
4) Mapping of types in metatype
I also didn't want to expose the Version as a CompositeType,
e.g. major=1, minor=0, micro=0, qualifier=GA
so like JAXB, I've allowed a mapper to specified using an annotation
e.g. this exposes the Version type as a String "1.0.0.GA"
| @MetaMapping(VersionMetaMapper.class)
| public class Version implements Serializable, Comparable<Version>
|
| public class VersionMetaMapper extends MetaMapper<Version>
| {
| public Type mapToType()
| {
| return String.class;
| }
|
| public MetaValue createMetaValue(MetaType<?> metaType, Version object)
| {
| return SimpleValueSupport.wrap(object.toString());
| }
|
| public Version unwrapMetaValue(MetaValue metaValue)
| {
| if (SimpleMetaType.STRING.equals(metaValue.getMetaType()) == false)
| throw new IllegalArgumentException("Not a string: " + metaValue);
|
| SimpleValue<?> simple = (SimpleValue<?>) metaValue;
| String value = (String) simple.getValue();
| return Version.parseVersion(value);
| }
|
The mapToType() is an "ease of use" thing. If you need a more complex type
you should override getMetaType() instead.
NOTE: This annotation is checked AFTER the MetaType/ValueBuilder
stuff. So if somebody installs a specific builder for a type
(e.g. using xml configuration), it will override this annotation.
5) Bug fix
Finally, I fixed a bug where the CompositeValue stuff had a couple places
iterating over the keySet() (only the id properties) instead of the itemSet()
(all properties). One of them wasn't really a bug, it was in the toString(), but it confused
me ;-)
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4131334#4131334
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4131334
More information about the jboss-dev-forums
mailing list