hi Simon -

Made the changes as suggested and <reference> is now only in QueryExecutor.
All others pure Java. Thanks for the help and suggestions.
I tried just getting the size of the ArrayList in QueryExecutor and I lose
it right after I set it in the ServiceReference object on QueryExecutor.
--------------------
So in QueryExecutor I try as below where QueryResults declared as a
ServiceReference:

@Reference
protected ServiceReference<QueryResults> queryResults;

1. System.out.println("Patients Count (Before ServiceReference): " +
alPatients.size());
2. queryResults.getService().setResults(alPatients);
3. System.out.println("Patients Count (In ServiceReference): " +
queryResults.getService().getResults().size());

1 Returns the correct size of ArrayList of Patients in getting from
database.
2. Sets the ArrayList in the QueryResults object declared as a
ServiceReference injection for QueryExecutor.
3. Try to get the size of the ArrayList in the ServiceReference object
QueryResults and get the null-pointer error.

Did not have to try it from QueryServlet. It does not seem to set it in the
ServiceReference object. Running JDK 1.6.0.20.
--------------------
Thanks again for all your help.

monosij

On Thu, Apr 21, 2011 at 4:36 AM, Simon Nash <n...@apache.org> wrote:

> Hi Monosij,
> See comments below.
>
>  Simon
>
>
> Monosij Dutta-Roy wrote:
>
>> Simon -
>> Thanks for your help with the ServiceReference - it is almost there but am
>> getting a null-pointer error on trying to access the QueryResults.
>> I have attached the error file generated.
>> ---------------------
>> Starting with QueryExecutor where I create the ServiceReference object as:
>>     @Reference
>>    protected ServiceReference<QueryResults> queryResults;
>>
>>  That looks right.
>
>
>  I pass it back through QueryOrchestrator > QueryService > QueryServlet and
>> I declare the reference in *_each_* object the same as above.
>>
> >
> You should only use the @Reference annotation in QueryExecutor.  In the
> other classes you should declare it as a normal Java variable with the
> type ServiceReference<QueryResults>.
>
>
>  And refer to it in the composite file as:
>>
>>        <reference name="queryResults"
>> target="QueryResultsComponent/QueryResults">
>>            <interface.java interface="org.rd.qm.QueryResults"/>
>>        </reference>
>>
>>  You should only be doing this in QueryExecutor.
>
>
>  It seems to work as now I do not get the PassByValue error anymore.
>> ---------------------
>> But now I get a null-pointer error when trying to access the QueryResults
>> object in the ServiceReference object.
>> I set the ServiceReference<QueryResults> queryResults in QueryExecutor as:
>>
>> first this way:
>> queryResults.getService().setResults(alPatients);
>>
>>  That looks right.
>
>
>  second in this way:
>> QueryResults quRes = new QueryResultsImpl();
>> quRes.setResults(alPatients);
>> queryResults.getBusinessInterface().cast(quRes);
>>
>>  That doesn't look right.
>
>
>  Essentially I am trying to set the ArrayList of results in QueryResults
>> and in QueryServlet trying to display the ArrayList.
>>
>> So in QueryServlet I try to access the ArrayList as:
>> ArrayList alPatients = queryResults.getService().getResults();
>>
>>  That looks right.
>
>
>  This seems to be fine as I get an ArrayList
>> But I get a null-pointer when I try to iterate the ArrayList.
>>
> >
> I'm not sure why this is happening.  You should get the same contents
> from doing this in QueryServlet as you would get if you did it in
> QueryExecutor after the setResults() call.  Can you try interating the
> ArrayList in QueryExecutor after calling setResults() to see if that
> works OK?
>
>
>  ---------------------
>> Questions:
>>
>> 1. Seems the way I set I have set up the ServiceReference is working. Is
>> that the best way to set up the ServiceReference? If so it seems like it
>> would be a good idea to have ServiceReferences as a separate contribution
>> that is 'passed around'. And then take it a step further by setting
>> ServiceReferences as JAXB datatypes.
>>
>>  Contributions aren't passed around at runtime.  The way you are doing it
> (with the changes/corrections that I suggested above) is fine.  I think
> it's best to defer the JAXB issues until you have got the non-JAXB code
> working.
>
>
>  2. I had to set up the ServiceReference in each obect, even in
>> QueryServlet. QueryServlet which calls QueryService (in same composite)
>> still needs to pass back QueryResults as a ServiceReference since
>> QueryService is defined as Remotable. I was planning on using QueryService
>> for housekeeping while still making it Remotable - and pass back to
>> QueryServlet only what is needed (so servlet framework can be swapped out).
>> But now it seems I have to make the QueryServlet (ie the Servlet framework)
>> depend on QueryResult or such. Is there a way to avoid this? Am I thinking
>> about this the right way? I am thinking QueryServlet should only know and
>> depend on QueryService in the same composite. I guess then QueryService has
>> to be Local?
>>
>>  If you make QueryService local, this means the code for QueryService
> will always run in the same webapp as QueryServlet.  Is that what
> you want?  Originally I thought you wanted to keep the back-end logic
> separate from the UI framework.  Is QueryService part of the back-end
> logic or is it part of the UI framework?
>
>
>  3. This is a question for later once I get this working but I am currently
>> importing QueryOrchestrator in QueryService (webapp). Would there be a way
>> to go around this and not have QueryOrchestrator connected at all. I am
>> assuming I can go the ws.binding route and just call the webservice that
>> QueryOrchestrator will service - but I lose the non-ws.binding connectivity.
>> Would there be a way to just depend on QueryResults - that is shared by
>> everyone and is a ServiceReference - to make it happen. I am just shooting
>> in dark here a little. But my thought is I should only want to depend on
>> QueryResults and not worry about how I get QueryResults. I guess I will need
>> to try some approaches.
>>
>>  I'm not sure what the purpose of QueryOrchestrator is.  As you say,
> getting
> it working is the first priority.  When you have it working, you can look
> at the end-to-end design and make changes incrementally to change the
> component structure as needed.  With SCA, this should be easy to do.
>
>
>  4. This maybe related, not a big deal but strange. I am using Eclipse
>> Helios on Ubuntu and since I started using ServiceReference - the objects
>> from the third composite: domainBCA - which are Person and PhysicalLocation
>> have an error marker on them as 'import not found'. I tried deleting them
>> and recreating the imports, it still remains. Removing ServiceReference
>> makes those go away. However it does not create a problem as such as Maven
>> compiles fine - but it is happening in both the composites: controller and
>> servlet.
>> ---------------------
>> Thanks for all your help and patience.
>>
>>  My guess is that your Eclipse workspace is missing a dependency on the
> Tuscany library that provides the definition of the ServiceReference
> interface.
>
>  Simon
>
>  monosij
>>
>>
>> ------------------------------------------------------------------------
>>
>>
>>    HTTP ERROR 500
>>
>> Problem accessing /qmAppSCA01/QueryServlet. Reason:
>>
>>    INTERNAL_SERVER_ERROR
>>
>>
>>      Caused by:
>>
>> java.lang.NullPointerException
>>        at org.rd.qm.servlet.QueryServlet.getPatients(QueryServlet.java:74)
>>        at org.rd.qm.servlet.QueryServlet.service(QueryServlet.java:91)
>>        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
>>        at
>> org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
>>        at
>> org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:401)
>>        at
>> org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
>>        at
>> org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
>>        at
>> org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
>>        at
>> org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
>>        at
>> org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
>>        at
>> org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
>>        at
>> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
>>        at org.mortbay.jetty.Server.handle(Server.java:326)
>>        at
>> org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
>>        at
>> org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)
>>        at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
>>        at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
>>        at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
>>        at
>> org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
>>        at
>> org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
>>
>> ------------------------------------------------------------------------
>> /Powered by Jetty:///
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>

Reply via email to