You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@turbine.apache.org by John McNally <jm...@collab.net> on 2001/04/10 17:54:39 UTC

Re: Bug in DBUserManager?

You should read the javadoc for the method you are using. :-)

Why this method chooses to do things differently than all other uses of
Criteria, I do not know.  This is a good reason not to use a generic
String key in Criteria, but I will hopefully have time to fix that
sometime soon.  Criteria keys are supposed to be the fully qualified
column names, so I understand your confusion.  Can anyone explain this
implementation?

john mcnally 


Eric Dobbs wrote:
> 
> Hi All.
> 
> I'm feeling over my head in turbine details, so bear with me.
> 
> A little context:
> I'm trying to fix a problem in our edit user page.  We're using jsp,
> not velocity.  This was working three or four weeks ago before some
> changes to torque.  At least I think that's what changed.
> 
> Let me start with the exception:
> 
> Error encountered processing a template:
> /screens/admin/EditUser.jspjavax.servlet.ServletException:
> DataBackendException: Failed to retrieve users: General error: Unknown
> table 'TURBINE_USER.TURBINE_USER' in where clause
>         at
> org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:481)
>         at
> templates.screens.admin._0002ftemplates_0002fscreens_0002fadmin_0002fEditUser_0002ejspEditUser_jsp_1._jspService(_0002ftemplates_0002fscreens_0002fadmin_0002fEditUser_0002ejspEditUser_jsp_1.java:619)
>         at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
>         at
> org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:184)
>         at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:328)
>         at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:407)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
>         at
> org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:573)
>         at
> org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:483)
>         at
> org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:388)
>         at
> org.apache.turbine.services.jsp.TurbineJspService.handleRequest(TurbineJspService.java:186)
>         at
> org.apache.turbine.modules.screens.BaseJspScreen.buildTemplate(BaseJspScreen.java:107)
>         at
> org.apache.turbine.modules.screens.TemplateScreen.doBuild(TemplateScreen.java:136)
>         at org.apache.turbine.modules.Screen.build(Screen.java:98)
>         at org.apache.turbine.modules.ScreenLoader.eval(ScreenLoader.java:129)
>         at
> org.apache.turbine.modules.layouts.DefaultLayout.doBuild(DefaultLayout.java:105)
>         at org.apache.turbine.modules.Layout.build(Layout.java:91)
>         at org.apache.turbine.modules.LayoutLoader.exec(LayoutLoader.java:122)
>         at org.apache.turbine.modules.pages.DefaultPage.doBuild(DefaultPage.java:166)
>         at org.apache.turbine.modules.Page.build(Page.java:90)
>         at org.apache.turbine.modules.PageLoader.exec(PageLoader.java:123)
>         at org.apache.turbine.Turbine.doGet(Turbine.java:433)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
>         at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
>         at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:251)
>         at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:977)
>         at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:196)
>         at org.apache.catalina.valves.ValveBase.invokeNext(ValveBase.java:242)
>         at
> org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:464)
>         at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:975)
>         at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2041)
>         at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
>         at org.apache.catalina.valves.ValveBase.invokeNext(ValveBase.java:242)
>         at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:414)
>         at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:975)
>         at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:159)
>         at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:977)
>         at
> org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:818)
>         at
> org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:897)
>         at java.lang.Thread.run(Thread.java:484)
> Horrible Exception: javax.servlet.ServletException:
> DataBackendException: Failed to retrieve users: General error: Unknown
> table 'TURBINE_USER.TURBINE_USER' in where clause
>         at
> org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:481)
>         at
> templates.screens.admin._0002ftemplates_0002fscreens_0002fadmin_0002fEditUser_0002ejspEditUser_jsp_1._jspService(_0002ftemplates_0002fscreens_0002fadmin_0002fEditUser_0002ejspEditUser_jsp_1.java:619)
>         at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
>         at
> org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:184)
>         at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:328)
>         at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:407)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
>         at
> org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:573)
>         at
> org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:483)
>         at
> org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:388)
>         at
> org.apache.turbine.services.jsp.TurbineJspService.handleRequest(TurbineJspService.java:186)
> rethrown as org.apache.turbine.util.TurbineException: Error encountered
> processing a template:/screens/admin/EditUser.jsp: DataBackendException:
> Failed to retrieve users: General error: Unknown table
> 'TURBINE_USER.TURBINE_USER' in where clause
>         at
> org.apache.turbine.services.jsp.TurbineJspService.handleRequest(TurbineJspService.java:204)
>         at
> org.apache.turbine.modules.screens.BaseJspScreen.buildTemplate(BaseJspScreen.java:107)
>         at
> org.apache.turbine.modules.screens.TemplateScreen.doBuild(TemplateScreen.java:136)
>         at org.apache.turbine.modules.Screen.build(Screen.java:98)
>         at org.apache.turbine.modules.ScreenLoader.eval(ScreenLoader.java:129)
>         at
> org.apache.turbine.modules.layouts.DefaultLayout.doBuild(DefaultLayout.java:105)
>         at org.apache.turbine.modules.Layout.build(Layout.java:91)
>         at org.apache.turbine.modules.LayoutLoader.exec(LayoutLoader.java:122)
>         at org.apache.turbine.modules.pages.DefaultPage.doBuild(DefaultPage.java:166)
>         at org.apache.turbine.modules.Page.build(Page.java:90)
>         at org.apache.turbine.modules.PageLoader.exec(PageLoader.java:123)
>         at org.apache.turbine.Turbine.doGet(Turbine.java:433)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
>         at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
>         at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:251)
>         at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:977)
>         at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:196)
>         at org.apache.catalina.valves.ValveBase.invokeNext(ValveBase.java:242)
>         at
> org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:464)
>         at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:975)
>         at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2041)
>         at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
>         at org.apache.catalina.valves.ValveBase.invokeNext(ValveBase.java:242)
>         at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:414)
>         at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:975)
>         at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:159)
>         at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:977)
>         at
> org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:818)
>         at
> org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:897)
>         at java.lang.Thread.run(Thread.java:484)
> 
> The important part is this:
> Unknown table 'TURBINE_USER.TURBINE_USER' in where clause
> 
> I've traced this problem back to a mismatch between DBUserManager.java
> and Criteria.java.  But the path to the mismatch is convoluted.
> 
> (1)
> Our code does this:
>       Criteria crit = new Criteria();
>       crit.add(TurbineUserPeer.USERNAME, strUsername);
>       users = TurbineSecurity.getUsers(crit);
> 
> (2)
> As I'm sure you know, TurbineUserPeer.USERNAME is a static method that
> returns the String 'TURBINE_USER.LOGIN_NAME'.
> 
> (3)
> crit.add('TURBINE_USER.LOGIN_NAME', strUsername)
> puts a new Criterion into the hashmap under the key
> 'TURBINE_USER.LOGIN_NAME' like this (Criteria.java 902):
> 
>           super.put( key, new Criterion(key, value, comparison) );
> 
> (4)
> new Criterion(key, value, comparison)
> correctly separates 'TURBINE_USER.LOGIN_NAME' into
> table='TURBINE_USER'
> column='LOGIN_NAME'
> 
> (5)
> TurbineSecurity.getUsers(crit)
> ultimately ends up calling DBUserManager.retrieve(crit)
> 
> (6)
> That method is defined at DBUserManager.java 195:
> 
> 195    public User[] retrieve( Criteria criteria )
> 196        throws DataBackendException
> 197    {
> 198        Criteria dbCriteria = new Criteria();
> 199        Iterator keys = criteria.keySet().iterator();
> 200        while(keys.hasNext())
> 201        {
> 202            String key = (String)keys.next();
> 203            dbCriteria.put(TurbineUserPeer.getColumnName(key),
> 204                criteria.get(key));
> 205        }
> 206        Vector users = new Vector(0);
> 207        try
> 208        {
> 209            users = TurbineUserPeer.doSelect(dbCriteria);
> 210        }
> 211        catch(Exception e)
> 212        {
> 213            throw new DataBackendException("Failed to retrieve
> users", e);
> 214        }
> 215        return (User[])users.toArray(new User[0]);
> 216    }
> 
> (7)
> On line 203, there's a call:
> TurbineUserPeer.getColumnName(key)
> 'key; is the key from the Criteria hashmap, which as mentioned
> above is 'TURBINE_USER.LOGIN_NAME'
> 
> (8)
> getColumnName(key) appends the table name to 'key'
> returning 'TURBINE_USER.TURBINE_USER.LOGIN_NAME'
> TurbineUserPeer.java 192-199
> 
>       public static String getColumnName (String name)
>       {
>           StringBuffer sb = new StringBuffer();
>           sb.append (TABLE_NAME);
>           sb.append (".");
>           sb.append (name);
>           return sb.toString();
>       }
> 
> So where would you fix this?
>       TurbineUserPeer.java
>       Criteria.java
>       DBUserManager.java
> 
> -Eric
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: turbine-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: turbine-dev-help@jakarta.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: turbine-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: turbine-dev-help@jakarta.apache.org