cayenne-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrus Adamchik <and...@objectstyle.org>
Subject Re: Modeler extensions point
Date Fri, 29 Sep 2006 20:14:35 GMT
> I remember those discussions, but I don't see real plugin engine
> availability as something that's going to happen in the near term.
> There's far too many other "important" things going on like JPA, outer
> joins, audit logging, and other fun things.


You are right. I am the only volunteer to do this work, and I have  
lots of other things on the plate.

> So I'm looking for a short-term maintainable solution.   If we're
> going to have real plugin support down the road, I think what I've
> proposed is probably good enough for the time being, and has minimal
> impact.

Oh well... I wanted to avoid extra bloat in the Modeler, but I don't  
want to hold you from adding your stuff either. Just don't go too  
wild with it, as it will complicate switching to the plugin engine in  
the future :-)

Andrus



On Sep 29, 2006, at 3:55 PM, Mike Kienenberger wrote:
> I remember those discussions, but I don't see real plugin engine
> availability as something that's going to happen in the near term.
> There's far too many other "important" things going on like JPA, outer
> joins, audit logging, and other fun things.
>
> So I'm looking for a short-term maintainable solution.   If we're
> going to have real plugin support down the road, I think what I've
> proposed is probably good enough for the time being, and has minimal
> impact.
>
> On 9/29/06, Andrus Adamchik <andrus@objectstyle.org> wrote:
>> Mike,
>>
>> we have this entire big thing in the queue for 3.0 - switching
>> CayenneModeler to a plugin engine. If you search the mailing list,
>> you'll find long heated discussions about it throughout the summer.
>>
>> So I suggest to avoid checking in any ad hoc plugin functionality
>> until the engine is in place. Or even better - let's get the plugin
>> engine going for real.
>>
>> Andrus
>>
>>
>> On Sep 29, 2006, at 3:34 PM, Mike Kienenberger wrote:
>>
>> > I needed to add a new feature to Cayenne Modeler yesterday.  The
>> > primary impact was the addition of a new menu item which called  
>> my own
>> > code.
>> >
>> > Today, I went through and tried to figure out a reasonable way of
>> > making such an extension built-in to Cayenne, so I don't have to
>> > maintain it with patches.
>> >
>> > I'm not completely happy with what I have come up with, primarily
>> > because it only supports one extension set, but this is what  
>> I've done
>> > so far.   I read a cayenneActionPluginFactory class from a system
>> > property (yes, the property needs to be fully-qualified) as a  
>> method
>> > on Application.  Application seemed easily accessible and no worse
>> > than anything else, but maybe a separate
>> > CayenneActionPluginFactoryManager would make more sense.
>> >
>> > If a plugin is found, I create a new Extensions top-level menu and
>> > stick the actions into it in CayenneModelerFrame.  In  
>> ActionManager's
>> > constructor, I register the actions, and add any to the  
>> DOMAIN_ACTIONS
>> > list that are domain actions (also should provide ways to do the  
>> same
>> > for project, datamap, objEntity, dbEntity, Special, etc.)
>> >
>> > That's the majority of the changes to support this.   What I'd  
>> ideally
>> > like to have happen is to figure out a way to support any number of
>> > CayenneActionPluginFactory objects, and have the registration
>> > automatic (maybe check each jar for a CayenneActionPluginFactory
>> > config file?), but I don't know if the second option is  
>> realistic.   I
>> > suppose the first option could be handled by making the system
>> > property a list of comma-separated classes rather than a single  
>> class.
>> >
>> >
>> >
>> > public interface CayenneActionPlugin {
>> >    public String getActionName();
>> >    public CayenneAction createCayenneAction(Application  
>> application);
>> >    public boolean isDomainAction();
>> > }
>> >
>> > public interface CayenneActionPluginFactory {
>> >    public List getCayenneActionPluginList();
>> > }
>> >
>> >    static CayenneActionPluginFactory cayenneActionPluginFactory =
>> > null;
>> >    public CayenneActionPluginFactory  
>> getCayenneActionPluginFactory()
>> >    {
>> >        // TODO: retrieve somehow and allow multiple factories.
>> >        if (null == cayenneActionPluginFactory)
>> >        {
>> >            String pluginName =
>> > System.getProperty("cayenneActionPluginFactory");
>> >            if (null != pluginName)
>> >            {
>> >                try {
>> >                    cayenneActionPluginFactory =
>> > (CayenneActionPluginFactory)Class.forName(pluginName).newInstance 
>> ();
>> >                }
>> >                catch (InstantiationException e) {
>> >                    logObj.error("InstantiationException error
>> > instantiating cayenneActionPluginFactory", e);
>> >                }
>> >                catch (IllegalAccessException e) {
>> >                    logObj.error("IllegalAccessException error
>> > instantiating cayenneActionPluginFactory", e);
>> >                }
>> >                catch (ClassNotFoundException e) {
>> >                    logObj.error("ClassNotFoundException error
>> > instantiating cayenneActionPluginFactory", e);
>> >                }
>> >            }
>> >        }
>> >        return cayenneActionPluginFactory;
>> >    }
>> >
>>
>>
>


Mime
View raw message