That's right. That's propably the cleanest way and you can use it on each component.

The problem why I came up with the constructor aproach initially was that generally all the subcomponents are created and setup in the constructor. And it would than be IMO more wicket like if you can also inject the services directly in the constructor, witout breaking up the setup of the subcomponents between the constructor and some setters.

IMO this is a general problem with setter based DI and hierarchical structures.

Christian

On Mon, 7 Nov 2005 15:16:53 -0800, Igor Vaynberg <[EMAIL PROTECTED]> wrote:

but why not replace every references thats annotated as a bean with a proxy
that only initializes itself as opposed to the entire class? that way you
dont even need the doinjection() method in the class and its a lot safer.

I would even put this "decoration" into a separate factory so that the page stays a simple dumb pojo with some annotations on it.That way you can have a
factory that pulls dependencies out of spring, or out of our builtin
metadata system, or out of somewhere else.

code would look something like this:

MyPage page=SpringDecorator.decorate(new MyPage(a,b,c));

this would look like this:

SpringDecorator.decorate (Page page) {
for each field with SpringBean annotation in page
set value to a new SpringDepdencyProxy
end
return page;
}

and the SpringDependencyProxy would look like this:

transient targetobject;

if (targetobject is null) {
locate spring context and set targetobject to the lookup
}
forward call to targetobject;


this way the class need not be aware of the fact that its decorated with
proxies or implement anything special. the proxies get serialized and
deserialized normally.

-Igor


On 11/7/05, Christian Essl <[EMAIL PROTECTED]> wrote:

Unfortunately I think this does not work.

Actually cglib creates at runtime a subclass where you can override
methods and as with any java code you can not override final (or private) methods. So when a non overridable method is called on the proxy it is not
possible to delegate it and any state changes will only happen in the
proxy and not in the proxied (real) page. On the other hand if the proxied instance calls one of its methods they will only effect its state and not
the state of the proxy.

Because of this and because the cglib proxy as a subclass also carries
everything constructed in the cunstructor of the superclass I do not realy
like cglib proxies.

But why not make it something like this (pseudo code - not tested):

public class AbstractSpringAwarePage extends WebPage
{
public AbstractSpringAwarePage()
{
super();
doInjection();
}

private final void readObject(java.io.ObjectInputStream in) throws
IOException,
ClassNotFoundException
{
in.defaultReadObject();
//do for fields only now
Class cl = this.getClass();
while(cl != null && !AbstractSpringAwarePage.class.equals(cl)){
Field[] fields = cl.getDeclaredFields();
for(final Field field:fields){
//if field has spring annotation and it has a declaring class as
interface

//create a proxy
InvocationHandler iH = new InvocationHandler(){
private transient Object _target;
public Object invoke(Object proxy, Method method, Object[]
args) throws Throwable
{
if(_target == null){
doInjection();
_target = field.get(AbstractSpringAwarePage.this);
}
return method.invoke(_target, args);
}
};
Class proxyClass = field.getDeclaringClass();
Object serviceProxy = Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
new Class[]{proxyClass}, iH);
///////////////
//assign serviceProxy to field
}
cl = cl.getSuperclass();
}
}

/**
* Override to load and assign custom beans. WARNING IS CALLED FROM THE
CONSTRUCTOR
* DO NOT DEPEND ON STATE SET IN THE CONSTRUCTOR. DO NOT CALL METHODS
WHICH DEPEND
* ON INSTANCE STATE. DO NOT LET LEAK A REFERNCE TO THIS INSTANCE OUT.
*/
protected void doInjection()
{
// Default implementation as Igor has.
}
}


Sure this is not DI. It also does not provide AOP, livecylcle-management
etc as a container does. It is also not elegant with the constructor
calling the doInjection() method and it's magic.

However it is sugar for lookup. ie:

class MyPage(){
@SpringBean("customerdao")
protected CustomerDAO _customerDao; //no getter/setter

public void someWhere(){
_mydao.getCustomer("id");
}
}

during testing:

MyPage page = new MyPage(){
protected void doInjection(){
_customerDao = new MockDAO();
}
};

