CDI injection using @Advanced should work perfectly fine. We tested this excessively and use it on several containers in production.
I'm curious why it doesn't work for you. LieGrue, strub ----- Original Message ----- > From: "Howard W. Smith, Jr." <smithh032...@gmail.com> > To: MyFaces Discussion <users@myfaces.apache.org>; Rafael Pestano > <rmpest...@yahoo.com.br> > Cc: > Sent: Tuesday, November 20, 2012 3:13 PM > Subject: Re: Migrating to CDI: injecting stateless/facade in Converter via > facescontext > > Rafael, > > I saw that page about CODI @Advanced. :) > > I tried CODI @Advanced, but CDI managed bean was not injected voa @Inject, > and then I tried to inject Stateless EJB via @Inject, and that stateless > EJB was not injected either. > > Thanks, > Howard > > On Tue, Nov 20, 2012 at 9:02 AM, Rafael Pestano > <rmpest...@yahoo.com.br>wrote: > >> you can also use CODI @Advanced and then inject "anything" in the >> converter, see [1]. >> >> i hope it helps. >> >> [1]: >> https://cwiki.apache.org/EXTCDI/jsf-usage.html#JSFUsage-DependencyInjection >> >> >> Att, >> >> Rafael M. Pestano >> >> Desenvolvedor Java Cia. de Processamento de Dados do Rio Grande do Sul >> Graduando em Ciência da Computação UFRGS >> http://conventionsframework.org >> >> http://rpestano.wordpress.com/ >> @realpestano >> >> >> ________________________________ >> De: "Howard W. Smith, Jr." <smithh032...@gmail.com> >> Para: Mark Struberg <strub...@yahoo.de>; MyFaces Discussion < >> users@myfaces.apache.org> >> Cc: "us...@openejb.apache.org" <us...@openejb.apache.org> >> Enviadas: Terça-feira, 20 de Novembro de 2012 11:37 >> Assunto: Re: Migrating to CDI: injecting stateless/facade in Converter via >> facescontext >> >> Interesting and noted, thanks. Yes, I did hear JSF 2.2 will allow CDI in >> facesconverter. Thanks. >> On Nov 20, 2012 8:34 AM, "Mark Struberg" > <strub...@yahoo.de> wrote: >> >> > you could also have used CODI BeanManagerProvider#getReference to get >> > access to the bean. >> > >> > The support you need out of the box will come in JSF-2.2. >> > >> > >> > LieGrue, >> > strub >> > >> > >> > >> > ----- Original Message ----- >> > > From: "Howard W. Smith, Jr." > <smithh032...@gmail.com> >> > > To: us...@openejb.apache.org; MyFaces Discussion < >> > users@myfaces.apache.org> >> > > Cc: >> > > Sent: Tuesday, November 20, 2012 1:56 PM >> > > Subject: Re: Migrating to CDI: injecting stateless/facade in > Converter >> > via facescontext >> > > >> > >T he goal was to inject bean in facesconverter via CDI, but I > don't have >> > > this need anymore, since faces converter is not an eligible > injection >> > > point, so I opted to use request scoped JSF managed beans that > have >> > > facesconverter defined within the bean. That's working fine. > Thanks. >> > > >> > > Okay, I can cc myfaces user group as well, going forward. :-) >> > > On Nov 20, 2012 7:37 AM, "Romain Manni-Bucau" >> > > <rmannibu...@gmail.com> >> > > wrote: >> > > >> > >> i'm still not clear about your goal and where you need > injection >> > >> >> > >> maybe share a (runnable) sample to show us what you are > talking about >> > >> >> > >> side note: myfaces list can help you a lot about it too >> > >> >> > >> *Romain Manni-Bucau* >> > >> *Twitter: @rmannibucau > <https://twitter.com/rmannibucau>* >> > >> *Blog: **http://rmannibucau.wordpress.com/*< >> > >> http://rmannibucau.wordpress.com/> >> > >> *LinkedIn: **http://fr.linkedin.com/in/rmannibucau* >> > >> *Github: https://github.com/rmannibucau* >> > >> >> > >> >> > >> >> > >> >> > >> 2012/11/20 Howard W. Smith, Jr. > <smithh032...@gmail.com> >> > >> >> > >> > Interesting, that will allow you to get instance of > beans, if >> already >> > >> > instantiated, and that could have helped in converter, > only if >> beans >> > >> > already injected earlier? >> > >> > On Nov 20, 2012 7:11 AM, "Romain Manni-Bucau" >> > > <rmannibu...@gmail.com> >> > >> > wrote: >> > >> > >> > >> > > was thinking to >> > >> > > >> > >> > >> > >> >> > >> http://docs.oracle.com/javaee/6/api/javax/faces/context/FacesContext.html >> > >> > > getAttributes() >> > >> > > method (depend a bit on your real need) >> > >> > > >> > >> > > *Romain Manni-Bucau* >> > >> > > *Twitter: @rmannibucau > <https://twitter.com/rmannibucau>* >> > >> > > *Blog: **http://rmannibucau.wordpress.com/*< >> > >> > > http://rmannibucau.wordpress.com/> >> > >> > > *LinkedIn: > **http://fr.linkedin.com/in/rmannibucau* >> > >> > > *Github: https://github.com/rmannibucau* >> > >> > > >> > >> > > >> > >> > > >> > >> > > >> > >> > > 2012/11/20 Howard W. Smith, Jr. > <smithh032...@gmail.com> >> > >> > > >> > >> > > > Faces context? Please explain. >> > >> > > > On Nov 20, 2012 1:56 AM, "Romain > Manni-Bucau" >> > > < >> > >> rmannibu...@gmail.com> >> > >> > > > wrote: >> > >> > > > >> > >> > > > > You cant use faces context? >> > >> > > > > Le 20 nov. 2012 03:01, "Howard W. > Smith, Jr." >> > > < >> > >> > smithh032...@gmail.com> >> > >> > > a >> > >> > > > > écrit : >> > >> > > > > >> > >> > > > > > For minimal changes, I'm adding > FacesConverter >> > > to JSF >> > >> requestscoped >> > >> > > > > > managedBean's as per the > Stackoverflow answer >> > > below: >> > >> > > > > > >> > >> > > > > > How can I inject in > @FacesConverter?< >> > >> > > > > > > http://stackoverflow.com/a/13156834/933054> >> > >> > > > > > >> > >> > > > > > Yes, this means more classes in the > project, but >> > > honestly, I have >> > >> > not >> > >> > > > had >> > >> > > > > > to spend much time > 'maintaining' my >> > > Converter classes at all. I >> > >> > just >> > >> > > > > tested >> > >> > > > > > this concept, and I'm not > experiencing this >> > > exceptioin any more. >> > >> > > > > > >> > >> > > > > > While testing the above, I see more > exceptions to >> > > resolve related >> > >> > to >> > >> > > > > > migrating to CDI. Will let you all > know, if I have >> > > any more >> > >> > > questions. >> > >> > > > > > >> > >> > > > > > Thanks for all the responses/help, > so far. :) >> > >> > > > > > >> > >> > > > > > >> > >> > > > > > >> > >> > > > > > On Mon, Nov 19, 2012 at 7:20 PM, > Romain >> > > Manni-Bucau >> > >> > > > > > <rmannibu...@gmail.com>wrote: >> > >> > > > > > >> > >> > > > > > > If it is a nested class you > need it otherwise >> > > (class foo in >> > >> > > foo.java >> > >> > > > > > file) >> > >> > > > > > > you dont need it >> > >> > > > > > > Le 20 nov. 2012 01:16, > "Howard W. Smith, >> > > Jr." < >> > >> > > > smithh032...@gmail.com> >> > >> > > > > a >> > >> > > > > > > écrit : >> > >> > > > > > > >> > >> > > > > > > > Good question. I removed >> > > 'static', because I didn't see it in >> > >> > the >> > >> > > > > code >> > >> > > > > > at >> > >> > > > > > > > following URLs: >> > >> > > > > > > > >> > >> > > > > > > > >> > >> > > > > > > > >> > >> > > > > > > >> > >> > > > > > >> > >> > > > > >> > >> > > > >> > >> > > >> > >> > >> > >> >> > > >> > >> > https://cwiki.apache.org/confluence/display/EXTCDI/JSF+Usage#JSFUsage-DependencyInjection >> > >> > > > > > > > >> > >> > > > > > > > >> > >> > > > > > > > >> > >> > > > > > > >> > >> > > > > > >> > >> > > > > >> > >> > > > >> > >> > > >> > >> > >> > >> >> > > >> > >> > http://stackoverflow.com/questions/7531449/cdi-injection-into-a-facesconverter >> > >> > > > > > > > >> > >> > > > > > > > >> > > https://issues.apache.org/jira/browse/EXTCDI-127 >> > >> > > > > > > > >> > >> > > > > > > > >> > >> > > > > > > > On Mon, Nov 19, 2012 at > 4:30 PM, Romain >> > > Manni-Bucau >> > >> > > > > > > > > <rmannibu...@gmail.com>wrote: >> > >> > > > > > > > >> > >> > > > > > > > > Why removing static? > It means it is >> > > no more manageable by >> > >> cdi >> > >> > > > (cdi >> > >> > > > > > cant >> > >> > > > > > > > do >> > >> > > > > > > > > a new on it) >> > >> > > > > > > > > Le 19 nov. 2012 > 22:13, "Howard >> > > W. Smith, Jr." < >> > >> > > > > > smithh032...@gmail.com> >> > >> > > > > > > a >> > >> > > > > > > > > écrit : >> > >> > > > > > > > > >> > >> > > > > > > > > > @Advanced was > found in the >> > > following: >> > >> > > > > > > > > > >> > >> > > > > > > > > > import >> > >> org.apache.myfaces.extensions.cdi.core.api.Advanced; >> > >> > > > > > > > > > >> > >> > > > > > > > > > After some > tinkering, I >> > > removed 'static' from the >> > >> following >> > >> > > > > > > definition, >> > >> > > > > > > > > > >> > >> > > > > > > > > > public static > class >> > > AddressTypeControllerConverter >> > >> > implements >> > >> > > > > > > > Converter { >> > >> > > > > > > > > > >> > >> > > > > > > > > > I also added > @Advanced to the >> > > FacesConverter/Converter, >> > >> and >> > >> > > > > latest >> > >> > > > > > > > error >> > >> > > > > > > > > is >> > >> > > > > > > > > > the following: >> > >> > > > > > > > > > >> > >> > > > > > > > > > Nov 19, 2012 > 4:08:21 PM >> > >> > > > > > > javax.faces.component._ExternalSpecifications >> > >> > > > > > > > > > > isBeanValidationAvailable >> > >> > > > > > > > > > INFO: MyFaces > Bean Validation >> > > support enabled >> > >> > > > > > > > > > Nov 19, 2012 > 4:08:21 PM >> > >> > > > > > > >> > > org.apache.myfaces.application.ApplicationImpl >> > >> > > > > > > > > > > internalCreateConverter >> > >> > > > > > > > > > SEVERE: Could > not instantiate >> > > converter class >> > >> > > > > > > > > > >> > >> > > > > >> > > > jsf.address.pf_AddressTypeController$AddressTypeControllerConverter >> > >> > > > > > > > > > >> > > java.lang.InstantiationException: >> > >> > > > > > > > > > >> > >> > > > > >> > > > jsf.address.pf_AddressTypeController$AddressTypeControllerConverter >> > >> > > > > > > > > > >> > >> > > > > > > > > > >> > >> > > > > > > > > > >> > >> > > > > > > > > > On Mon, Nov 19, > 2012 at 3:07 >> > > PM, Howard W. Smith, Jr. < >> > >> > > > > > > > > > > smithh032...@gmail.com> >> > > wrote: >> > >> > > > > > > > > > >> > >> > > > > > > > > > > I searched > google, found >> > > the following: >> > >> > > > > > > > > > > >> > >> > > > > > > > > > > CDI > Injection into a >> > > FacesConverter< >> > >> > > > > > > > > > >> > >> > > > > > > > > >> > >> > > > > > > > >> > >> > > > > > > >> > >> > > > > > >> > >> > > > > >> > >> > > > >> > >> > > >> > >> > >> > >> >> > > >> > >> > http://stackoverflow.com/questions/7531449/cdi-injection-into-a-facesconverter >> > >> > > > > > > > > > > >> > >> > > > > > > > > > > >> > >> > > > > > > > > > > which lead > me to: >> > >> > > > > > > > > > > >> > >> > > > > > > > > > > MyFaces > Extensions CDI >> > >> JSF Usage > Dependency >> > >> > Injection< >> > >> > > > > > > > > > >> > >> > > > > > > > > >> > >> > > > > > > > >> > >> > > > > > > >> > >> > > > > > >> > >> > > > > >> > >> > > > >> > >> > > >> > >> > >> > >> >> > > >> > >> > https://cwiki.apache.org/confluence/display/EXTCDI/JSF+Usage#JSFUsage-DependencyInjection >> > >> > > > > > > > > > > >> > >> > > > > > > > > > > >> > >> > > > > > > > > > > but I > don't which >> > > library to import for @Advanced. >> > >> > > > > > > > > > > >> > >> > > > > > > > > > > If > @Advanced can be used >> > > (since I am using CODI), then >> > >> > this >> > >> > > > > would >> > >> > > > > > > be >> > >> > > > > > > > > > great. >> > >> > > > > > > > > > > >> > >> > > > > > > > > > > >> > >> > > > > > > > > > > On Mon, > Nov 19, 2012 at >> > > 2:56 PM, Romain Manni-Bucau < >> > >> > > > > > > > > > > rmannibu...@gmail.com >> > >> > > > > > > > > > > > > wrote: >> > >> > > > > > > > > > > >> > >> > > > > > > > > > >> Maybe > use >> > > BeanProvider of deltaspike >> > >> > > > > > > > > > >> Le 19 > nov. 2012 >> > > 20:50, "Howard W. Smith, Jr." < >> > >> > > > > > > > smithh032...@gmail.com >> > >> > > > > > > > > > >> > >> > > > > > > > > > a >> > >> > > > > > > > > > >> écrit > : >> > >> > > > > > > > > > >> >> > >> > > > > > > > > > >> > > Hmmm... after >> > > thinking about it, I remembered to use >> > >> > > > @Inject >> > >> > > > > > on >> > >> > > > > > > > the >> > >> > > > > > > > > > bean >> > >> > > > > > > > > > >> > > which I want to >> > > inject. So, I did the following: >> > >> > > > > > > > > > >> > >> > >> > > > > > > > > > >> > >> > > @FacesConverter(forClass = AddressType.class) >> > >> > > > > > > > > > >> > > public >> > > static class >> > >> AddressTypeControllerConverter >> > >> > > > > > > implements >> > >> > > > > > > > > > >> > Converter >> > >> > > > > > > > > > >> > { >> > >> > > > > > > > > > >> > >> > >> > > > > > > > > > >> > > @Inject >> > >> > > > > > > > > > >> > > private >> > > pf_AddressTypeController controller; >> > >> > > > > > > > > > >> > >> > >> > > > > > > > > > >> > > public >> > > Object getAsObject(FacesContext >> > >> > > > facesContext, >> > >> > > > > > > > > > UIComponent >> > >> > > > > > > > > > >> > > component, >> > > String value) { >> > >> > > > > > > > > > >> > > if >> > > (value == null || value.length() == >> > >> 0) >> > >> > { >> > >> > > > > > > > > > >> > >> > > return null; >> > >> > > > > > > > > > >> > > } >> > >> > > > > > > > > > >> > >> > > return >> > >> > > > controller.ejbFacade.find(getKey(value)); >> > >> > > > > > > > > > >> > > } >> > >> > > > > > > > > > >> > >> > >> > > > > > > > > > >> > > but >> > > 'controller' is still not being injected. I even >> > >> > > tried >> > >> > > > > the >> > >> > > > > > > > same >> > >> > > > > > > > > > for >> > >> > > > > > > > > > >> the >> > >> > > > > > > > > > >> > > actual >> > > 'ejbFacade' (which is a stateless bean), but >> > >> > > that, >> > >> > > > > too, >> > >> > > > > > > > > > resulted >> > >> > > > > > > > > > >> in >> > >> > > > > > > > > > >> > a >> > > NullPointerException, which tells me that @Inject >> > >> is >> > >> > > not >> > >> > > > > > > > injecting >> > >> > > > > > > > > > >> > >> > > pf_AddressTypeController (@sessionscoped bean) OR >> > >> > > > ejbFacade >> > >> > > > > > > > > > (@Stateless >> > >> > > > > > > > > > >> > > bean instance of >> > > AddressTypeFacade). >> > >> > > > > > > > > > >> > >> > >> > > > > > > > > > >> > >> > >> > > > > > > > > > >> > > Is there a >> > > general practice used for injecting beans >> > >> > in >> > >> > > > > > > > Converters.. >> > >> > > > > > > > > > >> > >> > >> > > > > > > > > > >> > >> > >> > > > > > > > > > >> > >> > >> > > > > > > > > > >> > > On Mon, Nov 19, >> > > 2012 at 2:38 PM, Romain Manni-Bucau >> > >> > > > > > > > > > >> > >> > > <rmannibu...@gmail.com>wrote: >> > >> > > > > > > > > > >> > >> > >> > > > > > > > > > >> > >> Can you >> > > reproduce it in a sample? What is on the >> > >> npe >> > >> > > > line? >> > >> > > > > > > > > > >> > >> Le 19 nov. >> > > 2012 20:25, "Howard W. Smith, Jr." < >> > >> > > > > > > > > > > smithh032...@gmail.com> >> > >> > > > > > > > > > >> a >> > >> > > > > > > > > > >> > >> écrit : >> > >> > > > > > > > > > >> > >> >> > >> > > > > > > > > > >> > >> > I am >> > > still migrating my app from JSF Managed >> > >> beans >> > >> > > to >> > >> > > > > CDI >> > >> > > > > > > > > managed >> > >> > > > > > > > > > >> > > beans, >> > >> > > > > > > > > > >> > >> so >> > >> > > > > > > > > > >> > >> > I am >> > > (regression) testing, and I came across the >> > >> > > > > exception >> > >> > > > > > > > below >> > >> > > > > > > > > > >> when >> > >> > > > > > > > > > >> > >> > >> > > attempting to add a record into the database on >> > >> > one >> > >> > > of >> > >> > > > > the >> > >> > > > > > > > xhtml >> > >> > > > > > > > > > >> pages. >> > >> > > > > > > > > > >> > >> > >> > >> > > > > > > > > > >> > >> > Caused >> > > by: java.lang.NullPointerException >> > >> > > > > > > > > > >> > >> > >> > > at >> > >> > > > > > > > > > >> > >> > >> > >> > > > > > > > > > >> > >> >> > >> > > > > > > > > > >> > >> > >> > > > > > > > > > >> >> > >> > > > > > > > > > >> > >> > > > > > > > > >> > >> > > > > > > > >> > >> > > > > > > >> > >> > > > > > >> > >> > > > > >> > >> > > > >> > >> > > >> > >> > >> > >> >> > > >> > >> > jsf.address.pf_AddressTypeController$AddressTypeControllerConverter.getAsObject(pf_AddressTypeController.java:283) >> > >> > > > > > > > > > >> > >> > >> > >> > > > > > > > > > >> > >> > >> > >> > > > > > > > > > >> > >> > The >> > > exception is caused by this line below. >> > >> > > > *ejbFacade* >> > >> > > > > > is a >> > >> > > > > > > > > > >> > stateless >> > >> > > > > > > > > > >> > >> bean >> > >> > > > > > > > > > >> > >> > >> > > injected by @Inject. >> > >> > > > > > > > > > >> > >> > >> > >> > > > > > > > > > >> > >> > >> > > return >> > >> > > > > > > > controller.*ejbFacade*.find(getKey(value)); >> > >> > > > > > > > > > >> > >> > >> > >> > > > > > > > > > >> > >> > >> > >> > > > > > > > > > >> > >> > The >> > > code below is as-is using JSF Managed Beans. >> > >> > > > Please >> > >> > > > > > > advise >> > >> > > > > > > > > on >> > >> > > > > > > > > > >> how I >> > >> > > > > > > > > > >> > >> > should >> > > update the following code, so it will >> > >> work >> > >> > > well >> > >> > > > > > with >> > >> > > > > > > > CDI. >> > >> > > > > > > > > > >> > >> > >> > >> > > > > > > > > > >> > >> > >> > > @FacesConverter(forClass = >> > >> AddressType.class) >> > >> > > > > > > > > > >> > >> > >> > > public static class >> > >> > > AddressTypeControllerConverter >> > >> > > > > > > > > implements >> > >> > > > > > > > > > >> > >> Converter >> > >> > > > > > > > > > >> > >> > { >> > >> > > > > > > > > > >> > >> > >> > >> > > > > > > > > > >> > >> > >> > > public Object getAsObject(FacesContext >> > >> > > > > > facesContext, >> > >> > > > > > > > > > >> > > UIComponent >> > >> > > > > > > > > > >> > >> > >> > > component, String value) { >> > >> > > > > > > > > > >> > >> > >> > > if (value == null || value.length() >> > >> == >> > >> > > 0) >> > >> > > > { >> > >> > > > > > > > > > >> > >> > >> > > return null; >> > >> > > > > > > > > > >> > >> > >> > > } >> > >> > > > > > > > > > >> > >> > >> > > pf_AddressTypeController controller >> > >> = >> > >> > > > > > > > > > >> > >> > >> > > (pf_AddressTypeController) >> > >> > > > > > > > > > >> > >> > > facesContext.getApplication().getELResolver(). >> > >> > > > > > > > > > >> > >> > >> > >> > > > > getValue(facesContext.getELContext(), >> > >> > > > > > > > null, >> > >> > > > > > > > > > >> > >> > >> > > "pf_addressTypeController"); >> > >> > > > > > > > > > >> > >> > >> > > return >> > >> > > > > > > controller.ejbFacade.find(getKey(value)); >> > >> > > > > > > > > > >> > >> > >> > > } >> > >> > > > > > > > > > >> > >> > >> > >> > > > > > > > > > >> > >> > >> > > java.lang.Integer getKey(String value) { >> > >> > > > > > > > > > >> > >> > >> > > java.lang.Integer key; >> > >> > > > > > > > > > >> > >> > >> > > key = Integer.valueOf(value); >> > >> > > > > > > > > > >> > >> > >> > > return key; >> > >> > > > > > > > > > >> > >> > >> > > } >> > >> > > > > > > > > > >> > >> > >> > >> > > > > > > > > > >> > >> > >> > > String getStringKey(java.lang.Integer >> > >> > > value) { >> > >> > > > > > > > > > >> > >> > >> > > StringBuffer sb = new >> > >> StringBuffer(); >> > >> > > > > > > > > > >> > >> > >> > > sb.append(value); >> > >> > > > > > > > > > >> > >> > >> > > return sb.toString(); >> > >> > > > > > > > > > >> > >> > >> > > } >> > >> > > > > > > > > > >> > >> > >> > >> > > > > > > > > > >> > >> > >> > > public String getAsString(FacesContext >> > >> > > > > > facesContext, >> > >> > > > > > > > > > >> > > UIComponent >> > >> > > > > > > > > > >> > >> > >> > > component, Object object) { >> > >> > > > > > > > > > >> > >> > >> > > if (object == null) { >> > >> > > > > > > > > > >> > >> > >> > > return null; >> > >> > > > > > > > > > >> > >> > >> > > } >> > >> > > > > > > > > > >> > >> > >> > > if (object instanceof AddressType) { >> > >> > > > > > > > > > >> > >> > >> > > AddressType o = (AddressType) >> > >> > > object; >> > >> > > > > > > > > > >> > >> > >> > > return >> > >> > > > > getStringKey(o.getAddressTypeId()); >> > >> > > > > > > > > > >> > >> > >> > > } else { >> > >> > > > > > > > > > >> > >> > >> > > throw new >> > >> > > > > IllegalArgumentException("object >> > >> > > > > > > " + >> > >> > > > > > > > > > >> object >> > >> > > > > > > > > > >> > + > " >> > >> > > > > > > > > > >> > >> > is of >> > > type " + object.getClass().getName() + "; >> > >> > > > expected >> > >> > > > > > > type: >> > >> > > > > > > > > " + >> > >> > > > > > > > > > >> > >> > >> > > pf_AddressTypeController.class.getName()); >> > >> > > > > > > > > > >> > >> > >> > > } >> > >> > > > > > > > > > >> > >> > >> > > } >> > >> > > > > > > > > > >> > >> > } >> > >> > > > > > > > > > >> > >> > } >> > >> > > > > > > > > > >> > >> > >> > >> > > > > > > > > > >> > >> >> > >> > > > > > > > > > >> > >> > >> > > > > > > > > > >> >> > >> > > > > > > > > > > >> > >> > > > > > > > > > > >> > >> > > > > > > > > > >> > >> > > > > > > > > >> > >> > > > > > > > >> > >> > > > > > > >> > >> > > > > > >> > >> > > > > >> > >> > > > >> > >> > > >> > >> > >> > >> >> > > >> > >> >