On 9/4/07, Simon Laws <[EMAIL PROTECTED]> wrote:
>
>
>
> On 9/4/07, JunJie Nan <[EMAIL PROTECTED]> wrote:
> >
> > I tried to make some sense on @Conversational and @Scope("REQUEST"), but
> > failed.  The error message:
> > java.lang.ClassCastException: java.lang.String incompatible with
> > java.lang.Thread
> >     at
> > org.apache.tuscany.sca.core.scope.RequestScopeContainer.getWrapper (
> > RequestScopeContainer.java:35)
> >     at
> >
> > org.apache.tuscany.sca.implementation.java.invocation.JavaImplementationInvoker.getInstance
> > (JavaImplementationInvoker.java:62)
> >     at
> >
> > org.apache.tuscany.sca.implementation.java.invocation.JavaImplementationInvoker.invoke
> > (JavaImplementationInvoker.java:85)
> >     at
> > org.apache.tuscany.sca.binding.sca.impl.RuntimeSCABindingInvoker.invoke(
> > RuntimeSCABindingInvoker.java:48)
> >     at
> > org.apache.tuscany.sca.core.invocation.JDKInvocationHandler.invoke (
> > JDKInvocationHandler.java:270)
> >     at
> > org.apache.tuscany.sca.core.invocation.JDKInvocationHandler.invoke(
> > JDKInvocationHandler.java:114)
> >     at $Proxy9.empty(Unknown Source)
> >     at samples.hex.HexTest.testCartService (HexTest.java:77)
> > I tried:
> >
> >    1.  @Conversational + @Scope("STATELESS")
> >    2.  @Conversational + @Scope("CONVERSATION")
> >    3.  @Conversational + @Scope("COMPOSITE")
> >
> > All the above 3 worked fine and did not have the error message above.
> >
> > Anybody can give me some hints, thanks!
> >
> > The component definition:
> >     <component name="CartComponent">
> >         <implementation.java class="samples.hex.cart.impl.CartImpl"/>
> >     </component>
> >
> > The implementation:
> > package samples.hex.cart.impl;
> >
> > import java.util.HashMap;
> > import java.util.Map;
> >
> > import org.osoa.sca.annotations.ConversationID;
> > import org.osoa.sca.annotations.Destroy ;
> > import org.osoa.sca.annotations.Init;
> > import org.osoa.sca.annotations.Scope;
> > import org.osoa.sca.annotations.Service;
> >
> > import samples.hex.cart.services.CartService;
> >
> > @Scope("REQUEST")
> > @Service( CartService.class)
> > public class CartImpl implements CartService {
> >
> >     @ConversationID
> >     protected String conversationID;
> >
> >     protected Map<String, Integer> cart;
> >     @Init
> >     protected void init(){
> >         if(cart==null)
> >             cart = new HashMap<String, Integer>();
> >     }
> >
> >     public void empty() {
> >         cart.clear();
> >     }
> >
> >     public Map<String, Integer> getItems() {
> >         return cart;
> >     }
> >
> >     public void updateItem(String itemID, int quantity) {
> >         if(quantity<=0)
> >             cart.remove(itemID);
> >         cart.put(itemID, quantity);
> >         System.out.println (conversationID + ":" + this);
> >     }
> >
> >     @Destroy
> >     protected void destroy(){
> >         empty();
> >     }
> > }
> >
> > The interface:
> > package samples.hex.cart.services;
> >
> > import java.util.Map ;
> >
> > import org.osoa.sca.annotations.Conversational;
> >
> > @Conversational
> > public interface CartService{
> >     public void updateItem(String itemID, int quantity);
> >     public void empty();
> >     public Map<String, Integer> getItems();
> > }
> >
> > The Test Code:
> >     @Test
> >     public void testCartService(){
> >         CartService cart = hex.getService(CartService.class,
> > "CartComponent/CartService");
> >         assertNotNull(cart);
> >         cart.empty();
> >     }
> >
> >
> >
> > --
> > Cheers
> > Jun Jie Nan
> >   ∧ ∧��
> > ミ^ō^ミ灬)~
> >
>
> Hi JunJie
>
> I looks like you've found a bug. Can you raise a JIRA for this and I'll
> take a look at it.
>
> Thanks
>
> Simon
>
There is a problem here.

The cause of the problem is the RequestScopeContainer being defined as an
AbstractScopeContainer<Thread>. This forces the RequestScopeContainer to
implement

public InstanceWrapper getWrapper(Thread contextId)

Even though the container doesn't use the context id that's passed (It just
uses the current thread object to find the right instance). During
conversations the contextId is very unlikely to be a Thread. It's usually a
string but is sometimes something else.

To fix this, without checking in the calling code what type is expected,
I've changed RequestScopeContainer to be a AbstractScopeContainer<Object>.
It still deals with Thread internally.

Am just testing now but if anyone has any concerns let me know.

Simon

Reply via email to