And you have the service ready in the constructor in case you want to give
it further to a component you construct in the constructor.



On Mon, 7 Nov 2005 12:27:12 -0800, Igor Vaynberg <[EMAIL PROTECTED]>
wrote:

> yes. but instead of doing the injection right away the proxy would do
> injection-on-first-access.
> that way you get lazy injection and strongly typed pages.
>
> so you would annotate getter functions with the @SpringBean annot, and
> the
> proxy would first call the getter ... if the getter returns null the
> proxy
> would then look for the setter and invoke the setter with the
dependency,
> and then forward the call to the getter again.
>
> sound like a good idea?
>
> its not as elegant as being able to simply create the page and go, but
it
> does give us the benefit of lazy dependency lookups and solves
> deserialization issues.
>
> i guess of course if you want to use aop you can intercept new operator
> on a
> subclass of WebPage and do the wrapping automatically.
>
> Or make the constructors of the page protected and create public static
> factory methods. MyPage page=MyPage.construct(user, securitycontext);
>
> -Igor
>
>
> On 11/7/05, Christian Essl <[EMAIL PROTECTED]> wrote:
>>
>> Do you mean when you construct the page you do something like
>>
>> MyPage page = (MyPage) wrapInProxy(new MyPage(..));
>>
>> and wrapInProxy does create the Proxy and does all the injection?
>>
>>
>> On Mon, 7 Nov 2005 11:56:23 -0800, Igor Vaynberg
>> <[EMAIL PROTECTED]>
>> wrote:
>>
>> > yeah, i was thinking cglib and extract at runtime
>> > never used cglib before though
>> >
>> > that way you just wrap the page with the proxy after you create it
and
>> > there
>> > is no need to worry about serialization/deserialiation garbage
>> >
>> > -Igor
>> >
>> >
>> > On 11/7/05, Christian Essl <[EMAIL PROTECTED]> wrote:
>> >>
>> >> The interface of the setter parameter or of the field type. Of
>> course a
>> >> restriction. If you want more you could use cglib (or spring aop).
>> Don't
>> >> know.
>> >>
>> >>
>> >>
>> >> On Mon, 7 Nov 2005 11:27:28 -0800, Igor Vaynberg
>> >> <[EMAIL PROTECTED]>
>> >> wrote:
>> >>
>> >> > what interface would you use for the proxy though?
>> >> > -Igor
>> >> >
>> >> >
>> >> > On 11/7/05, Christian Essl <[EMAIL PROTECTED]> wrote:
>> >> >>
>> >> >> Thanks for the clarification and sorry for the confusion. So
>> >> >> readObject()
>> >> >> as you have it in your code is fine.
>> >> >>
>> >> >> > To get the bean context i simply make my applicationbean
>> implement
>> >> >> > applicationcontextaware and then i use
>> >> >> > ((MyApplication)Application.get()).getBeanContext() static
>> lookup
>> >> >> which
>> >> >> > works because application object is always present.
>> >> >>
>> >> >> Still one question. The threadlocal used in Application.get() is
>> set
>> >> at
>> >> >> the beginning of a request - on the request thread. I do not know
>> but
>> >> >> maybe the deserialization of the session could happen outside of
a
>> >> >> request
>> >> >> - even in a totally different thread?
>> >> >>
>> >> >> Maybe in readObject() a dynamic proxy could be injected which
>> >> triggers
>> >> >> on
>> >> >> first access the onInject() method.
>> >> >>
>> >> >> Christian
>> >> >>
>> >> >> >
>> >> >> > -Igor
>> >> >> >
>> >> >> >
>> >> >> > On 11/7/05, Christian Essl <[EMAIL PROTECTED]> wrote:
>> >> >> >>
>> >> >> >> On Mon, 7 Nov 2005 15:25:29 +0100, Johan Compagner
>> >> >> >> <[EMAIL PROTECTED]>
>> >> >> >> wrote:
>> >> >> >>
>> >> >> >> > And there is also a thing like XML Serialization
>> >> >> >> > Which also doesn't use the java read/write object at all.
>> >> >> >> >
>> >> >> >>
>> >> >> >> Does this mean that the readObject is guaranteed to be called
>> on
>> >> Page
>> >> >> >> because it is serialized through the PageMap and is not a
>> direct
>> >> >> session
>> >> >> >> attribute?
>> >> >> >>
>> >> >> >> I don't get realy clear with 'Serializable closure' in the
>> spec:
>> >> >> >>
>> >> >> >> "Developers are not guaranteed that containers will call
>> >> readObject
>> >> >> and
>> >> >> >> writeObject methods on
>> >> >> >> session attributes if they implement them, but are guaranteed
>> that
>> >> >> the
>> >> >> >> Serializable closure of their attributes will be preserved."
>> >> >> >>
>> >> >> >> And if readObject() gets called on Pages can I than acess
>> somehow
>> >> the
>> >> >> >> ApplicationContext to get to the BeanContext?
>> >> >> >>
>> >> >> >> Please help.
>> >> >> >>
>> >> >> >> Thanks,
>> >> >> >> Christian
>> >> >> >>
>> >> >> >> >
>> >> >> >> > On 11/7/05, Christian Essl <[EMAIL PROTECTED]> wrote:
>> >> >> >> >>
>> >> >> >> >> Hi Igor,
>> >> >> >> >>
>> >> >> >> >> I looked through your code. Thanks for implementing it. I
am
>> >> not
>> >> >> sure
>> >> >> >> >> wheter readObject() is the right place to do the
>> (re)injection.
>> >> >> >> >> According
>> >> >> >> >> to the servlet-spec in SVR 7.7.2 readObject() is not
>> guaranteed
>> >> to
>> >> >> be
>> >> >> >> >> called on session-attributes. (Instead session attributes
>> which
>> >> >> >> >> implement
>> >> >> >> >> HttpSessionActiviationListeners are informed on
>> >> deserialization).
>> >> >> >> Even
>> >> >> >> >> if
>> >> >> >> >> readObject is called I am not sure wheter there is an
>> >> >> >> ApplicationContext
>> >> >> >> >> to get to the BeanContext.
>> >> >> >> >>
>> >> >> >> >> I don't know wheter wicket has a mean to propogate these
>> >> >> >> >> HttpSessionEvents
>> >> >> >> >> on deserialization or a similar callback? If so I guess you
>> >> could
>> >> >> do
>> >> >> >> the
>> >> >> >> >> (re)injection there.
>> >> >> >> >>
>> >> >> >> >> Christian
>> >> >> >> >>
>> >> >> >> >> On Mon, 7 Nov 2005 01:13:31 -0800, Igor Vaynberg
>> >> >> >> >> <[EMAIL PROTECTED]>
>> >> >> >> >> wrote:
>> >> >> >> >>
>> >> >> >> >> > here is something i threw together that solves the
>> >> >> deserialization
>> >> >> >> and
>> >> >> >> >> > ability to use the new operator to create pages. atleast
i
>> >> think
>> >> >> it
>> >> >> >> >> > does....its really late here and all i really know so far
>> is
>> >> >> that
>> >> >> >> it
>> >> >> >> >> > compiles :)
>> >> >> >> >> >
>> >> >> >> >> > the idea is pretty simple, do the injection in the
default
>> >> >> >> >> constructor,
>> >> >> >> >> > and
>> >> >> >> >> > then do it anytime the object is deserialized. you use a
>> >> >> >> @SpringBean
>> >> >> >> >> > annotation to denote the dependency. it can either be
used
>> >> on a
>> >> >> >> field
>> >> >> >> >> or
>> >> >> >> >> > on
>> >> >> >> >> > a setter. If you specify the bean name it will be used to
>> >> find
>> >> >> the
>> >> >> >> >> bean,
>> >> >> >> >> > if
>> >> >> >> >> > you dont then the field's type or the setters argument
>> type
>> >> will
>> >> >> be
>> >> >> >> >> used
>> >> >> >> >> > for
>> >> >> >> >> > the lookup.
>> >> >> >> >> >
>> >> >> >> >> > -Igor
>> >> >> >> >> >
>> >> >> >> >> >
>> >> >> >> >> > On 11/7/05, Igor Vaynberg <[EMAIL PROTECTED]>
wrote:
>> >> >> >> >> >>
>> >> >> >> >> >> and you have to have the pages defined as beans in the
>> >> >> application
>> >> >> >> >> >> context? with their properties specified?
>> >> >> >> >> >>
>> >> >> >> >> >> -Igor
>> >> >> >> >> >>
>> >> >> >> >> >>
>> >> >> >> >> >> On 11/7/05, Igor Vaynberg <[EMAIL PROTECTED]>
>> wrote:
>> >> >> >> >> >> >
>> >> >> >> >> >> > but how does the above handle deserealization of
pages?
>> >> there
>> >> >> is
>> >> >> >> >> >> nothing
>> >> >> >> >> >> > to reinject the dependencies.
>> >> >> >> >> >> >
>> >> >> >> >> >> > -Igor
>> >> >> >> >> >> >
>> >> >> >> >> >> >
>> >> >> >> >> >> > On 11/7/05, [EMAIL PROTECTED] < [EMAIL PROTECTED]> wrote:
>> >> >> >> >> >> > >
>> >> >> >> >> >> > > IMHO pages are standing on the borderline between a
>> >> >> stateful
>> >> >> >> GUI
>> >> >> >> >> and
>> >> >> >> >> >> > > the rest of the application in form of stateless
>> >> services.
>> >> >> >> >> >> > > DI should be done by the IoC container, creating the
>> >> pages
>> >> >> can
>> >> >> >> >> >> better
>> >> >> >> >> >> > > be done the standard Wicket way (e.g. with
>> >> PageParameters).
>> >> >> >> >> >> > >
>> >> >> >> >> >> > > As described before I'm using a custom page factory
>> that
>> >> >> >> >> cooperates
>> >> >> >> >> >> > > with a wrapped page factory and the containing bean
>> >> >> factory:
>> >> >> >> >> >> > >
>> >> >> >> >> >> > > public class SpringInjectingPageFactory implements
>> >> >> >> IPageFactory,
>> >> >> >> >> >> > > BeanFactoryAware {
>> >> >> >> >> >> > >
>> >> >> >> >> >> > > private AutowireCapableBeanFactory beanFactory;
>> >> >> >> >> >> > > private IPageFactory pageFactory;
>> >> >> >> >> >> > >
>> >> >> >> >> >> > > public void setPageFactory(IPageFactory pageFactory)
>> {
>> >> >> >> >> >> > > this.pageFactory = pageFactory;
>> >> >> >> >> >> > > }
>> >> >> >> >> >> > >
>> >> >> >> >> >> > > public void setBeanFactory(BeanFactory beanFactory)
>> >> throws
>> >> >> >> >> >> > > BeansException {
>> >> >> >> >> >> > > this.beanFactory =
>> >> (AutowireCapableBeanFactory)beanFactory;
>> >> >> >> >> >> > > }
>> >> >> >> >> >> > >
>> >> >> >> >> >> > > public Page newPage(Class pageClass) {
>> >> >> >> >> >> > > Page page = this.pageFactory.newPage(pageClass);
>> >> >> >> >> >> > >
>> >> >> >> >> >> > > injectDependencies(page, pageClass.getName ());
>> >> >> >> >> >> > >
>> >> >> >> >> >> > > return page;
>> >> >> >> >> >> > > }
>> >> >> >> >> >> > >
>> >> >> >> >> >> > > public Page newPage(Class pageClass, PageParameters
>> >> >> >> parameters)
>> >> >> >> {
>> >> >> >> >> >> > > Page page = this.pageFactory.newPage(pageClass,
>> >> >> parameters);
>> >> >> >> >> >> > >
>> >> >> >> >> >> > > injectDependencies(page, pageClass.getName ());
>> >> >> >> >> >> > >
>> >> >> >> >> >> > > return page;
>> >> >> >> >> >> > > }
>> >> >> >> >> >> > >
>> >> >> >> >> >> > > private void injectDependencies(Page page, String
>> >> >> beanName) {
>> >> >> >> >> >> > > if (this.beanFactory.containsBean(beanName)) {
>> >> >> >> >> >> > > this.beanFactory.applyBeanPropertyValues(page,
>> >> beanName);
>> >> >> >> >> >> > > }
>> >> >> >> >> >> > > }
>> >> >> >> >> >> > > }
>> >> >> >> >> >> > >
>> >> >> >> >> >> > > Note that if you don't specify a name or id
attribute
>> >> for
>> >> >> >> beans,
>> >> >> >> >> >> they
>> >> >> >> >> >> > > will be registered under their classname in Spring.
>> >> >> >> >> >> > > And NO, I don't use autowiring:
>> >> applyBeanPropertyValues()
>> >> >> does
>> >> >> >> >> not
>> >> >> >> >> >> > > autowire although it is located in
>> >> >> AutowireCapableBeanFactory.
>> >> >> >> >> >> > >
>> >> >> >> >> >> > > Sven
>> >> >> >> >> >> > >
>> >> >> >> >> >> > > >you are right, this is not ioc. but are
>> >> pages/components
>> >> >> >> managed
>> >> >> >> >> by
>> >> >> >> >> >> > > an ioc
>> >> >> >> >> >> > > >container?
>> >> >> >> >> >> > > >-Igor
>> >> >> >> >> >> > > >
>> >> >> >> >> >> > > >
>> >> >> >> >> >> > > >On 11/6/05, Alexandru Popescu <
>> >> >> >> >> >> [EMAIL PROTECTED]>
>> >> >> >> >> >> > > wrote:
>> >> >> >> >> >> > > >>
>> >> >> >> >> >> > > >> #: Igor Vaynberg changed the world a bit at a
time
>> by
>> >> >> >> saying
>> >> >> >> >> on
>> >> >> >> >> >> > > 11/6/2005
>> >> >> >> >> >> > > >> 7:06 PM :#
>> >> >> >> >> >> > > >> > Or how about a simple solution:
>> >> >> >> >> >> > > >> >
>> >> >> >> >> >> > > >> > public MyApplication extends WebApplication {
>> >> >> >> >> >> > > >> > public Object lookup(String name) {
>> >> >> >> >> >> > > >> > Object=...do a lookup from somewhere like
spring
>> >> >> context
>> >> >> >> or
>> >> >> >> >> app
>> >> >> >> >> >> > > >> object...;
>> >> >> >> >> >> > > >> > return object;
>> >> >> >> >> >> > > >> > }
>> >> >> >> >> >> > > >> > }
>> >> >> >> >> >> > > >> >
>> >> >> >> >> >> > > >> > public MyPage extends Page {
>> >> >> >> >> >> > > >> > public transient SomeService service;
>> >> >> >> >> >> > > >> >
>> >> >> >> >> >> > > >> > public SomeService getService() {
>> >> >> >> >> >> > > >> > if (service==null) {
>> >> >> >> >> >> > > >> >
>> >> >> >> >>
>> service=getApplication().lookup(SomeService.class.getName());
>> >> >> >> >> >> > > >> > }
>> >> >> >> >> >> > > >> > return service;
>> >> >> >> >> >> > > >> > }
>> >> >> >> >> >> > > >> >
>> >> >> >> >> >> > > >> > I know its not quiete as elegant as ioc but it
>> has
>> >> >> none
>> >> >> >> of
>> >> >> >> >> the
>> >> >> >> >> >> > > >> performance
>> >> >> >> >> >> > > >> > hits an automatic injection would cause if it
>> would
>> >> be
>> >> >> >> done
>> >> >> >> >> on
>> >> >> >> >> >> > > >> > deserialization of every component. Also its a
>> lazy
>> >> >> >> lookup
>> >> >> >> >> so
>> >> >> >> >> >> you
>> >> >> >> >> >> > > dont
>> >> >> >> >> >> > > >> do it
>> >> >> >> >> >> > > >> > until its needed, and its only done once per
>> page
>> >> >> (until
>> >> >> >> it
>> >> >> >> >> >> gets
>> >> >> >> >> >> > > >> > deserialized).
>> >> >> >> >> >> > > >> >
>> >> >> >> >> >> > > >> > -Igor
>> >> >> >> >> >> > > >> >
>> >> >> >> >> >> > > >>
>> >> >> >> >> >> > > >> But this was exactly what I was suggesting to
>> avoid
>> >> ;-).
>> >> >> >> >> Lookups
>> >> >> >> >> >> > > and
>> >> >> >> >> >> > > >> factories are not ioc/di.
>> >> >> >> >> >> > > >>
>> >> >> >> >> >> > > >> ./alex
>> >> >> >> >> >> > > >> --
>> >> >> >> >> >> > > >> .w( the_mindstorm )p.
>> >> >> >> >> >> > > >>
>> >> >> >> >> >> > > >>
>> >> >> >> >> >> > > >>
>> >> >> >> >> >> > > >>
>> >> -------------------------------------------------------
>> >> >> >> >> >> > > >> SF.Net email is sponsored by:
>> >> >> >> >> >> > > >> Tame your development challenges with Apache's
>> >> Geronimo
>> >> >> App
>> >> >> >> >> >> Server.
>> >> >> >> >> >> > > >> Download
>> >> >> >> >> >> > > >> it for free - -and be entered to win a 42" plasma
>> tv
>> >> or
>> >> >> >> your
>> >> >> >> >> very
>> >> >> >> >> >> > > own
>> >> >> >> >> >> > > >> Sony(tm)PSP. Click here to play:
>> >> >> >> >> >> > > http://sourceforge.net/geronimo.php
>> >> >> >> >> >> > > >> _______________________________________________
>> >> >> >> >> >> > > >> Wicket-user mailing list
>> >> >> >> >> >> > > >> Wicket-user@lists.sourceforge.net
>> >> >> >> >> >> > > >>
>> >> https://lists.sourceforge.net/lists/listinfo/wicket-user
>> >> >> >> >> >> > > >>
>> >> >> >> >> >> > >
>> >> >> >> >> >> > >
>> >> >> >> >> >> > >
>> -------------------------------------------------------
>> >> >> >> >> >> > > SF.Net email is sponsored by:
>> >> >> >> >> >> > > Tame your development challenges with Apache's
>> Geronimo
>> >> App
>> >> >> >> >> Server.
>> >> >> >> >> >> > > Download
>> >> >> >> >> >> > > it for free - -and be entered to win a 42" plasma tv
>> or
>> >> >> your
>> >> >> >> very
>> >> >> >> >> >> own
>> >> >> >> >> >> > > Sony(tm)PSP. Click here to play:
>> >> >> >> >> http://sourceforge.net/geronimo.php
>> >> >> >> >> >> > > _______________________________________________
>> >> >> >> >> >> > > Wicket-user mailing list
>> >> >> >> >> >> > > Wicket-user@lists.sourceforge.net
>> >> >> >> >> >> > >
>> https://lists.sourceforge.net/lists/listinfo/wicket-user
>> >> >> >> >> >> > >
>> >> >> >> >> >> >
>> >> >> >> >> >> >
>> >> >> >> >> >>
>> >> >> >> >>
>> >> >> >> >>
>> >> >> >> >>
>> >> >> >> >> --
>> >> >> >> >> Christian Essl
>> >> >> >> >>
>> >> >> >> >>
>> >> >> >> >>
>> >> >> >> >>
>> >> >> >> >>
>> >> >> >> >> ___________________________________________________________ >> >> >> >> >> Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos
>> -
>> >> Hier
>> >> >> >> >> anmelden: http://mail.yahoo.de
>> >> >> >> >>
>> >> >> >> >>
>> >> >> >> >>
>> >> >> >> >> -------------------------------------------------------
>> >> >> >> >> SF.Net email is sponsored by:
>> >> >> >> >> Tame your development challenges with Apache's Geronimo App
>> >> >> Server.
>> >> >> >> >> Download
>> >> >> >> >> it for free - -and be entered to win a 42" plasma tv or
your
>> >> very
>> >> >> own
>> >> >> >> >> Sony(tm)PSP. Click here to play:
>> >> >> http://sourceforge.net/geronimo.php
>> >> >> >> >> _______________________________________________
>> >> >> >> >> Wicket-user mailing list
>> >> >> >> >> Wicket-user@lists.sourceforge.net
>> >> >> >> >> https://lists.sourceforge.net/lists/listinfo/wicket-user
>> >> >> >> >>
>> >> >> >>
>> >> >> >>
>> >> >> >>
>> >> >> >> --
>> >> >> >> Christian Essl
>> >> >> >>
>> >> >> >>
>> >> >> >>
>> >> >> >>
>> >> >> >>
>> >> >> >> ___________________________________________________________
>> >> >> >> Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos -
>> Hier
>> >> >> >> anmelden: http://mail.yahoo.de
>> >> >> >>
>> >> >> >>
>> >> >> >>
>> >> >> >> -------------------------------------------------------
>> >> >> >> SF.Net email is sponsored by:
>> >> >> >> Tame your development challenges with Apache's Geronimo App
>> >> Server.
>> >> >> >> Download
>> >> >> >> it for free - -and be entered to win a 42" plasma tv or your
>> very
>> >> own
>> >> >> >> Sony(tm)PSP. Click here to play:
>> >> http://sourceforge.net/geronimo.php
>> >> >> >> _______________________________________________
>> >> >> >> Wicket-user mailing list
>> >> >> >> Wicket-user@lists.sourceforge.net
>> >> >> >> https://lists.sourceforge.net/lists/listinfo/wicket-user
>> >> >> >>
>> >> >>
>> >> >>
>> >> >>
>> >> >> --
>> >> >> Christian Essl
>> >> >>
>> >> >>
>> >> >>
>> >> >>
>> >> >>
>> >> >> ___________________________________________________________
>> >> >> Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos -
Hier
>> >> >> anmelden: http://mail.yahoo.de
>> >> >>
>> >> >>
>> >> >>
>> >> >> -------------------------------------------------------
>> >> >> SF.Net email is sponsored by:
>> >> >> Tame your development challenges with Apache's Geronimo App
>> Server.
>> >> >> Download
>> >> >> it for free - -and be entered to win a 42" plasma tv or your very
>> own
>> >> >> Sony(tm)PSP. Click here to play:
>> http://sourceforge.net/geronimo.php
>> >> >> _______________________________________________
>> >> >> Wicket-user mailing list
>> >> >> Wicket-user@lists.sourceforge.net
>> >> >> https://lists.sourceforge.net/lists/listinfo/wicket-user
>> >> >>
>> >>
>> >>
>> >>
>> >> --
>> >> Christian Essl
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> ___________________________________________________________
>> >> Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos - Hier
>> >> anmelden: http://mail.yahoo.de
>> >>
>> >>
>> >>
>> >> -------------------------------------------------------
>> >> SF.Net email is sponsored by:
>> >> Tame your development challenges with Apache's Geronimo App Server.
>> >> Download
>> >> it for free - -and be entered to win a 42" plasma tv or your very
own
>> >> Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php
>> >> _______________________________________________
>> >> Wicket-user mailing list
>> >> Wicket-user@lists.sourceforge.net
>> >> https://lists.sourceforge.net/lists/listinfo/wicket-user
>> >>
>>
>>
>>
>> --
>> Christian Essl
>>
>>
>>
>>
>>
>> ___________________________________________________________
>> Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos - Hier
>> anmelden: http://mail.yahoo.de
>>
>>
>>
>> -------------------------------------------------------
>> SF.Net email is sponsored by:
>> Tame your development challenges with Apache's Geronimo App Server.
>> Download
>> it for free - -and be entered to win a 42" plasma tv or your very own
>> Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php
>> _______________________________________________
>> Wicket-user mailing list
>> Wicket-user@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/wicket-user
>>



--
Christian Essl





___________________________________________________________
Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos - Hier
anmelden: http://mail.yahoo.de



-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server.
Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php
_______________________________________________
Wicket-user mailing list
Wicket-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wicket-user




--
Christian Essl
        

        
                
___________________________________________________________ Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos - Hier anmelden: http://mail.yahoo.de



-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server. Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP.  Click here to play: http://sourceforge.net/geronimo.php
_______________________________________________
Wicket-user mailing list
Wicket-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wicket-user

Reply via email to