Francois,

:)

As for why it's required, it makes everything more flexible - and it's not
required at all. Just ignore it and it will do you no harm.

Pico is good (for somethings) but personally I much prefer Spring (that's a
large debate for another time - each to their own) :)

- XWorks IoC container requires interfaces on your actions.
- Pico requires a custom constructor and your own factories.
- Spring requires external references (in one way)

You can also use Spring exactly like Pico if you want (using constructors),
but I actually like the explicitly defined contracts that the external
references give you.

Basically treat an external reference as a chance for some code to resolve
references on the action (IoC is just one use for them) at a user defined
time (you can't do this with Pico - it's a constructor, it's done when the
object is constructed). With the ExternalReferenceInterceptor it's a part of
the interceptor chain, so I can govern when those references are resolved
(before Params? After Params? After Validation?) I have control.

Anyway - some thoughts - don't get fooled by the Pico folk, it's not the
be-all-and-end-all of IoC - it's just one solution. :)

M

On 12/12/03 6:15 PM, "Francois Beauregard" ([EMAIL PROTECTED])
penned the words:

> Why all of this external reference resolver thing gets into XWork?
> 
> Couldn't you just extend DefaultActionProxyFactory, DefaultActionInvocation
> and do whatever logic to integrate with the IoC container and/or use an
> interceptor?
> 
> Even XWorks own IoC container does not need this kind of modification to
> XWork.xml, it looks like it only needs an interceptor and stores its
> configuration in an xml file.
> 
> You can also have a look at PicoContainer's integration (in NanoContainer),
> it is neatly done.
> 
> Cheers,
> ___________________________
> François Beauregard, b.ing.
> Vice-président
> Recherche et développement
> Pyxis Technologies
> www.pyxis-tech.com
> 
> T : (450) 681-9094, poste 102
> F : (450) 681-5758
> [EMAIL PROTECTED]
> 
> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] Behalf Of
> Cameron Braid
> Sent: December 12, 2003 1:32 AM
> To: [EMAIL PROTECTED]
> Subject: Re: [OS-webwork] [OS-xwork] Spring IoC integration
> 
> 
> It looks like noone else is interested in discussing this.
> 
> I have refactored xwork so that the external refrence resolvers are
> defined as described below
> 
> <xwork>
>   <package name='test' extends='webwork-default'>
> 
>       <external-resolvers>
>           <external-resolver name="test"
> class="com.opensymphony.xwork.config.TestExternalReferenceResolver">
>               <param name='stringParam'>stringParamValue</param>
>           </external-resolver>
>           <external-resolver name="test2"
> class="com.opensymphony.xwork.config.Test2ExternalReferenceResolver"/>
>       </external-resolvers>
> 
>       <default-external-resolver-ref name='test'/>
> 
>       <action name="TestExternalRefResolver3"
> class="com.opensymphony.xwork.ExternalReferenceAction">
>           <external-ref required="true" name="Boo">myBoo</external-ref>
>           <interceptor-ref name="debugStack"/>
>           <interceptor-ref name="defaultStack"/>
>       </action>
> 
>       <!-- test where external-resolver-ref overrides the package's
> resolver -->
>       <action name="TestExternalRefResolver5"
> class="com.opensymphony.xwork.ExternalReferenceAction">
>           <external-ref name="foo"
> external-resolver-ref='test2'>myFoo</external-ref>
>           <interceptor-ref name="debugStack"/>
>           <interceptor-ref name="defaultStack"/>
>       </action>
> 
>   </package>
> </xwork>
> 
> I have updated the test cases to use this new structure, and added tests
> for the new features.
> 
> This has required that the ExternalReferenceResolver interface be
> changed a little bit, simplifying the implementation.
> 
> Previousally ExternalReferenceResolver.resolveReferences(..) had to
> resolve all external refrences for an action, where as now it just
> resolves a single refrence at a time.
> 
> public interface ExternalReferenceResolver {
>   public void resolveReferences(ActionInvocation invocation,
> ExternalReference reference) throws ReferenceResolverException;
> }
> 
>   This simplifies the implemetation of the resolver because it doesn't
> need to know about the ActionConfig at all, since ExternalReference
> contains the action property name, the external ref string and the
> required boolean.
> 
>   It is the responsiblity of the ExternalReferencesInterceptor to call
> the relevant resolver for each <external-ref> tag for the action.
> 
>   I can add a Jira task, and attach the patch if anyone is interested.
> 
>   I would prefer that this code gets added before the final release.
> 
> Cameron.
> 
> Cameron Braid wrote:
> 
>> Ross Mason wrote:
>> 
>>> 
>>> 
>>> Cameron Braid wrote:
>>> 
>>>> Ross Mason wrote:
>>>> 
>>>>> 
>>>>> 
>>>>> Cameron Braid wrote:
>>>>> 
>>>>>> I have downloaded and integrated this code though and the tests
>>>>>> run perfectly (after creating my my own ServletContextAware
>>>>>> interface and removing refrences to the confluence packages)
>>>>>> 
>>>>>> I really like the work that you have done. Though I think some
>>>>>> more work is required to be able to integrate into xwork/webwork
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> Cool!
>>>>> 
>>>>>> 
>>>>>> I can't see how the servlet context is set onto the
>>>>>> SpringServletContextReferenceResolver or the ApplicationContext is
>>>>>> set onto the SpringApplicationContextReferenceResolver (depending
>>>>>> on the one that is used)
>>>>>> 
>>>>>> you construct the ExternalReferenceResolver using this code, and
>>>>>> immediately add it to the package config.
>>>>>> 
>>>>>>                 Class erResolverClazz =
>>>>>> ClassLoaderUtil.loadClass(externalReferenceResolver,
>>>>>> ExternalReferenceResolver.class);
>>>>>>                 erResolver = (ExternalReferenceResolver)
>>>>>> erResolverClazz.newInstance();
>>>>>> 
>>>>>> I guess that the ServletContextAware interface could be added to
>>>>>> webwork, though the question remains - how is the
>>>>>> ServletContextAware.setServletContext(..) method going to get
>>>>>> called ?
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> We could use a ServletContextListener to set the contexts on our
>>>>> resolvers... Could we access the packageConfig from a listener?
>>>> 
>>>> 
>>>> 
>>>> 
>>>> Yeah I guess we could, though this starts to get ugly when each
>>>> different resolver needs its own listener that is bound to the
>>>> action config api.
>>> 
>>> 
>>> You only need one listener to set the Servlet context on all
>>> Resolvers that are ServletContextAware.  I'll attach the one I'm
>>> using to the issue.
>> 
>> 
>> Sounds like we need to get the DefaultComponentManager to bootstrap
>> the external refrence resolvers ;)
>> 
>> Actually... my point here was that each type of resolver... ie the
>> spring one, the XXXFramework one and any other framework integration
>> one will require someone to code a specific ConfigurerListener to set
>> any external resources that the resolver requires. I think that if
>> this can be done with simple parameter based configuration then it
>> will be a lot simpler.
>> 
>>>> 
>>>>>> 
>>>>>> I propost the following soloution :
>>>>>> 
>>>>>> 1 : have different SpringXXXReferenceResolver classes in xwork and
>>>>>> webwork like this :
>>>>>> 
>>>>>> xwork : Spring/ClassPathXmlApplicationContext/ReferenceResolver or
>>>>>> a Spring/FileSystemXmlApplicationContext/ReferenceResolver
>>>>>> webwork : Spring/WebApplicationContext/ReferenceResolver - using
>>>>>> 
> WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.get
> ServletContext())
>>>>>> to obtain the application context
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> I agree, we should have different implementations, separated like
>>>>> this.    In my test case I have provided a
>>>>> Spring/XmlFileApplicationContext, so we could just refactor that out.
>>>> 
>>>> 
>>>> 
>>>> 
>>>> Certainly can.
>>>> 
>>>>>> 
>>>>>> This works find for webwork based apps, though for xwork based
>>>>>> apps that the
>>>>>> SpringClassPathXmlApplicationContextReferenceResolver and
>>>>>> SpringFileSystemXmlApplicationContextReferenceResolver require
>>>>>> configuration to specify the filename.. therfore step two is
>>>>>> required :
>>>>>> 
>>>>>> 2 : allow for external refrence resolvers to be declards by name,
>>>>>> class and to be parameterizable like interceptors.  the refer to
>>>>>> the by name instead of className
>>>>>> 
>>>>>> e.g. :
>>>>>> 
>>>>>> <xwork>
>>>>>>     <package ... externalReferenceResolver="spring">
>>>>>>        ....
>>>>>>     <!-- NEW FEATURE : new node set -->
>>>>>>         <externalRefrenceResolvers>
>>>>>>            <externalRefrenceResolver name='spring'
>>>>>> class="SpringWebApplicationContextReferenceResolver"/>
>>>>>>            <externalRefrenceResolver name='springXmlFile'
>>>>>> class="SpringClassPathXmlApplicationContextReferenceResolver">
>>>>>>               <param name="filename">myApplicationContext.xml</param>
>>>>>>             </externalRefrenceResolver >
>>>>>>         </externalRefrenceResolvers>
>>>>>>        ....
>>>>>>        <action name='...' class='...'>
>>>>>> 
>>>>>>         <!-- NEW FEATURE : externalRefrenceResolver attribute -->
>>>>>>           <external-ref externalRefrenceResolver='springXmlFile'
>>>>>> name='foo'>myFoo</external-ref>
>>>>>>           <external-ref name='bar'>myBar</external-ref>
>>>>>>        </action>
>>>>>>     </package>
>>>>>> </xwork>
>>>>>> 
>>>>>> this allows for reusing the same configured  resolver in multiple
>>>>>> packages - which you can do now, though without configuration.
>>>>>> this allows for each external-ref tag to optionally use a
>>>>>> different resolver as in the example above
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> Ok that looks like it would work, I think we should declare
>>>>> resolvers the way you suggested. Though I don't think we need then
>>>>> externalReferenceResolver attrib on the external-ref element.  We
>>>>> can just assume all actions in a package use the same Resolver.  I
>>>>> think it's neater that way; You can still use different Containers
>>>>> on different packages to resolve your references and there would be
>>>>> a more logical grouping of package/container.
>>>>> 
>>>> I agree that is is not necessary to allow the resolver to be
>>>> overriden per external-ref though I think it could be a usefull
>>>> feature to have.  Say you are using a thirs party spring based
>>>> component  package - say for security - and you want each action's
>>>> securityManager property to be resolved from this context instead of
>>>> the package's one.
>>>> 
>>>> I guess that another way of specifying it would be to use
>>>> 
>>>>       <external-ref name='foo'>springXmlFile:myFoo</external-ref>
>>>> 
>>>> and to modify the interceptor to look for the : char.
>>>> 
>>>> just my 2c worth ;)
>>> 
>>> 
>>> See your point, I guess we need to throw the notation up for discussion.
>> 
>> 
>> I don't really mind the syntax for specifying which resolver to use.
>> 
>> SO there are two questions
>> 
>> 1. Do we need to be able to override the resolver on a per refrence basis
>> 2. If we can override, what is the syntax ?
>> 
>> Does anyone else have any thoughs or suggestions ?
>> 
>>>> 
>>>>>> I am sure that other frameworks will require some sort of runtime
>>>>>> configuration  for the external reference resolvers as well.
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> Any comments ?
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> yep!
>>>>> 
>>>>>> 
>>>>>> Cameron
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> Cheers,
>>>>> 
>>>>> ross
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> Thanks
>>>> 
>>>> Cameron
>>>> 
>>>>>> 
>>>>>> Ross Mason wrote:
>>>>>> 
>>>>>>> Cheers mate.
>>>>>>> 
>>>>>>> I've just attached the SpringExternalReferenceResolver
>>>>>>> implmentation and tests to the Jira Issue.
>>>>>>> 
>>>>>>> http://jira.opensymphony.com/secure/ViewIssue.jspa?key=XW-122
>>>>>>> 
>>>>>>> Ross
>>>>>>> 
>>>>>>> Patrick Lightbody wrote:
>>>>>>> 
>>>>>>>> This is good stuff -- not sure about a 1.0 release though. We'll
>>>>>>>> try to
>>>>>>>> get a point release out shortly after though to support this.
>>>>>>>> 
>>>>>>>> -----Original Message-----
>>>>>>>> From: [EMAIL PROTECTED]
>>>>>>>> [mailto:[EMAIL PROTECTED] On
>>>>>>>> Behalf Of
>>>>>>>> Ross Mason
>>>>>>>> Sent: Monday, November 17, 2003 8:02 PM
>>>>>>>> To: [EMAIL PROTECTED]
>>>>>>>> Subject: Re: [OS-webwork] [OS-xwork] Spring IoC integration
>>>>>>>> 
>>>>>>>> I'll fix the commons dependancies first :-)
>>>>>>>> 
>>>>>>>> Ross Mason wrote:
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> I've tried running the patch again (through Eclipse) and I get the
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> same
>>>>>>>> 
>>>>>>>>> problem - It only creates patch entries for new files?  I know
>>>>>>>>> this isn't a subject for this list, but does anyone know why
>>>>>>>>> this happens?
>>>>>>>>> 
>>>>>>>>> Anyway Cameron,  I'll create a zip of the changes for now and
>>>>>>>>> attach
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> it
>>>>>>>> 
>>>>>>>>> to the the issue and this list.
>>>>>>>>> 
>>>>>>>>> Cheers,
>>>>>>>>> 
>>>>>>>>> Ross
>>>>>>>>> 
>>>>>>>>> Cameron Braid wrote:
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>>> The patch seems to be missing code in the configuration
>>>>>>>>>> classes... since I have applied it, I am geting compilation
>>>>>>>>>> errors :
>>>>>>>>>> 
>>>>>>>>>> not defined :
>>>>>>>>>> 
>>>>>>>>>> invocation.getProxy().getConfig().getPackageName()
>>>>>>>>>> invocation.getProxy().getConfig().getExternalRefs();
>>>>>>>>>> packageConfig.getExternalRefResolver()
>>>>>>>>>> 
>>>>>>>>>> Thanks,
>>>>>>>>>> 
>>>>>>>>>> Cameron
>>>>>>>>>> 
>>>>>>>>>> Ross Mason wrote:
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>>> Hi,
>>>>>>>>>>> 
>>>>>>>>>>> As per the discussion late last week, we have a patch for
>>>>>>>>>>> Xwork so that it can use an external container to resolve
>>>>>>>>>>> component
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>>>> references.
>>>>>>>> 
>>>>>>>>>>> I've created the following issue -
>>>>>>>>>>> http://jira.opensymphony.com/secure/ViewIssue.jspa?key=XW-122
>>>>>>>>>>> 
>>>>>>>>>>> I've added a breakdown of the changes below, in summary, this
>>>>>>>>>>> is how
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>>>>> it works-
>>>>>>>>>>> 
>>>>>>>>>>> You can configure a action to have external references in the
>>>>>>>>>>> xwork.xml using a new <external-ref> tag on the action
>>>>>>>>>>> 
>>>>>>>>>>> When the action is configured the external refs are stored on
>>>>>>>>>>> the action config.
>>>>>>>>>>> 
>>>>>>>>>>> When the action is invoked, there is a new interceptor that
>>>>>>>>>>> will resolve these references.  It does this by using a new
>>>>>>>>>>> attribute on the package config called
>>>>>>>>>>> externalReferenceResolver i.e.
>>>>>>>>>>> 
>>>>>>>>>>> <package name="default"
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
> externalReferenceResolver="com.atlassian.xwork.ext.SpringServletContextR
>>>>>>>> 
>>>>>>>> eferenceResolver">
>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> In this case, the SpringServletContextReferenceResolver
>>>>>>>>>>> implementation will handle the work of looking up and setting
>>>>>>>>>>> the references on the action.
>>>>>>>>>>> Note, if a resolver is not found on the actions package, it
>>>>>>>>>>> will tranverse up the package heirarchy to find one.
>>>>>>>>>>> 
>>>>>>>>>>> We have an implementation for Spring, but I have not included
>>>>>>>>>>> it in this patch as it should probably go into an xwork-ext
>>>>>>>>>>> sub-project.  Let me know what you want me to do with this...
>>>>>>>>>>> 
>>>>>>>>>>> Here are the changes and additions to the xwork codebase -
>>>>>>>>>>> 
>>>>>>>>>>> 1. added 2 new config attributes -
>>>>>>>>>>> - a new element external-ref to the action element in the
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>>>> config.
>>>>>>>> 
>>>>>>>>>>> i.e <external-ref name="foo">Foo</external-ref>
>>>>>>>>>>> where name is the setter method name and Foo is the reference
>>>>>>>>>>> to lookup.
>>>>>>>>>>> - added an attribute to the package element called
>>>>>>>>>>> externalReferenceResolver which supplies a FQ classname to an
>>>>>>>>>>> ExternalReferenceResolver implementation.
>>>>>>>>>>> 
>>>>>>>>>>> 2. Updated the xwork DTD accordingly.
>>>>>>>>>>> 
>>>>>>>>>>> 3. Added 4 new classes -
>>>>>>>>>>> - External Reference - an encapsulation of the external-ref tag
>>>>>>>>>>> - ExternalReferenceResolver - an interface to provide
>>>>>>>>>>> implementations for resolving references from an external
>>>>>>>>>>> container
>>>>>>>>>>> - ExternalReferencesInterceptor - will resolve references on a
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>>>> given
>>>>>>>> 
>>>>>>>>>>> ActionInvocation
>>>>>>>>>>> - ReferenceResolverException - thrown by
>>>>>>>>>>> ExternalReferenceResolver
>>>>>>>>>>> 
>>>>>>>>>>> 4. Added support for external references to the ActionConfig.
>>>>>>>>>>> I also
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>>>>> added the attribute packageName to the ActionConfig, so that
>>>>>>>>>>> the Interceptor could determine which package the action
>>>>>>>>>>> belonged to in order to find the externalReferenceResolver.
>>>>>>>>>>> 
>>>>>>>>>>> 5. Added support for the externalReferenceResolver attribute
>>>>>>>>>>> to the PackageConfig.
>>>>>>>>>>> 
>>>>>>>>>>> 6. Added support for the extra configuration to the
>>>>>>>>>>> XMLConfigurationProvider and DefaultConfigurationProvider
>>>>>>>>>>> 
>>>>>>>>>>> 7. Added tests in the
>>>>>>>>>>> org.opensymphony.xwork.config.ExternalReferenceResolverTest
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> I've attached a cvs patch with all the changes.  I built the
>>>>>>>>>>> patch against the latest src.
>>>>>>>>>>> 
>>>>>>>>>>> Cheers,
>>>>>>>>>>> 
>>>>>>>>>>> Ross
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> -------------------------------------------------------
>>>>>>>>> This SF. Net email is sponsored by: GoToMyPC
>>>>>>>>> GoToMyPC is the fast, easy and secure way to access your
>>>>>>>>> computer from
>>>>>>>>> any Web browser or wireless device. Click here to Try it Free!
>>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
> https://www.gotomypc.com/tr/OSDN/AW/Q4_2003/t/g22lp?Target=mm/g22lp.tmpl
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> _______________________________________________
>>>>>>>>> Opensymphony-webwork mailing list
>>>>>>>>> [EMAIL PROTECTED]
>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork
>>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> -------------------------------------------------------
>>>>>>>> This SF. Net email is sponsored by: GoToMyPC
>>>>>>>> GoToMyPC is the fast, easy and secure way to access your
>>>>>>>> computer from
>>>>>>>> any Web browser or wireless device. Click here to Try it Free!
>>>>>>>> 
> https://www.gotomypc.com/tr/OSDN/AW/Q4_2003/t/g22lp?Target=mm/g22lp.tmpl
>>>>>>>> 
>>>>>>>> _______________________________________________
>>>>>>>> Opensymphony-webwork mailing list
>>>>>>>> [EMAIL PROTECTED]
>>>>>>>> https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork
>>>>>>>> 
>>>>>>>> 
>>>>>>>> -------------------------------------------------------
>>>>>>>> This SF. Net email is sponsored by: GoToMyPC
>>>>>>>> GoToMyPC is the fast, easy and secure way to access your
>>>>>>>> computer from
>>>>>>>> any Web browser or wireless device. Click here to Try it Free!
>>>>>>>> 
> https://www.gotomypc.com/tr/OSDN/AW/Q4_2003/t/g22lp?Target=mm/g22lp.tmpl
>>>>>>>> 
>>>>>>>> _______________________________________________
>>>>>>>> Opensymphony-webwork mailing list
>>>>>>>> [EMAIL PROTECTED]
>>>>>>>> https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork
>>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> -------------------------------------------------------
>>>>>>> This SF. Net email is sponsored by: GoToMyPC
>>>>>>> GoToMyPC is the fast, easy and secure way to access your computer
>>>>>>> from
>>>>>>> any Web browser or wireless device. Click here to Try it Free!
>>>>>>> 
> https://www.gotomypc.com/tr/OSDN/AW/Q4_2003/t/g22lp?Target=mm/g22lp.tmpl
>>>>>>> 
>>>>>>> _______________________________________________
>>>>>>> Opensymphony-webwork mailing list
>>>>>>> [EMAIL PROTECTED]
>>>>>>> https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork
>>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> --
>>>>>> Any damn fool can write code that a computer can understand...
>>>>>> The trick is to write code that humans can understand.
>>>>>> [Martin Fowler
>>>>>> http://www.martinfowler.com/distributedComputing/refactoring.pdf]
>>>>>> 
>>>>>> ------------------------------------------------------- This SF.
>>>>>> Net email is sponsored by: GoToMyPC GoToMyPC is the fast, easy and
>>>>>> secure way to access your computer from any Web browser or
>>>>>> wireless device. Click here to Try it Free!
>>>>>> 
> https://www.gotomypc.com/tr/OSDN/AW/Q4_2003/t/g22lp?Target=mm/g22lp.tmpl
>>>>>> _______________________________________________
>>>>>> Opensymphony-webwork mailing list
>>>>>> [EMAIL PROTECTED]
>>>>>> https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> -------------------------------------------------------
>>>>> This SF.net email is sponsored by: SF.net Giveback Program.
>>>>> Does SourceForge.net help you be more productive?  Does it
>>>>> help you create better code?  SHARE THE LOVE, and help us help
>>>>> YOU!  Click Here: http://sourceforge.net/donate/
>>>>> _______________________________________________
>>>>> Opensymphony-webwork mailing list
>>>>> [EMAIL PROTECTED]
>>>>> https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork
>>>>> 
>>>> 
>>>> 
>>> 
>>> 
>>> 
>>> -------------------------------------------------------
>>> This SF.net email is sponsored by: SF.net Giveback Program.
>>> Does SourceForge.net help you be more productive?  Does it
>>> help you create better code?  SHARE THE LOVE, and help us help
>>> YOU!  Click Here: http://sourceforge.net/donate/
>>> _______________________________________________
>>> Opensymphony-webwork mailing list
>>> [EMAIL PROTECTED]
>>> https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork
>>> 
>> 
>> 
> 
> 
> --
> Any damn fool can write code that a computer can understand...
> The trick is to write code that humans can understand.
> [Martin Fowler
> http://www.martinfowler.com/distributedComputing/refactoring.pdf]
> 
> 
> 
> 
> 
> -------------------------------------------------------
> This SF.net email is sponsored by: SF.net Giveback Program.
> Does SourceForge.net help you be more productive?  Does it
> help you create better code?  SHARE THE LOVE, and help us help
> YOU!  Click Here: http://sourceforge.net/donate/
> _______________________________________________
> Opensymphony-webwork mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork
> 
> 
> 
> -------------------------------------------------------
> This SF.net email is sponsored by: SF.net Giveback Program.
> Does SourceForge.net help you be more productive?  Does it
> help you create better code?  SHARE THE LOVE, and help us help
> YOU!  Click Here: http://sourceforge.net/donate/
> _______________________________________________
> Opensymphony-webwork mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork



-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive?  Does it
help you create better code?  SHARE THE LOVE, and help us help
YOU!  Click Here: http://sourceforge.net/donate/
_______________________________________________
Opensymphony-webwork mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork

Reply via email to