Update part 2:

I now believe this to be a bug.  I am currently using rc5.  

I have debugged and ended up replacing the line that retrieves the
base_alias in the buildSuperJoinTree method of SqlQueryStatement.  My
code is in between the *********** rows.  

I have not tested it thoroughly nor have I looked at the ramifications
that I could have on other code.  I am merely suggesting it as a
potential fix to a potential bug.  I am requesting someone please look
at this case and (a) verify that it is a bug and (b) verify that my fix
is a valid fix.

My code for the method would be:


    protected void buildSuperJoinTree( TableAlias left, ClassDescriptor
cld, String name )
    {

        Iterator objRefs =
cld.getObjectReferenceDescriptors().iterator();
        while( objRefs.hasNext() )
        {
            ObjectReferenceDescriptor objRef =
(ObjectReferenceDescriptor) objRefs.next();

            FieldDescriptor[] leftFields =
objRef.getForeignKeyFieldDescriptors(cld);

            ClassDescriptor refCld =
cld.getRepository().getDescriptorFor(objRef.getItemClassName());

            if (objRef.getPersistentField() instanceof
AnonymousPersistentFieldForInheritance)
            {

/**********************/

          //The other methods store the alias/path in the map using only
the first part of 
          //    the path string as the key. e.g. "objectA" instead of
"objectA.objectB"
          //      This fix takes the first part of the existing path
string.
        String shrtName = name;
        int sepPos = shrtName.indexOf(".");
        if (sepPos >= 0){
          shrtName = shrtName.substring(0, sepPos);
        }
        TableAlias base_alias = getTableAliasForPath( shrtName, null );

          //commented out the old version
          //TableAlias base_alias = getTableAliasForPath( name, null );

/**********************/



                String aliasName = String.valueOf(getAliasChar()) +
m_aliasCount++;
                
                TableAlias right = new TableAlias( refCld, aliasName,
false, null );

                Join join1to1 = new Join(left, leftFields, right,
refCld.getPkFields(), false, "superClass");
                               
                base_alias.addJoin( join1to1 );

                buildSuperJoinTree( right, refCld, name);
            
            }
        }
    } 



-----Original Message-----
From: Phil Armour 
Sent: Monday, April 12, 2004 1:50 PM
To: OJB Users List
Subject: RE: addEqualTo throws Exception on 2-deep reference-descriptor

Update on my search:

I have began going through the source and the null pointer is a result
of the following line in buildSuperJoinTree() in class
SqlQueryStatement:

TableAlias base_alias = getTableAliasForPath( name, null ); 

What is happening is that the variable 'name' is set to the value:
"mStakeholder.mTopicsOfInterest"
The result of calling the method getTableAliasForPath with that string
is a null value is set to base_alias.  This obviously results in a NPE.
If someone could advise me which direction I should look for the problem
from here.  I see it as two options: check the getTableAliasForPath()
method to see why it returns null; Find out why the variable name is set
to "mStakeholder.mTopicsOfInterest".

Thanks.


-----Original Message-----
From: Phil Armour
Sent: Monday, April 12, 2004 12:12 PM
To: [EMAIL PROTECTED]
Subject: addEqualTo throws Exception on 2-deep reference-descriptor

Hi,
 
I am getting a null pointer exception when adding an EqualTo query term
that references the second embedded object.  For example:  I have a
Contact object that contains a reference-descriptor to a Stakeholder.
This stakeholder then contains a collection-descriptor to other Objects
(TopicsOfInterest).  What I am trying to do is add the following
criteria term:
 
crit.addEqualTo("mStakeholder.mTopicsOfInterest.mId",new
Long(getDdid()));

The Exception I get is:
 
java.lang.NullPointerException
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildSuperJoinTr
ee(SqlQueryStatement.java:1531)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.getTableAlias(Sq
lQueryStatement.java:1006)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildJoinTreeFor
Column(SqlQueryStatement.java:1501)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildJoinTree(Sq
lQueryStatement.java:1478)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildJoinTree(Sq
lQueryStatement.java:1467)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.splitCriteria(Sq
lQueryStatement.java:1556)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(SqlQueryS
tatement.java:155)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(SqlQueryS
tatement.java:111)
        at
org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement.<init>(SqlSelec
tStatement.java:89)
        at
org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl.getPrepare
dSelectStatement(SqlGeneratorDefaultImpl.java:196)
        at
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeQuery(JdbcAccess
Impl.java:306)
        at
org.apache.ojb.broker.accesslayer.RsIterator.<init>(RsIterator.java:209)
        at
org.apache.ojb.broker.core.RsIteratorFactoryImpl.createRsIterator(RsIter
atorFactoryImpl.java:95)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getRsIteratorFromQuery(
PersistenceBrokerImpl.java:2426)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getIteratorFromQuery(Pe
rsistenceBrokerImpl.java:1766)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe
rsistenceBrokerImpl.java:1372)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe
rsistenceBrokerImpl.java:1563)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe
rsistenceBrokerImpl.java:1599)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe
rsistenceBrokerImpl.java:1588)
        at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQu
ery(DelegatingPersistenceBroker.java:322)
        at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQu
