pivot-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "aappddeevv" <aappdde...@verizon.net>
Subject RE: [jira] Updated: (PIVOT-514)
Date Fri, 11 Jun 2010 16:26:27 GMT
Yes, this is very cool. My collection comment on this issue was purely what
interface is used to detect a call to add(). Declarative programming is an
important option for pivot clients and more importantly, has great tooling

Just thinking out loud...and typing fast...

Related to maps, probably one good user XML extension for the serializer and
that has a lot of uses cases is to specify a map as elements versus
attributes.  Also, through more annotation magic, the default key generator
can be specified. Many lookups occur using a class (name) as a lookup key or
the key is easily statically specified by the object or its static nature.
The "elements vs attributes" approach allows you to specify the object
instance inline because specifying an object class to be instantianted in an
attribute value is ambiguous unless you add more DSL (e.g. instead of a $
for a reference lookup, a % for an object creation).

This allows me to specify a bunch of objects without always having to use
attributes. The object can be defined and instantiated inline for the map
versus referenced elsewhere. There are 2-3 major use cases for this e.g.
automated menu population/configuration. And by establishing a very small
convention, allows a large number of declarative processing scenarios that
create new class behaviors without subclassing/coding. This is the true
power of the serializer/component as a container thinking and doesn't put
too much burden on the serializer (i.e. avoiding full DI-container semantics
which is a lot of work to create and is not needed here).

However, this is not compelling enough yet to suggest unless other pivot
elements (those 2-3 uses cases) are also enabled.

For example, as a small convention with support, if the serializer
automatically scans the user data and finds an object with an
interface/annotation called "Initializer", the interface is called. This
initialize can in turn scan the user data for a menu specification and
automatically add or substract a menu (also in the user data) from the main
menu when the component has focus (or whatever). By combining this with
Component's "name", I can specify the attach point as a menu URL. This is
Component-level services configured at the Component level and entirely
optional all without subclassing in my application---I just write services
that are reusable and use composition to create new behaviors. All of this
has minimal API impact (almost none) but does need a small amount of
pivot-library level support. Any Component can be a menu contributor.

If we add cross-tree hierarchical user data lookup (minimal API impact) and
object initialization lifecycle event signaling (some API impact), you have
ingredients to create significant defaulting and user data management
behaviors. This would help with additional application-level, declarative
thematic and stylizing defaulting. By using JSON for style specifications,
which I think is clever, combined with a defaulting system that is
cross-tree, you have a nice set of customization capabilities that reduces
the experience level needed to create great looking applications, avoids
coding (subclassing or using code to configure), enables easier tooling and
can employ declarative configuration for those that like it. Conceptually,
this is at the heart of managing the boundary between coding and
configuration in a *balanced* way.

So in this area (element map, small "initializer" interface, cross-tree user
data lookup, contract for object creation/initialization), plus a little
convention enables a lot of flexibility and to Dirk's point, doesn't box you
in. This is an unique, targeted fusion of WPF and eclipse e4 thinking that
could be possible in pivot. I don't know enough about Adobe and other
frameworks to say how they handle complexity and flexibility.

-----Original Message-----
From: Greg Brown [mailto:gkbrown@mac.com] 
Sent: Friday, June 11, 2010 9:14 AM
To: dev@pivot.apache.org
Subject: Re: [jira] Updated: (PIVOT-514)

