admin@glassfish.java.net

Re: how to document properties for _at_Configured items (PROPOSAL)

From: Kedar Mhaswade <Kedar.Mhaswade_at_Sun.COM>
Date: Mon, 20 Oct 2008 17:34:19 -0700

Property is more ubiquitous than SystemProperty.

AFAIK, SystemProperty exists at Domain, Cluster, Config and Server
alone. Do you think it makes any good having a separate Bag of
SystemProperties for these 4?

Thanks,
Kedar

Lloyd Chambers wrote:
> Jerome et al,
>
> One question that arises: since we have Property and PropertyBag, should
> there by SystemProperty (exists) and SystemPropertyBag (doesn't yet exist)?
>
> Lloyd
>
>
> On Oct 20, 2008, at 10:07 AM, Lloyd Chambers wrote:
>
>> Thanks Jerome. Comments inline.
>>
>> On Oct 17, 2008, at 9:58 PM, Jerome Dochez wrote:
>>
>>> I like it, some remarks :
>>>
>>> 1. why is the annotation placed at the class level, shouldn't the
>>> field List<Property> be annotated instead
>> Good idea. I can't think of any reason not to do this, except that it
>> could annotate the wrong method I suppose.
>>
>>>
>>> 2. doing field annotation would remove the need to
>>> SystemPropertiesDesc since you would just annotate List<Property>
>>> systemProperties
>> Yes, this is true. We would need to then make an explicit assumption
>> about the name of the method in order to find and distinguish the
>> annotations.
>>
>>>
>>> 3. for description(), I would encourage for some i18n where instead
>>> of an english description, we could reference a
>>> LocalString.properties element. This would allow us to generate
>>> localized @Configured documentation.
>> It's essentially javadoc-equivalent I was thinking, which is all
>> English at present. But if we think it's something we would expose
>> via the GUI (for example), then it could be I18N. Perhaps it can be
>> both, description() and descriptionKey().
>>
>>>
>>> 4. is this a pure documentation play or should we push runtime
>>> enforcement ?
>> I think at the very least that it would be very helpful to customers
>> to see warning messages in the log file if unknown properties were
>> added, for example a mis-spelled one. This is much better than
>> something mysteriously not working. The warning could emit a list of
>> all legal properties, which could be very helpful.
>>
>> And perhaps an enforce() flag could be added, so that a module
>> implementor could choose to enforce rejection of unknown properties.
>>
>>>
>>> 5. I would question the "required()" boolean, I think AFAIK, there
>>> are no required properties and if there are, maybe we should move
>>> them to real attribute or element.
>> OK, I wasn't sure on this. I think there might be one or two cases
>> that require a property, I forget which ones.
>>
>>
>>>
>>>
>>> Lloyd Chambers wrote:
>>>> Team,
>>>>
>>>> I just finished going through "Sun GlassFish Enterprise Server v3
>>>> Prelude Administration Reference". It took a lot of "eyeball work"
>>>> going through every page, and each and every interface--this is
>>>> error prone and hard to maintain.
>>>>
>>>> Many properties and system properties are documented in the
>>>> reference, yet none of them are documented in the @Configured
>>>> interfaces--at all. This stands in stark contrast to attributes and
>>>> elements, which are naturally javadoc'd.
>>>>
>>>> Several other issues come to mind for properties (eg <property> and
>>>> <system-property>):
>>>> - no formal mechanism to document the legal properties (except
>>>> free-form javadoc comments, none there as yet);
>>>> - impossible to validate property names or values;
>>>> - cannot warn the user if an unknown or mis-spelled property is
>>>> being used (eg "readerThreads" instead of "reader-threads");
>>>> - documentation for public API is not possible; there is nothing to
>>>> generate it from;
>>>> - no way for dependent interfaces (eg AMX) to validate or provide
>>>> metadata.
>>>>
>>>> --- PROPOSAL ---
>>>>
>>>> 1) Add annotations to describe the legal properties and system
>>>> properties;
>>>> 2) Add these annotations on all the @Configured interfaces which
>>>> have properties;
>>>> 3) Encourage developers to maintain the annotations.
>>>>
>>>> Below is an example of how this would work for @Configured
>>>> HttpListener. One alternative would be to define a "sidecar" class
>>>> that has "public static final String" variables for each property,
>>>> and annotate each of those individually.
>>>>
>>>> Note that because there cannot be more than one annotation of a
>>>> given type, a grouping annotation is used to allow annotations for
>>>> every property. See annotation classes further below.
>>>>
>>>> @PropertiesDesc({
>>>> @PropertyDesc(name="recycle-objects", defaultValue="true",
>>>> dataType=Boolean.class),
>>>> @PropertyDesc(name="reader-threads", defaultValue="0",
>>>> dataType=NonNegativeInteger.class),
>>>> @PropertyDesc(name="acceptor-queue-length", defaultValue="4096",
>>>> dataType=NonNegativeInteger.class),
>>>> @PropertyDesc(name="reader-queue-length", defaultValue="4096",
>>>> dataType=NonNegativeInteger.class),
>>>> @PropertyDesc(name="use-nio-direct-bytebuffer",
>>>> defaultValue="false", dataType=Boolean.class),
>>>> @PropertyDesc(name="authPassthroughEnabled", defaultValue="false",
>>>> dataType=Boolean.class),
>>>> @PropertyDesc(name="proxyHandler",
>>>> defaultValue="com.sun.enterprise.web.ProxyHandlerImpl"),
>>>> @PropertyDesc(name="proxiedProtocol", values={"ws/tcp", "http",
>>>> "https", "tls"}),
>>>> @PropertyDesc(name="bufferSize", defaultValue="4096",
>>>> dataType=NonNegativeInteger.class),
>>>> @PropertyDesc(name="connectionTimeout", defaultValue="30",
>>>> dataType=NonNegativeInteger.class),
>>>> @PropertyDesc(name="maxKeepAliveRequests", defaultValue="250",
>>>> dataType=NonNegativeInteger.class),
>>>> @PropertyDesc(name="traceEnabled", defaultValue="true",
>>>> dataType=Boolean.class),
>>>> @PropertyDesc(name="cometSupport", defaultValue="false",
>>>> dataType=Boolean.class),
>>>> @PropertyDesc(name="jkEnabled", defaultValue="false",
>>>> dataType=Boolean.class),
>>>> @PropertyDesc(name="compression", defaultValue="off",
>>>> values={"off","on","force"}),
>>>> @PropertyDesc(name="compressableMimeType",
>>>> defaultValue="text/html, text/xml, text/plain"),
>>>> @PropertyDesc(name="noCompressionUserAgents", defaultValue=""),
>>>> @PropertyDesc(name="compressionSize",
>>>> dataType=NonNegativeInteger.class),
>>>> @PropertyDesc(name="minCompressionSize",
>>>> dataType=NonNegativeInteger.class),
>>>> @PropertyDesc(name="crlFile"),
>>>> @PropertyDesc(name="trustAlgorithm", values="PKIX"),
>>>> @PropertyDesc(name="trustMaxCertLength", defaultValue="5",
>>>> dataType=Integer.class),
>>>> @PropertyDesc(name="disableUploadTimeout", defaultValue="true",
>>>> dataType=Boolean.class),
>>>> @PropertyDesc(name="connectionUploadTimeout", defaultValue="5",
>>>> dataType=NonNegativeInteger.class),
>>>> @PropertyDesc(name="uriEncoding", defaultValue="UTF-8",
>>>> values={"UTF-8"})
>>>> })
>>>>
>>>> @AMXConfigInfo(
>>>> amxInterfaceName="com.sun.appserv.management.config.HTTPListenerConfig")
>>>>
>>>> @Configured
>>>> public interface HttpListener extends ConfigBeanProxy, Injectable,
>>>> PropertyBag {
>>>>
>>>> ...
>>>> }
>>>>
>>>> ---
>>>>
>>>> /**
>>>> * Describes properties or system properties that might exist as
>>>> sub-elements.
>>>> */
>>>> @Retention(RUNTIME)
>>>> @Target({TYPE})
>>>> public @interface PropertyDesc {
>>>> /** name of the property */
>>>> String name();
>>>>
>>>> /** default value of the property */
>>>> String defaultValue() default "\u0000";
>>>>
>>>> /** freeform description */
>>>> String description() default "\u0000";
>>>>
>>>> /** Indicates that this property is required (rare) */
>>>> boolean required() default false;
>>>>
>>>> /** the DataType class, can be Class<? extends {_at_link DataType}>
>>>> or String.class */
>>>> Class dataType() default String.class;
>>>>
>>>> /** Possible values, might not be a complete list and/or there
>>>> could be other alternatives
>>>> such as specific numbers, variables, etc.
>>>> */
>>>> String[] values();
>>>> }
>>>>
>>>>
>>>> /**
>>>> * Annotation that holds an array of {_at_link PropertyDesc} for system
>>>> properties eg {_at_link SystemProperty}.
>>>> * Needed because it's not otherwise possible to have more than one
>>>> annotation of the same type.
>>>> */
>>>> @Retention(RUNTIME)
>>>> @Target({TYPE,METHOD})
>>>> public @interface SystemPropertiesDesc {
>>>> /** name of the property */
>>>> PropertyDesc[] value();
>>>> }
>>>>
>>>> /**
>>>> * Annotation that holds an array of {_at_link PropertyDesc} for
>>>> properties eg {_at_link Property}.
>>>> * Needed because it's not otherwise possible to have more than one
>>>> annotation of the same type.
>>>> */
>>>> @Retention(RUNTIME)
>>>> @Target({TYPE,METHOD})
>>>> public @interface PropertiesDesc {
>>>> /** name of the property */
>>>> PropertyDesc[] value();
>>>> }
>>>>
>>>>
>>>>
>>>>
>>>> ..............................................
>>>> Lloyd Chambers
>>>> lloyd.chambers_at_sun.com
>>>> GlassFish team, LSARC member
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: admin-unsubscribe_at_glassfish.dev.java.net
>>> For additional commands, e-mail: admin-help_at_glassfish.dev.java.net
>>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: admin-unsubscribe_at_glassfish.dev.java.net
>> For additional commands, e-mail: admin-help_at_glassfish.dev.java.net
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: admin-unsubscribe_at_glassfish.dev.java.net
> For additional commands, e-mail: admin-help_at_glassfish.dev.java.net
>