ery(DelegatingPersistenceBroker.java:322)
        at
appian.tracking.services.TrackingService.getCollection(TrackingService.j
ava:94)
        at
appian.tracking.services.CaseService.getCasesByFolder(CaseService.java:3
58)
        at
appian.tracking.services.CaseService.getCasesByFolder(CaseService.java:3
36)
        at
appian.tracking.cases.case056.TOISearch.generate(TOISearch.java:62)
        at
appian.tracking.actions.CustomCaseReportAction.execute(CustomCaseReportA
ction.java:40)
        at
org.apache.struts.action.RequestProcessor.processActionPerform(RequestPr
ocessor.java:484)
        at
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:
274)
        at
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
        at
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
tionFilterChain.java:284)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
erChain.java:204)
        at
appian.tracking.util.loginFilter.doFilter(loginFilter.java:104)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
tionFilterChain.java:233)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
erChain.java:204)
        at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValv
e.java:257)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:151)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5
64)
        at
org.apache.catalina.core.StandardContextValve.invokeInternal(StandardCon
textValve.java:245)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValv
e.java:199)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:151)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5
64)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java
:195)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:151)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java
:164)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:149)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5
64)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.
java:156)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:151)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5
64)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:972)
        at
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:206)
        at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:82
8)
        at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processC
onnection(Http11Protocol.java:700)
        at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:58
4)
        at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool
.java:683)
        at java.lang.Thread.run(Thread.java:534)
rethrown as
org.apache.ojb.broker.PersistenceBrokerException
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe
rsistenceBrokerImpl.java:1570)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe
rsistenceBrokerImpl.java:1599)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe
rsistenceBrokerImpl.java:1588)
        at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQu
ery(DelegatingPersistenceBroker.java:322)
        at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQu
ery(DelegatingPersistenceBroker.java:322)
        at
appian.tracking.services.TrackingService.getCollection(TrackingService.j
ava:94)
        at
appian.tracking.services.CaseService.getCasesByFolder(CaseService.java:3
58)
        at
appian.tracking.services.CaseService.getCasesByFolder(CaseService.java:3
36)
        at
appian.tracking.cases.case056.TOISearch.generate(TOISearch.java:62)
        at
appian.tracking.actions.CustomCaseReportAction.execute(CustomCaseReportA
ction.java:40)
        at
org.apache.struts.action.RequestProcessor.processActionPerform(RequestPr
ocessor.java:484)
        at
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:
274)
        at
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
        at
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
tionFilterChain.java:284)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
erChain.java:204)
        at
appian.tracking.util.loginFilter.doFilter(loginFilter.java:104)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
tionFilterChain.java:233)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
erChain.java:204)
        at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValv
e.java:257)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:151)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5
64)
        at
org.apache.catalina.core.StandardContextValve.invokeInternal(StandardCon
textValve.java:245)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValv
e.java:199)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:151)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5
64)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java
:195)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:151)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java
:164)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:149)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5
64)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.
java:156)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:151)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5
64)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:972)
 
        at
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:206)
        at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:82
8)
        at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processC
onnection(Http11Protocol.java:700)
        at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:58
4)
        at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool
.java:683)
        at java.lang.Thread.run(Thread.java:534)
Caused by: java.lang.NullPointerException
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildSuperJoinTr
ee(SqlQueryStatement.java:1531)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.getTableAlias(Sq
lQueryStatement.java:1006)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildJoinTreeFor
Column(SqlQueryStatement.java:1501)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildJoinTree(Sq
lQueryStatement.java:1478)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.buildJoinTree(Sq
lQueryStatement.java:1467)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.splitCriteria(Sq
lQueryStatement.java:1556)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(SqlQueryS
tatement.java:155)
        at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(SqlQueryS
tatement.java:111)
        at
org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement.<init>(SqlSelec
tStatement.java:89)
        at
org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl.getPrepare
dSelectStatement(SqlGeneratorDefaultImpl.java:196)
        at
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeQuery(JdbcAccess
Impl.java:306)
        at
org.apache.ojb.broker.accesslayer.RsIterator.<init>(RsIterator.java:209)
        at
org.apache.ojb.broker.core.RsIteratorFactoryImpl.createRsIterator(RsIter
atorFactoryImpl.java:95)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getRsIteratorFromQuery(
PersistenceBrokerImpl.java:2426)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getIteratorFromQuery(Pe
rsistenceBrokerImpl.java:1766)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe
rsistenceBrokerImpl.java:1372)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Pe
rsistenceBrokerImpl.java:1563)
        ... 42 more
 
I have no problems when querying for Stakeholders given the
TopicOfInterest or for Contacts given the Stakeholder.  My problem only
arises when going the extra level of depth.  Such a query seems like a
common requirement so I am wondering if anyone has encountered this
error, or more likely, can point out where I am missing something
obvious.
 
Further I tested with just a regular reference-descriptor (instead of
the collection) and got the same error.  
Another note is that the Contact and Stakeholder are implementations of
an abstract class and they each use separate tables.
 

_________________________________________ 

Phil Armour


 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to