Revision: 6460
http://squirrel-sql.svn.sourceforge.net/squirrel-sql/?rev=6460&view=rev
Author: gerdwagner
Date: 2011-10-09 14:55:13 +0000 (Sun, 09 Oct 2011)
Log Message:
-----------
Hibernate Plugin:
Fixed several bugs in the HQL results reading function concerning lazy loaded non collection attributes.
Hibernate Plugin:
HQL errors during results reading are now displayed as a result tab. (Similar to the new SQL error display.)
Modified Paths:
--------------
trunk/sql12/doc/src/main/resources/changes.txt
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/HQLPanelController.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/HibernateConnection.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateServerConnection.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateServerConnectionImpl.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ReflectionCaller.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/util/HibernateUtil.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/HibernatePropertyReader.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/ObjectResultController.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/QueryListCreator.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/QueryListCreatorListener.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/ResultDataSet.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/WaitPanel.java
trunk/sql12/plugins/hibernate/src/main/resources/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/I18NStrings.properties
Added Paths:
-----------
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateProxyHandler.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HqlQueryResult.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/util/HqlQueryErrorUtil.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/WaitPanelListener.java
Modified: trunk/sql12/doc/src/main/resources/changes.txt
===================================================================
--- trunk/sql12/doc/src/main/resources/changes.txt 2011-10-08 14:24:10 UTC (rev 6459)
+++ trunk/sql12/doc/src/main/resources/changes.txt 2011-10-09 14:55:13 UTC (rev 6460)
@@ -7,6 +7,9 @@
Enhancements:
+Hibernate Plugin:
+ HQL errors during results reading are now displayed as a result tab. (Similar to the new SQL error display.)
+
Some performance improvements, when searching in the object tree.
Now, Squirrel will not try to expand a node twice, if no children were found for a node at a previous search.
@@ -123,6 +126,9 @@
Bug-fixes:
+Hibernate Plugin:
+ Fixed several bugs in the HQL results reading function concerning lazy loaded non collection attributes.
+
3408086: Non ASCII characters are highlighted as as invalid characters at the SQL-Editor pane.
SQLScripts plugin:
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/HQLPanelController.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/HQLPanelController.java 2011-10-08 14:24:10 UTC (rev 6459)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/HQLPanelController.java 2011-10-09 14:55:13 UTC (rev 6460)
@@ -1,14 +1,13 @@
package net.sourceforge.squirrel_sql.plugins.hibernate;
import net.sourceforge.squirrel_sql.client.session.ISession;
-import net.sourceforge.squirrel_sql.fw.util.ExceptionFormatter;
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
-import net.sourceforge.squirrel_sql.fw.util.Utilities;
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
import net.sourceforge.squirrel_sql.fw.sql.IQueryTokenizer;
import net.sourceforge.squirrel_sql.fw.sql.QueryTokenizer;
+import net.sourceforge.squirrel_sql.plugins.hibernate.util.HqlQueryErrorUtil;
import javax.swing.*;
import java.awt.*;
@@ -18,8 +17,7 @@
public class HQLPanelController
{
- private static final StringManager s_stringMgr =
- StringManagerFactory.getStringManager(HQLPanelController.class);
+ private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(HQLPanelController.class);
private static ILogger s_log = LoggerController.createLogger(HQLPanelController.class);
@@ -71,51 +69,39 @@
private void onRunHQL()
{
- try
+ if (false == _runHQL.isEnabled())
{
- if (false == _runHQL.isEnabled())
- {
- return;
- }
+ return;
+ }
- String hql = _hqlEntryPanelManager.getEntryPanel().getSQLToBeExecuted();
+ String hql = _hqlEntryPanelManager.getEntryPanel().getSQLToBeExecuted();
- if (null == hql || 0 == hql.trim().length())
- {
- return;
- }
+ if (null == hql || 0 == hql.trim().length())
+ {
+ return;
+ }
- final IQueryTokenizer queryTokenizer = _sess.getQueryTokenizer();
- final String statementSeparator = queryTokenizer.getSQLStatementSeparator();
- final String startOfLineComment = queryTokenizer.getLineCommentBegin();
- QueryTokenizer qt = new QueryTokenizer(statementSeparator, startOfLineComment, true);
- qt.setScriptToTokenize(hql);
+ final IQueryTokenizer queryTokenizer = _sess.getQueryTokenizer();
+ final String statementSeparator = queryTokenizer.getSQLStatementSeparator();
+ final String startOfLineComment = queryTokenizer.getLineCommentBegin();
+ QueryTokenizer qt = new QueryTokenizer(statementSeparator, startOfLineComment, true);
+ qt.setScriptToTokenize(hql);
- while(qt.hasQuery())
- {
- String hqlQuery = qt.nextQuery();
- if(false == doSQL(hqlQuery))
- {
- continue;
- }
+ while (qt.hasQuery())
+ {
+ String hqlQuery = qt.nextQuery();
+ doSQL(hqlQuery);
- if (_hibernateTabController.isDisplayObjects())
- {
- doObjects(hqlQuery);
- }
+ if (_hibernateTabController.isDisplayObjects())
+ {
+ doObjects(hqlQuery);
}
-
}
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
}
private boolean doSQL(String hqlQuery)
- throws Exception
{
ArrayList<String> sqls;
@@ -132,26 +118,14 @@
_sess.getApplication().getMessageHandler().showMessage(s_stringMgr.getString("SQLPanelController.hqlToSqlSuccess", sqls.size(), duration));
return true;
}
- catch (Exception e)
+ catch (Throwable e)
{
- Throwable t = Utilities.getDeepestThrowable(e);
- ExceptionFormatter formatter = _sess.getExceptionFormatter();
- String message = formatter.format(t);
- _sess.showErrorMessage(message);
-
- if (_sess.getProperties().getWriteSQLErrorsToLog() ||
- (-1 == t.getClass().getName().toLowerCase().indexOf("hibernate") && -1 == t.getClass().getName().toLowerCase().indexOf("antlr")))
- {
- // If this is not a hibernate error we write a log entry
- s_log.error(t);
- }
-
+ HqlQueryErrorUtil.handleHqlQueryError(e, _sess, true);
return false;
}
}
- private void doObjects(String hqlQuery)
- throws Exception
+ private void doObjects(String hqlQuery)
{
_hibernateTabController.displayObjects(_con, hqlQuery);
}
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/HibernateConnection.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/HibernateConnection.java 2011-10-08 14:24:10 UTC (rev 6459)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/HibernateConnection.java 2011-10-09 14:55:13 UTC (rev 6460)
@@ -3,10 +3,7 @@
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
import net.sourceforge.squirrel_sql.plugins.hibernate.mapping.MappedClassInfo;
-import net.sourceforge.squirrel_sql.plugins.hibernate.server.HibernateServerConnection;
-import net.sourceforge.squirrel_sql.plugins.hibernate.server.HibernateSqlConnectionData;
-import net.sourceforge.squirrel_sql.plugins.hibernate.server.MappedClassInfoData;
-import net.sourceforge.squirrel_sql.plugins.hibernate.server.ServerMain;
+import net.sourceforge.squirrel_sql.plugins.hibernate.server.*;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
@@ -179,7 +176,7 @@
}
}
- public List createQueryList(String hqlQuery, int sqlNbrRowsToShow)
+ public HqlQueryResult createQueryList(String hqlQuery, int sqlNbrRowsToShow)
{
try
{
Added: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateProxyHandler.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateProxyHandler.java (rev 0)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateProxyHandler.java 2011-10-09 14:55:13 UTC (rev 6460)
@@ -0,0 +1,93 @@
+package net.sourceforge.squirrel_sql.plugins.hibernate.server;
+
+import java.lang.reflect.Field;
+import java.util.Collection;
+import java.util.HashSet;
+
+
+/**
+ * Needed to remove lazy loading non collection proxies. These proxies caused serialization
+ * problems when transferred from the external hibernate process.
+ */
+public class HibernateProxyHandler
+{
+ private ClassLoader _cl;
+ private ReflectionCaller _rc;
+
+ public HibernateProxyHandler(ClassLoader cl)
+ {
+ _cl = cl;
+ _rc = new ReflectionCaller();
+ }
+
+
+ public void prepareHibernateProxies(Collection col, HashSet<String> mappedClassNames)
+ {
+ HashSet doneObjs = new HashSet();
+ _prepareHibernateProxiesForCollection(col, mappedClassNames, doneObjs, true);
+ }
+
+ private void _prepareHibernateProxiesForCollection(Collection col, HashSet<String> mappedClassNames, HashSet doneObjs, boolean isQueryList)
+ {
+ try
+ {
+ if (null == col)
+ {
+ return;
+ }
+
+ boolean isInitialized = isQueryList ||
+ (Boolean) _rc.callStaticMethod(_cl, "org.hibernate.Hibernate", "isInitialized", new Class[]{Object.class}, new Object[]{col}).getCallee();
+
+ if (isInitialized)
+ {
+ for (Object o : col)
+ {
+ _prepareHibernateProxies(o, mappedClassNames, doneObjs);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private void _prepareHibernateProxies(Object o, HashSet<String> mappedClassNames, HashSet doneObjs) throws IllegalAccessException
+ {
+ if (null == o || doneObjs.contains(o))
+ {
+ return;
+ }
+
+ doneObjs.add(o);
+
+ Field[] declaredFields = o.getClass().getDeclaredFields();
+
+ for (Field declaredField : declaredFields)
+ {
+ if (mappedClassNames.contains(declaredField.getType().getName()))
+ {
+ declaredField.setAccessible(true);
+ Object fielddObj = declaredField.get(o);
+ if (null != fielddObj)
+ {
+ if (-1 < fielddObj.getClass().getName().indexOf('$'))
+ {
+ declaredField.set(o, null);
+ }
+ else
+ {
+ _prepareHibernateProxies(fielddObj, mappedClassNames, doneObjs);
+ }
+ }
+ }
+ else if (Collection.class.isAssignableFrom(declaredField.getType()))
+ {
+ declaredField.setAccessible(true);
+ Object fielddObj = declaredField.get(o);
+ _prepareHibernateProxiesForCollection((Collection) fielddObj, mappedClassNames, doneObjs, false);
+ }
+ }
+ }
+}
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateServerConnection.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateServerConnection.java 2011-10-08 14:24:10 UTC (rev 6459)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateServerConnection.java 2011-10-09 14:55:13 UTC (rev 6460)
@@ -25,7 +25,7 @@
throws RemoteException;
- List createQueryList(String hqlQuery, int sqlNbrRowsToShow)
+ HqlQueryResult createQueryList(String hqlQuery, int sqlNbrRowsToShow)
throws RemoteException;
}
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateServerConnectionImpl.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateServerConnectionImpl.java 2011-10-08 14:24:10 UTC (rev 6459)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateServerConnectionImpl.java 2011-10-09 14:55:13 UTC (rev 6460)
@@ -1,6 +1,5 @@
package net.sourceforge.squirrel_sql.plugins.hibernate.server;
-import java.net.URLClassLoader;
import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
@@ -13,6 +12,7 @@
private ClassLoader _cl;
private ArrayList<MappedClassInfoData> _mappedClassInfoData;
private ReflectionCaller m_rcHibernateSession;
+ private HashSet<String> _mappedClassNames;
HibernateServerConnectionImpl(Object sessionFactoryImpl, ClassLoader cl) throws RemoteException
@@ -114,6 +114,7 @@
}
_mappedClassInfoData = new ArrayList<MappedClassInfoData>();
+ _mappedClassNames = new HashSet<String>();
ReflectionCaller sessionFactoryImplcaller = new ReflectionCaller(_sessionFactoryImpl);
Collection<ReflectionCaller> persisters = sessionFactoryImplcaller.callMethod("getAllClassMetadata").callCollectionMethod("values");
@@ -175,6 +176,7 @@
}
}
_mappedClassInfoData.add(new MappedClassInfoData(mappedClass.getName(), tableName, identifierPropInfo, infos));
+ _mappedClassNames.add(mappedClass.getName());
}
}
@@ -195,18 +197,62 @@
}
@Override
- public List createQueryList(String hqlQuery, int sqlNbrRowsToShow)
+ public HqlQueryResult createQueryList(String hqlQuery, int sqlNbrRowsToShow)
{
- ReflectionCaller rc = getRcHibernateSession().callMethod("createQuery", hqlQuery);
+ HqlQueryResult ret = new HqlQueryResult();
- if (0 <= sqlNbrRowsToShow)
+ try
{
- rc = rc.callMethod("setMaxResults", new RCParam().add(sqlNbrRowsToShow, Integer.TYPE));
+ getRcHibernateSession().callMethod("getTransaction").callMethod("begin");
}
+ catch (Throwable t)
+ {
+ ret.putSessionAdminException("Exception occurced during call of Session.getTransaction().begin()", t);
+ }
- return (List) rc.callMethod("list").getCallee();
+ try
+ {
+ ReflectionCaller rc = getRcHibernateSession().callMethod("createQuery", hqlQuery);
+
+ if (0 <= sqlNbrRowsToShow)
+ {
+ rc = rc.callMethod("setMaxResults", new RCParam().add(sqlNbrRowsToShow, Integer.TYPE));
+ }
+
+ ret.setQueryResultList((List) rc.callMethod("list").getCallee());
+ }
+ catch (Throwable t)
+ {
+ ret.setExceptionOccuredWhenExecutingQuery(t);
+ }
+
+ try
+ {
+ getRcHibernateSession().callMethod("getTransaction").callMethod("rollback");
+ }
+ catch (Throwable t)
+ {
+ ret.putSessionAdminException("Exception occurced during call of Session.getTransaction().rollback()", t);
+ }
+
+ try
+ {
+ getRcHibernateSession().callMethod("clear");
+ }
+ catch (Throwable t)
+ {
+ ret.putSessionAdminException("Exception occurced during call of Session.clear()", t);
+ }
+
+ if (null != ret.getQueryResultList())
+ {
+ new HibernateProxyHandler(_cl).prepareHibernateProxies(ret.getQueryResultList(), _mappedClassNames);
+ }
+
+ return ret;
}
+
private ReflectionCaller getRcHibernateSession()
{
if(null == m_rcHibernateSession)
Added: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HqlQueryResult.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HqlQueryResult.java (rev 0)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HqlQueryResult.java 2011-10-09 14:55:13 UTC (rev 6460)
@@ -0,0 +1,43 @@
+package net.sourceforge.squirrel_sql.plugins.hibernate.server;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+
+public class HqlQueryResult implements Serializable
+{
+ private List _queryResultList;
+ private Throwable _exceptionOccuredWhenExecutingQuery;
+
+ private HashMap<String, Throwable> _sessionAdminExceptions = new HashMap<String, Throwable>();
+
+ public void putSessionAdminException(String msgKey, Throwable t)
+ {
+ _sessionAdminExceptions.put(msgKey, t);
+ }
+
+ public void setQueryResultList(List list)
+ {
+ _queryResultList = list;
+ }
+
+ public List getQueryResultList()
+ {
+ return _queryResultList;
+ }
+
+ public void setExceptionOccuredWhenExecutingQuery(Throwable exceptionOccuredWhenExecutingQuery)
+ {
+ _exceptionOccuredWhenExecutingQuery = exceptionOccuredWhenExecutingQuery;
+ }
+
+ public Throwable getExceptionOccuredWhenExecutingQuery()
+ {
+ return _exceptionOccuredWhenExecutingQuery;
+ }
+
+ public HashMap<String, Throwable> getSessionAdminExceptions()
+ {
+ return _sessionAdminExceptions;
+ }
+}
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ReflectionCaller.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ReflectionCaller.java 2011-10-08 14:24:10 UTC (rev 6459)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ReflectionCaller.java 2011-10-09 14:55:13 UTC (rev 6460)
@@ -205,4 +205,20 @@
}
+ public ReflectionCaller callStaticMethod(ClassLoader cl, String className, String methName, Class[] paramTypes, Object[] args)
+ {
+ try
+ {
+ Class<?> clazz = cl.loadClass(className);
+ Method method = clazz.getDeclaredMethod(methName, paramTypes);
+ method.setAccessible(true);
+ return new ReflectionCaller(method.invoke(clazz, args));
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+
}
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/util/HibernateUtil.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/util/HibernateUtil.java 2011-10-08 14:24:10 UTC (rev 6459)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/util/HibernateUtil.java 2011-10-09 14:55:13 UTC (rev 6460)
@@ -49,10 +49,12 @@
/** factory for creating FileWrappers which insulate the application from direct reference to File */
private static FileWrapperFactory fileWrapperFactory = new FileWrapperFactoryImpl();
-
-
- private static IOUtilities ioutils = new IOUtilitiesImpl();
-
+
+
+ private static IOUtilities ioutils = new IOUtilitiesImpl();
+ public static final String OBJECT_IS_NULL = "<object is null>";
+ public static final String UNITIALIZED_PERSISTENT_COLLECTION = "<unitialized persistent collection>";
+
public static XMLBeanReader createHibernateConfigsReader(HibernatePlugin plugin)
throws IOException, XMLException
{
Added: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/util/HqlQueryErrorUtil.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/util/HqlQueryErrorUtil.java (rev 0)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/util/HqlQueryErrorUtil.java 2011-10-09 14:55:13 UTC (rev 6460)
@@ -0,0 +1,44 @@
+package net.sourceforge.squirrel_sql.plugins.hibernate.util;
+
+import net.sourceforge.squirrel_sql.client.session.ISession;
+import net.sourceforge.squirrel_sql.fw.util.ExceptionFormatter;
+import net.sourceforge.squirrel_sql.fw.util.Utilities;
+import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
+import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
+import net.sourceforge.squirrel_sql.plugins.hibernate.HQLPanelController;
+
+public class HqlQueryErrorUtil
+{
+ private static ILogger s_log = LoggerController.createLogger(HqlQueryErrorUtil.class);
+
+
+ public static String handleHqlQueryError(Throwable e, ISession sess, boolean showInMessagePanel)
+ {
+ String ret = null;
+
+ Throwable t = Utilities.getDeepestThrowable(e);
+ ExceptionFormatter formatter = sess.getExceptionFormatter();
+ try
+ {
+ ret = formatter.format(t);
+ if (showInMessagePanel)
+ {
+ sess.showErrorMessage(ret);
+ }
+ }
+ catch (Exception e1)
+ {
+ sess.showErrorMessage(e1);
+ sess.showErrorMessage(t);
+ }
+
+ if (sess.getProperties().getWriteSQLErrorsToLog() ||
+ (-1 == t.getClass().getName().toLowerCase().indexOf("hibernate") && -1 == t.getClass().getName().toLowerCase().indexOf("antlr")))
+ {
+ // If this is not a hibernate error we write a log entry
+ s_log.error(t);
+ }
+
+ return ret;
+ }
+}
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/HibernatePropertyReader.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/HibernatePropertyReader.java 2011-10-08 14:24:10 UTC (rev 6459)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/HibernatePropertyReader.java 2011-10-09 14:55:13 UTC (rev 6460)
@@ -1,5 +1,6 @@
package net.sourceforge.squirrel_sql.plugins.hibernate.viewobjects;
+import net.sourceforge.squirrel_sql.plugins.hibernate.util.HibernateUtil;
import net.sourceforge.squirrel_sql.plugins.hibernate.viewobjects.PropertyAccessor;
import java.lang.reflect.Field;
@@ -15,7 +16,10 @@
{
_propertyName = propertyName;
_obj = obj;
- _propertyAccessor = getAccessor(_obj.getClass());
+ if (null != obj)
+ {
+ _propertyAccessor = getAccessor(_obj.getClass());
+ }
}
public String getName()
@@ -28,7 +32,14 @@
{
try
{
- return _propertyAccessor.get(_obj);
+ if (null == _propertyAccessor)
+ {
+ return HibernateUtil.OBJECT_IS_NULL;
+ }
+ else
+ {
+ return _propertyAccessor.get(_obj);
+ }
}
catch (Exception e)
{
@@ -86,13 +97,15 @@
public String getTypeName()
{
- return _propertyAccessor.getType().getName();
+ if (null == _propertyAccessor)
+ {
+ return HibernateUtil.OBJECT_IS_NULL;
+ }
+ else
+ {
+ return _propertyAccessor.getType().getName();
+ }
}
- public Class getType()
- {
- return _propertyAccessor.getType();
- }
-
}
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/ObjectResultController.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/ObjectResultController.java 2011-10-08 14:24:10 UTC (rev 6459)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/ObjectResultController.java 2011-10-09 14:55:13 UTC (rev 6460)
@@ -49,34 +49,49 @@
QueryListCreatorListener queryListCreatorListener = new QueryListCreatorListener()
{
@Override
- public void listRead(QueryListCreator queryListCreator)
+ public void queryExecuted(QueryListCreator queryListCreator)
{
- onListRead(queryListCreator);
+ onQueryExecuted(queryListCreator);
}
};
- WaitPanel waitPanel = new WaitPanel(hqlQuery);
+ WaitPanelListener waitPanelListener = new WaitPanelListener()
+ {
+ @Override
+ public void removeWaitPanel(WaitPanel waitPanel)
+ {
+ onCloseTab(waitPanel);
+ }
+ };
+
+ WaitPanel waitPanel = new WaitPanel(hqlQuery, _resource, waitPanelListener);
_objectResultTabbedPane.addTab(waitPanel.getTitle(), waitPanel);
_objectResultTabbedPane.setSelectedComponent(waitPanel);
new QueryListCreator(queryListCreatorListener, hqlQuery, maxNumResults, con, _session, waitPanel).execute();
}
- private void onListRead(QueryListCreator queryListCreator)
+ private void onQueryExecuted(QueryListCreator queryListCreator)
{
+ removeOldErrorPanel(queryListCreator.getWaitPanel());
+ if (queryListCreator.getWaitPanel().isDisplayingError())
+ {
+ return;
+ }
+
for (int i = 0; i < _objectResultTabbedPane.getTabCount(); i++)
{
- if(_objectResultTabbedPane.getComponentAt(i) == queryListCreator.getWaitPanel())
+ if (_objectResultTabbedPane.getComponentAt(i) == queryListCreator.getWaitPanel())
{
_objectResultTabbedPane.removeTabAt(i);
break;
}
}
-
+
List list = queryListCreator.getList();
- if(null == list)
+ if (null == list)
{
return;
}
@@ -86,7 +101,7 @@
@Override
public void closeTab(ObjectResultTabController toClose)
{
- onCloseTab(toClose);
+ onCloseTab(toClose.getPanel());
}
};
@@ -102,12 +117,26 @@
_objectResultTabbedPane.setSelectedComponent(ortc.getPanel());
}
+ private void removeOldErrorPanel(WaitPanel currentWaitPanel)
+ {
+ for (int i = 0; i < _objectResultTabbedPane.getTabCount(); i++)
+ {
+ if (currentWaitPanel != _objectResultTabbedPane.getComponentAt(i)
+ && _objectResultTabbedPane.getComponentAt(i) instanceof WaitPanel
+ && ((WaitPanel) _objectResultTabbedPane.getComponentAt(i)).isDisplayingError())
+ {
+ _objectResultTabbedPane.removeTabAt(i);
+ break;
+ }
+ }
+ }
- private void onCloseTab(ObjectResultTabController toClose)
+
+ private void onCloseTab(JPanel panel)
{
for (int i = 0; i < _objectResultTabbedPane.getTabCount(); i++)
{
- if(_objectResultTabbedPane.getComponentAt(i) == toClose.getPanel())
+ if(_objectResultTabbedPane.getComponentAt(i) == panel)
{
_objectResultTabbedPane.removeTabAt(i);
break;
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/QueryListCreator.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/QueryListCreator.java 2011-10-08 14:24:10 UTC (rev 6459)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/QueryListCreator.java 2011-10-09 14:55:13 UTC (rev 6460)
@@ -8,14 +8,16 @@
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
import net.sourceforge.squirrel_sql.plugins.hibernate.HibernateConnection;
+import net.sourceforge.squirrel_sql.plugins.hibernate.server.HqlQueryResult;
+import net.sourceforge.squirrel_sql.plugins.hibernate.util.HqlQueryErrorUtil;
import javax.swing.*;
import java.util.List;
-public class QueryListCreator extends SwingWorker
+public class QueryListCreator extends SwingWorker<HqlQueryResult, Object>
{
- private static ILogger s_log = LoggerController.createLogger(ObjectResultController.class);
+ private static ILogger s_log = LoggerController.createLogger(QueryListCreator.class);
private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(QueryListCreator.class);
@@ -26,7 +28,7 @@
private ISession _session;
private WaitPanel _waitPanel;
private volatile long _duration;
- private List _list;
+ private HqlQueryResult _hqlQueryResult;
public QueryListCreator(QueryListCreatorListener queryListCreatorListener,
String hqlQuery,
@@ -44,12 +46,13 @@
}
@Override
- protected Object doInBackground() throws Exception
+ protected HqlQueryResult doInBackground()
{
+ // Note: if an exception occurs here it will be thrown from the call to get() in method done() below.
long begin = System.currentTimeMillis();
- List ret = _con.createQueryList(_hqlQuery, _maxNumResults);
+ HqlQueryResult queryRes = _con.createQueryList(_hqlQuery, _maxNumResults);
_duration = System.currentTimeMillis() - begin;
- return ret;
+ return queryRes;
}
@@ -58,39 +61,43 @@
{
try
{
- _list = (List) get();
- _session.getApplication().getMessageHandler().showMessage(s_stringMgr.getString("ObjectResultController.hqlReadObjectsSuccess", _list.size(), _duration));
- }
- catch (Exception e)
- {
- Throwable t = Utilities.getDeepestThrowable(e);
- ExceptionFormatter formatter = _session.getExceptionFormatter();
- try
+ _hqlQueryResult = get();
+
+ for (String msgKey : _hqlQueryResult.getSessionAdminExceptions().keySet())
{
- String message = formatter.format(t);
- _session.showErrorMessage(message);
+ s_log.error(msgKey, _hqlQueryResult.getSessionAdminExceptions().get(msgKey));
}
- catch (Exception e1)
+
+ if (null != _hqlQueryResult.getExceptionOccuredWhenExecutingQuery())
{
- _session.showErrorMessage(e1);
- _session.showErrorMessage(t);
+ // Maybe this error should be displayed as an error result tab like it is done for SQL errors.
+ _waitPanel.displayHqlQueryError(HqlQueryErrorUtil.handleHqlQueryError(_hqlQueryResult.getExceptionOccuredWhenExecutingQuery(), _session, false));
+ return;
}
- if (_session.getProperties().getWriteSQLErrorsToLog() ||
- (-1 == t.getClass().getName().toLowerCase().indexOf("hibernate") && -1 == t.getClass().getName().toLowerCase().indexOf("antlr")))
+ if (null == _hqlQueryResult.getQueryResultList())
{
- // If this is not a hibernate error we write a log entry
- s_log.error(t);
+ s_log.error(new NullPointerException("HqlQueryResult didn't contain a resultlist although it should according to its error state."));
}
+ else
+ {
+ _session.getApplication().getMessageHandler().showMessage(s_stringMgr.getString("ObjectResultController.hqlReadObjectsSuccess", _hqlQueryResult.getQueryResultList().size(), _duration));
+ }
}
-
- _queryListCreatorListener.listRead(this);
-
+ catch (Throwable t)
+ {
+ s_log.error(t);
+ _waitPanel.displayError(t);
+ }
+ finally
+ {
+ _queryListCreatorListener.queryExecuted(this);
+ }
}
public List getList()
{
- return _list;
+ return _hqlQueryResult.getQueryResultList();
}
public int getMaxNumResults()
@@ -112,50 +119,4 @@
{
return _waitPanel;
}
-
-
-
-// private List readObjects(HibernateServerConnectionImpl con, String hqlQuery, int sqlLimitRows)
-// {
-// long begin = System.currentTimeMillis();
-// long duration;
-// try
-// {
-// List objects;
-//
-// objects = con.createQueryList(hqlQuery, sqlLimitRows);
-//
-// duration = System.currentTimeMillis() - begin;
-//
-//
-// _session.getApplication().getMessageHandler().showMessage(s_stringMgr.getString("ObjectResultController.hqlReadObjectsSuccess", objects.size(), duration));
-//
-// return objects;
-// }
-// catch (Exception e)
-// {
-// Throwable t = Utilities.getDeepestThrowable(e);
-// ExceptionFormatter formatter = _session.getExceptionFormatter();
-// try
-// {
-// String message = formatter.format(t);
-// _session.showErrorMessage(message);
-// }
-// catch (Exception e1)
-// {
-// _session.showErrorMessage(e1);
-// _session.showErrorMessage(t);
-// }
-//
-// if (_session.getProperties().getWriteSQLErrorsToLog() ||
-// (-1 == t.getClass().getName().toLowerCase().indexOf("hibernate") && -1 == t.getClass().getName().toLowerCase().indexOf("antlr")))
-// {
-// // If this is not a hibernate error we write a log entry
-// s_log.error(t);
-// }
-//
-// return null;
-// }
-// }
-
}
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/QueryListCreatorListener.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/QueryListCreatorListener.java 2011-10-08 14:24:10 UTC (rev 6459)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/QueryListCreatorListener.java 2011-10-09 14:55:13 UTC (rev 6460)
@@ -1,8 +1,6 @@
package net.sourceforge.squirrel_sql.plugins.hibernate.viewobjects;
-import java.util.List;
-
public interface QueryListCreatorListener
{
- public void listRead(QueryListCreator queryListCreator);
+ public void queryExecuted(QueryListCreator queryListCreator);
}
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/ResultDataSet.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/ResultDataSet.java 2011-10-08 14:24:10 UTC (rev 6459)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/ResultDataSet.java 2011-10-09 14:55:13 UTC (rev 6460)
@@ -8,14 +8,15 @@
import net.sourceforge.squirrel_sql.plugins.hibernate.mapping.MappedClassInfo;
import net.sourceforge.squirrel_sql.plugins.hibernate.server.ReflectionCaller;
import net.sourceforge.squirrel_sql.plugins.hibernate.mapping.PropertyInfo;
+import net.sourceforge.squirrel_sql.plugins.hibernate.util.HibernateUtil;
import java.util.ArrayList;
public class ResultDataSet implements IDataSet
{
- private static final int DISPLAY_WIDTH = 20;
+ private static final int DISPLAY_WIDTH = 20;
- private int _curIx = -1;
+ private int _curIx = -1;
private ColumnDisplayDefinition[] _columnDisplayDefinitions;
private SingleType _singleType;
@@ -55,7 +56,7 @@
if(null == obj)
{
- return "<object is null>";
+ return HibernateUtil.OBJECT_IS_NULL;
}
HibernatePropertyReader hpr = new HibernatePropertyReader(_columnDisplayDefinitions[columnIndex].getColumnName(), obj);
@@ -70,9 +71,9 @@
{
boolean wasInitialized = (Boolean) new ReflectionCaller(value).callMethod("wasInitialized").getCallee();
- if(false == wasInitialized)
+ if (false == wasInitialized)
{
- return "<unitialized persistent collection>";
+ return HibernateUtil.UNITIALIZED_PERSISTENT_COLLECTION;
}
}
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/WaitPanel.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/WaitPanel.java 2011-10-08 14:24:10 UTC (rev 6459)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/WaitPanel.java 2011-10-09 14:55:13 UTC (rev 6460)
@@ -1,36 +1,103 @@
package net.sourceforge.squirrel_sql.plugins.hibernate.viewobjects;
+import com.jidesoft.swing.MultilineLabel;
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
+import net.sourceforge.squirrel_sql.plugins.hibernate.HibernatePluginResources;
import javax.swing.*;
import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
public class WaitPanel extends JPanel
{
- private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(ObjectResultController.class);
+ private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(WaitPanel.class);
+ private MultilineLabel _label;
+ private boolean _isDisplayingError;
+ private JButton _btnClose;
+ private WaitPanelListener _waitPanelListener;
- public WaitPanel(String hqlQuery)
+ public WaitPanel(String hqlQuery, HibernatePluginResources resource, WaitPanelListener waitPanelListener)
{
- setLayout(new GridBagLayout());
+ this._waitPanelListener = waitPanelListener;
+ setLayout(new BorderLayout());
- GridBagConstraints gbc = new GridBagConstraints();
+ add(createCloseButtonPanel(resource), BorderLayout.NORTH);
- gbc.anchor = GridBagConstraints.WEST;
- gbc.insets = new Insets(5, 10, 5, 10);
- gbc.gridx = 0;
- gbc.gridy = 0;
+ add(createLabelPanel(hqlQuery), BorderLayout.CENTER);
+ }
- add(new JLabel(s_stringMgr.getString("WaitPanel.hqlLabel")), gbc);
+ private JPanel createLabelPanel(String hqlQuery)
+ {
+ JPanel ret = new JPanel(new GridBagLayout());
- gbc.weightx = 1;
- ++gbc.gridx;
- add(new JLabel(hqlQuery), gbc);
+ GridBagConstraints gbc;
+ gbc = new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 10, 5, 10), 0, 0);
+ ret.add(new JLabel(s_stringMgr.getString("WaitPanel.hqlLabel")), gbc);
+
+ gbc = new GridBagConstraints(1, 0, 1, 1, 1, 1, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 10, 5, 10), 0, 0);
+ _label = new MultilineLabel(hqlQuery);
+ ret.add(_label, gbc);
+
+ return ret;
}
+ private JPanel createCloseButtonPanel(HibernatePluginResources resource)
+ {
+ JPanel ret = new JPanel(new BorderLayout());
+
+ ret.add(new JPanel(), BorderLayout.CENTER);
+
+ _btnClose = new JButton(resource.getIcon(HibernatePluginResources.IKeys.CLOSE_IMAGE));
+
+ _btnClose.setMargin(new Insets(0, 0, 0, 0));
+ _btnClose.setBorderPainted(false);
+
+ _btnClose.setVisible(false);
+ ret.add(_btnClose, BorderLayout.EAST);
+
+ _btnClose.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ _waitPanelListener.removeWaitPanel(WaitPanel.this);
+ }
+ });
+
+ return ret;
+ }
+
public String getTitle()
{
return s_stringMgr.getString("WaitPanel.title");
}
+
+ public boolean isDisplayingError()
+ {
+ return _isDisplayingError;
+ }
+
+ public void displayError(Throwable t)
+ {
+ prepareForErrorDisplay();
+ _label.setText(s_stringMgr.getString("WaitPanel.errorOccured", t.getMessage()));
+ }
+
+ public void displayHqlQueryError(String errMsg)
+ {
+ prepareForErrorDisplay();
+ _label.setText(s_stringMgr.getString("WaitPanel.hqlErrorOccured", errMsg));
+ }
+
+ private void prepareForErrorDisplay()
+ {
+ _label.setBackground(Color.white);
+ _label.setForeground(Color.red);
+ _label.setFont(_label.getFont().deriveFont(Font.BOLD));
+ _btnClose.setVisible(true);
+ _isDisplayingError = true;
+ }
}
Added: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/WaitPanelListener.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/WaitPanelListener.java (rev 0)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/WaitPanelListener.java 2011-10-09 14:55:13 UTC (rev 6460)
@@ -0,0 +1,6 @@
+package net.sourceforge.squirrel_sql.plugins.hibernate.viewobjects;
+
+public interface WaitPanelListener
+{
+ void removeWaitPanel(WaitPanel waitPanel);
+}
Modified: trunk/sql12/plugins/hibernate/src/main/resources/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/I18NStrings.properties
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/resources/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/I18NStrings.properties 2011-10-08 14:24:10 UTC (rev 6459)
+++ trunk/sql12/plugins/hibernate/src/main/resources/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/I18NStrings.properties 2011-10-09 14:55:13 UTC (rev 6460)
@@ -25,4 +25,8 @@
Childern of this node display data of a mapped class in a table.\
The rows of a table match the tree nodes in the tree representation with respect to the tree hierarchy.\n\n\
Note: To redisplay this message hold ctrl and click the selected node of the meta data tree.\n\n\
- HQL query:\n{0}
\ No newline at end of file
+ HQL query:\n{0}
+
+
+WaitPanel.errorOccured=Unexpected error occured while executing hql statement:\n{0}\n\nSee logs for details.
+WaitPanel.hqlErrorOccured=Error in hql query:\n{0}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|