I should add that WTKXSerializer *does* actually know about maps (or, more
specifically, dictionaries). If your class exposes a read-only dictionary
property (e.g. Component#getUserData()), WTKXSerializer will properly
populate the dictionary based on markup. For example:

  <userData foo="abc" bar="$def"/>

The serializer will effectively call getUserData().put("foo", "abc") and
getUserData().put("bar", def), where def is the value of the page-scoped
variable referred to by "def". This is what allows styles to be set using an
element vs. a JSON string, for example:

  <styles color="#ff0000"/>


<Label styles="{color:'#ff0000'}">

WTKXSerializer caters to sequences and dictionaries because those are the
structures employed by XML. An XML element is effectively both a sequence
(containing sub-elements and text nodes) and a dictionary (mapping string
attribute names to attribute values). Since sets aren't really used by XML,
there's no need for WTKXSerializer to try to support them.

To some extent, sets are something of an artificial construct. As I
mentioned in my previous email, they can be implemented via the Sequence
interface. They can also be implemented via the Dictionary interface, if
they keys are used as the set's values. In fact, this is how HashSet is
implemented internally. The two primary data structures in most applications
and frameworks are sequences (indexed access) and dictionaries (keyed

Hope this helps.


On Jun 11, 2010, at 8:57 AM, Greg Brown wrote:

> You can ensure that a Sequence implementation does not allow duplicate
entries. However, your collection class would also need to implement Set or
Group if you want to expose that API to a caller. WTKXSerializer does not
know anything about Sets (nor does it need to, since that is not a primary
use case for WTKX serialization).
> On Jun 11, 2010, at 8:49 AM, aappddeevv wrote:
>> Meant list and set not map.
>> -----Original Message-----
>> From: aappddeevv [mailto:aappddeevv@verizon.net] 
>> Sent: Friday, June 11, 2010 7:58 AM
>> To: dev@pivot.apache.org
>> Subject: RE: [jira] Updated: (PIVOT-514) create an annotation to specify
>> default "child" property of a component used by the serializer to attach
>> children objects
>> My thinking was that if a client defined a list or a map using standard
>> collection classes. If the recommendation is to always use pivot
>> classes in pivot code and sequence supports both map and list, that
>> fine.
>> -----Original Message-----
>> From: Greg Brown (JIRA) [mailto:jira@apache.org] 
>> Sent: Thursday, June 10, 2010 11:10 AM
>> To: dev@pivot.apache.org
>> Subject: [jira] Updated: (PIVOT-514) create an annotation to specify the
>> default "child" property of a component used by the serializer to attach
>> children objects
>>    [
>> in.system.issuetabpanels:all-tabpanel ]
>> Greg Brown updated PIVOT-514:
>> -----------------------------
>>   Attachment: PIVOT-514.patch
>>               DefaultProperty.java
>> OK, thanks for the updated patch. I think this can be done without the
>> for the utils class - see attached patch.
>> There was also an issue with the setOrAddDefaultPropertyContent() method
>> SerializerUtils - that method checked for instances of
>> where it should have been looking for
>> (nothing in Pivot implements java.util.Collection).
>> Overall, I like the change. It can significantly reduce the size/nesting
>> depth of a WTKX file. See the changes to tab_panes.wtkx in the patch for
>> example.
>>> create an annotation to specify the default "child" property of a
>> component used by the serializer to attach children objects
>> -------------------------------------------------
>>>               Key: PIVOT-514
>>>               URL: https://issues.apache.org/jira/browse/PIVOT-514
>>>           Project: Pivot
>>>        Issue Type: Improvement
>>>        Components: wtk
>>>          Reporter: Appddevvv
>>>          Priority: Minor
>>>           Fix For: 1.6
>>>       Attachments: DefaultProperty.java, defaultpropertypatch.zip,
>> defaultpropertypatch.zip, PIVOT-514.patch
>>> Add an annotation called @ContentProperty that specifies the default
>> property to attach children to in the serializer. I found that I was
>> mistakes when creating WTKX that this annotation and a default "child
>> attachment" approach could help. Benefits include:
>>> a) The client does not need to know which property to attach the
>> to. 
>>> b) To add objects to a collection the parent object does not need to
>> extend from sequence. The sequence can be contained in the object instead
>> implementing the interface. Containment can be another approach to
>> content into the parent objects versus inheritance.
>>> c) You can change some of the properties in the class where attachment
>> occurs and your WTKX files do not have to change.
>>> The default mechanism would be similar to what exists today. It's a
>> extension of it. The "attach child" search would be:
>>> a) If the content property is specified, use that property to add the
>> child to. If the content property is a collection, add it to the
>>> b) If the content property is not specified,
>>> b.1) If the parent object is a collection (this is how it is handled
>> today) then add it to the collection using the List.add(Object) method.
>>> b.2) Add it to the property specified in the XML. This is also how it is
>> handled today.
>>> I wrote this for a small modeled framework similar to pivot and could
>> up a couple of patches for this. This is very similar to how wpf handles
>> child content specifications in XML. Thoughts?
>> -- 
>> This message is automatically generated by JIRA.
>> -
>> You can reply to this email to add a comment to the issue online.

View raw message