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 <[email protected]> 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:///
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>