[Squirrel-sql-commits] SF.net SVN: squirrel-sql:[6562] trunk/sql12
A Java SQL client for any JDBC compliant database
Brought to you by:
colbell,
gerdwagner
From: <ger...@us...> - 2012-01-23 18:53:20
|
Revision: 6562 http://squirrel-sql.svn.sourceforge.net/squirrel-sql/?rev=6562&view=rev Author: gerdwagner Date: 2012-01-23 18:53:11 +0000 (Mon, 23 Jan 2012) Log Message: ----------- Hibernate Plugin: On Windows the class path's files defined in the Hibernate configuration would remain locked even after disconnecting Hibernate. This doesn't happen anymore when Hibernate is run in its own process. Modified Paths: -------------- trunk/sql12/doc/src/main/resources/changes.txt 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/HibernateConnectionFactory.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/HqlQueryResult.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/IntraVmConnectionFactory.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/RCParam.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/server/ServerMainImpl.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/CommandLineOutput.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/ObjectResultTabController.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/PersistentCollectionResult.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/PrimitiveValue.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/ResultDataSet.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/ResultsController.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/RootResultController.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/RootType.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/SingleResult.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/SingleType.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/TupelResult.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/TupelResultController.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/TupelType.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/ViewObjectsUtil.java Added Paths: ----------- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ObjectSubstitute.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ObjectSubstituteFactory.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ObjectSubstituteRoot.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/PropertyAccessor.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/PropertySubstitute.java trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/SquirrelHibernateServerException.java Removed 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/viewobjects/PropertyAccessor.java Modified: trunk/sql12/doc/src/main/resources/changes.txt =================================================================== --- trunk/sql12/doc/src/main/resources/changes.txt 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/doc/src/main/resources/changes.txt 2012-01-23 18:53:11 UTC (rev 6562) @@ -6,6 +6,11 @@ Enhancements: +Hibernate Plugin: + On Windows the class path's files defined in the Hibernate configuration would remain locked even + after disconnecting Hibernate. This doesn't happen anymore when Hibernate is run in its own process. + + Graph Plugin: Tables can be added to a Graph from within the SQL-Editor (accessible from right mouse menu and tools popup). 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 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/HibernateConnection.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -151,19 +151,6 @@ } - public Class getPersistenCollectionClass() - { - try - { - return _hibernateServerConnection.getPersistenCollectionClass(); - } - catch (Exception e) - { - throw new RuntimeException(e); - - } - } - public HibernateSqlConnectionData getHibernateSqlConnectionData() { try Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/HibernateConnectionFactory.java =================================================================== --- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/HibernateConnectionFactory.java 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/HibernateConnectionFactory.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -26,7 +26,7 @@ else { final IntraVmConnectionFactory intraVmConnectionFactory = new IntraVmConnectionFactory(); - return new HibernateConnection(intraVmConnectionFactory.createHibernateConnection(cfg), false, null, cfg.isEndProcessOnDisconnect()); + return new HibernateConnection(intraVmConnectionFactory.createHibernateConnection(cfg, false), false, null, cfg.isEndProcessOnDisconnect()); } } Deleted: 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 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateProxyHandler.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -1,104 +0,0 @@ -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) - { - if(o instanceof Object[]) - { - Object[] arr = (Object[]) o; - for (Object entry : arr) - { - _prepareHibernateProxies(entry, mappedClassNames, doneObjs); - } - } - else - { - _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 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateServerConnection.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -17,10 +17,6 @@ throws RemoteException; - Class getPersistenCollectionClass() - throws RemoteException; - - HibernateSqlConnectionData getHibernateSqlConnectionData() 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 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateServerConnectionImpl.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -1,5 +1,7 @@ package net.sourceforge.squirrel_sql.plugins.hibernate.server; +import java.io.PrintWriter; +import java.io.StringWriter; import java.rmi.RemoteException; import java.sql.Connection; import java.sql.DatabaseMetaData; @@ -10,15 +12,22 @@ { private Object _sessionFactoryImpl; private ClassLoader _cl; - private ArrayList<MappedClassInfoData> _mappedClassInfoData; + private boolean _server; + +// private ArrayList<MappedClassInfoData> _mappedClassInfoData; +// private HashSet<String> _mappedClassNames; + + private HashMap<String, MappedClassInfoData> _infoDataByClassName; + + private ReflectionCaller m_rcHibernateSession; - private HashSet<String> _mappedClassNames; - HibernateServerConnectionImpl(Object sessionFactoryImpl, ClassLoader cl) throws RemoteException + HibernateServerConnectionImpl(Object sessionFactoryImpl, ClassLoader cl, boolean isServer) throws RemoteException { _sessionFactoryImpl = sessionFactoryImpl; _cl = cl; + _server = isServer; } @@ -76,7 +85,7 @@ { _sessionFactoryImpl = null; _cl = null; - _mappedClassInfoData = null; + _infoDataByClassName = null; System.gc(); if(null != reThrow) @@ -90,31 +99,17 @@ public ArrayList<MappedClassInfoData> getMappedClassInfoData() { initMappedClassInfos(); - return _mappedClassInfoData; + return new ArrayList<MappedClassInfoData>(_infoDataByClassName.values()); } - @Override - public Class getPersistenCollectionClass() - { - try - { - return _cl.loadClass("org.hibernate.collection.PersistentCollection"); - } - catch (ClassNotFoundException e) - { - throw new RuntimeException(e); - } - } - private void initMappedClassInfos() { - if(null != _mappedClassInfoData) + if(null != _infoDataByClassName) { return; } - _mappedClassInfoData = new ArrayList<MappedClassInfoData>(); - _mappedClassNames = new HashSet<String>(); + _infoDataByClassName = new HashMap<String, MappedClassInfoData>(); ReflectionCaller sessionFactoryImplcaller = new ReflectionCaller(_sessionFactoryImpl); Collection<ReflectionCaller> persisters = sessionFactoryImplcaller.callMethod("getAllClassMetadata").callCollectionMethod("values"); @@ -171,12 +166,11 @@ } else { - throw e; + throw (RuntimeException)prepareTransport(e); } } } - _mappedClassInfoData.add(new MappedClassInfoData(mappedClass.getName(), tableName, identifierPropInfo, infos)); - _mappedClassNames.add(mappedClass.getName()); + _infoDataByClassName.put(mappedClass.getName(), new MappedClassInfoData(mappedClass.getName(), tableName, identifierPropInfo, infos)); } } @@ -201,13 +195,15 @@ { HqlQueryResult ret = new HqlQueryResult(); + List queryResList = null; + try { getRcHibernateSession().callMethod("getTransaction").callMethod("begin"); } catch (Throwable t) { - ret.putSessionAdminException("Exception occurced during call of Session.getTransaction().begin()", t); + ret.putSessionAdminException("Exception occurced during call of Session.getTransaction().begin()", prepareTransport(t)); } try @@ -219,11 +215,11 @@ rc = rc.callMethod("setMaxResults", new RCParam().add(sqlNbrRowsToShow, Integer.TYPE)); } - ret.setQueryResultList((List) rc.callMethod("list").getCallee()); + queryResList = (List) rc.callMethod("list").getCallee(); } catch (Throwable t) { - ret.setExceptionOccuredWhenExecutingQuery(t); + ret.setExceptionOccuredWhenExecutingQuery(prepareTransport(t)); } try @@ -232,7 +228,7 @@ } catch (Throwable t) { - ret.putSessionAdminException("Exception occurced during call of Session.getTransaction().rollback()", t); + ret.putSessionAdminException("Exception occurced during call of Session.getTransaction().rollback()", prepareTransport(t)); } try @@ -241,18 +237,40 @@ } catch (Throwable t) { - ret.putSessionAdminException("Exception occurced during call of Session.clear()", t); + ret.putSessionAdminException("Exception occurced during call of Session.clear()", prepareTransport(t)); } - if (null != ret.getQueryResultList()) + if (null != queryResList) { - new HibernateProxyHandler(_cl).prepareHibernateProxies(ret.getQueryResultList(), _mappedClassNames); + ret.setQueryResultList( + new ObjectSubstituteFactory(_cl).replaceObjectsWithSubstitutes(queryResList, _infoDataByClassName)); } return ret; } + private Throwable prepareTransport(Throwable t) + { + if(false == _server) + { + return t; + } + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + + Throwable deepestThrowable = getDeepestThrowable(t); + deepestThrowable.printStackTrace(pw); + + pw.flush(); + sw.flush(); + + String messageIncludingOriginalStackTrace = "Exception occured on Hibernate Server Process: " + t.getMessage() + "\n" + sw.toString(); + + return new SquirrelHibernateServerException(messageIncludingOriginalStackTrace, deepestThrowable.getMessage(), deepestThrowable.getClass().getName()); + } + + private ReflectionCaller getRcHibernateSession() { if(null == m_rcHibernateSession) @@ -277,6 +295,4 @@ return parent; } - - } Modified: 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 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HqlQueryResult.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -6,7 +6,7 @@ public class HqlQueryResult implements Serializable { - private List _queryResultList; + private List<ObjectSubstituteRoot> _queryResultList; private Throwable _exceptionOccuredWhenExecutingQuery; private HashMap<String, Throwable> _sessionAdminExceptions = new HashMap<String, Throwable>(); @@ -16,12 +16,12 @@ _sessionAdminExceptions.put(msgKey, t); } - public void setQueryResultList(List list) + public void setQueryResultList(List<ObjectSubstituteRoot> list) { _queryResultList = list; } - public List getQueryResultList() + public List<ObjectSubstituteRoot> getQueryResultList() { return _queryResultList; } Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/IntraVmConnectionFactory.java =================================================================== --- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/IntraVmConnectionFactory.java 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/IntraVmConnectionFactory.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -7,7 +7,7 @@ public class IntraVmConnectionFactory { - public HibernateServerConnection createHibernateConnection(HibernateConfiguration cfg) + public HibernateServerConnection createHibernateConnection(HibernateConfiguration cfg, boolean isServer) { try { @@ -47,7 +47,7 @@ Thread.currentThread().setContextClassLoader(null); - return new HibernateServerConnectionImpl(sessionFactoryImpl, cl); + return new HibernateServerConnectionImpl(sessionFactoryImpl, cl, isServer); } catch (Exception e) { Added: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ObjectSubstitute.java =================================================================== --- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ObjectSubstitute.java (rev 0) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ObjectSubstitute.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -0,0 +1,77 @@ +package net.sourceforge.squirrel_sql.plugins.hibernate.server; + +import java.io.Serializable; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; + +public class ObjectSubstitute implements Serializable +{ + private HashMap<String, PropertySubstitute> _substituteValueByPropertyName = new HashMap<String, PropertySubstitute>(); + private MappedClassInfoData _mappedClassInfoData; + private String _toString; + + /** + * Is seriously meant to be package visible because it must not called nowhere except during initialzation in ObjectSubstituteFactory + */ + ObjectSubstitute(MappedClassInfoData mappedClassInfoData, String toString) + { + _mappedClassInfoData = mappedClassInfoData; + _toString = toString; + } + + void putSubstituteValueByPropertyName(String propertyName, PropertySubstitute propertySubstitute) + { + _substituteValueByPropertyName.put(propertyName, propertySubstitute); + } + + public String getClassName() + { + return _mappedClassInfoData.getMappedClassName(); + } + + /** + * @return May return ObjectSubstitute or plain primitive mapped value + */ + public Object getValue(String propertyName) + { + return _substituteValueByPropertyName.get(propertyName).getSingleValue(); + } + + public String getTypeName(String propertyName) + { + return _substituteValueByPropertyName.get(propertyName).getHibernatePropertyInfo().getClassName(); + } + + public boolean wasInitialized(String propertyName) + { + return _substituteValueByPropertyName.get(propertyName).isInitialized(); + } + + public Collection<? extends ObjectSubstitute> getPersistentCollection(String propertyName) + { + return _substituteValueByPropertyName.get(propertyName).getObjectSubstituteCollection(); + } + + public boolean isPersistenCollection(String propertyName) + { + return _substituteValueByPropertyName.get(propertyName).isPersistenCollection(); + } + + public boolean isNull(String propertyName) + { + return _substituteValueByPropertyName.get(propertyName).isNull(); //To change body of created methods use File | Settings | File Templates. + } + + public HibernatePropertyInfo getHibernatePropertyInfo(String propertyName) + { + return _substituteValueByPropertyName.get(propertyName).getHibernatePropertyInfo(); + } + + @Override + public String toString() + { + return _toString; + } +} Copied: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ObjectSubstituteFactory.java (from rev 6557, 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/ObjectSubstituteFactory.java (rev 0) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ObjectSubstituteFactory.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -0,0 +1,192 @@ +package net.sourceforge.squirrel_sql.plugins.hibernate.server; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; + + +/** + * Needed to remove lazy loading non collection proxies. These proxies caused serialization + * problems when transferred from the external hibernate process. + */ +public class ObjectSubstituteFactory +{ + private ClassLoader _cl; + private ReflectionCaller _rc; + + public ObjectSubstituteFactory(ClassLoader cl) + { + _cl = cl; + _rc = new ReflectionCaller(); + } + + + public ArrayList<ObjectSubstituteRoot> replaceObjectsWithSubstitutes(Collection col, HashMap<String, MappedClassInfoData> infoDataByClassName) + { + try + { + HashMap<Object, ObjectSubstitute> doneObjs = new HashMap<Object, ObjectSubstitute>(); + + if (null == col) + { + return null; + } + + + ArrayList<ObjectSubstituteRoot> ret = new ArrayList<ObjectSubstituteRoot>(); + for (Object o : col) + { + ObjectSubstituteRoot buf; + + if(o instanceof Object[]) + { + ArrayList<ObjectSubstitute> arrBuf = new ArrayList<ObjectSubstitute>(); + Object[] arr = (Object[]) o; + for (Object entry : arr) + { + arrBuf.add(_prepareObjectSubstitute(entry, infoDataByClassName, doneObjs)); + } + buf = new ObjectSubstituteRoot(arrBuf); + } + else + { + buf = new ObjectSubstituteRoot(_prepareObjectSubstitute(o, infoDataByClassName, doneObjs)); + } + + ret.add(buf); + } + return ret; + } + catch (IllegalAccessException e) + { + throw new RuntimeException(e); + } + + } + + private ArrayList<ObjectSubstitute> _prepareObjectSubstitutesForCollection(Collection col, HashMap<String, MappedClassInfoData> infoDataByClassName, HashMap<Object, ObjectSubstitute> doneObjs) + { + try + { + + ArrayList<ObjectSubstitute> ret = new ArrayList<ObjectSubstitute>(); + if (isInitialized(col)) + { + for (Object o : col) + { + ret.add(_prepareObjectSubstitute(o, infoDataByClassName, doneObjs)); + } + } + return ret; + + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } + + private ObjectSubstitute _prepareObjectSubstitute(Object o, HashMap<String, MappedClassInfoData> infoDataByClassName, HashMap<Object, ObjectSubstitute> doneObjs) throws IllegalAccessException + { + if (null == o) + { + return null; + } + + ObjectSubstitute ret = doneObjs.get(o); + if (null != ret) + { + return ret; + } + + MappedClassInfoData mappedClassInfoData = infoDataByClassName.get(o.getClass().getName()); + + ret = new ObjectSubstitute(mappedClassInfoData, o.toString()); + doneObjs.put(o, ret); + + PropertyAccessor pkAccessor = PropertyAccessor.createAccessor(o.getClass(), mappedClassInfoData.getIndentifierHibernatePropertyInfo().getPropertyName()); + PropertySubstitute pkPropertySubstitute = new PropertySubstitute(mappedClassInfoData.getIndentifierHibernatePropertyInfo(), pkAccessor.get(o), true); + ret.putSubstituteValueByPropertyName(mappedClassInfoData.getIndentifierHibernatePropertyInfo().getPropertyName(), pkPropertySubstitute); + + + + for (HibernatePropertyInfo hibernatePropertyInfo : mappedClassInfoData.getHibernatePropertyInfos()) + { + PropertyAccessor accessor = PropertyAccessor.createAccessor(o.getClass(), hibernatePropertyInfo.getPropertyName()); + + if( null == hibernatePropertyInfo.getCollectionClassName() ) + { + + MappedClassInfoData propMappedClassInfoData = infoDataByClassName.get(hibernatePropertyInfo.getClassName()); + if(null == propMappedClassInfoData) + { + PropertySubstitute propertySubstitute = new PropertySubstitute(hibernatePropertyInfo, accessor.get(o), true); + ret.putSubstituteValueByPropertyName(hibernatePropertyInfo.getPropertyName(), propertySubstitute); + } + else + { + if(isInitialized(accessor.get(o))) + { + ObjectSubstitute objectSubstitute = _prepareObjectSubstitute(accessor.get(o), infoDataByClassName, doneObjs); + PropertySubstitute propertySubstitute = new PropertySubstitute(hibernatePropertyInfo, objectSubstitute, true); + ret.putSubstituteValueByPropertyName(hibernatePropertyInfo.getPropertyName(), propertySubstitute); + } + else + { + PropertySubstitute propertySubstitute = new PropertySubstitute(hibernatePropertyInfo, (ObjectSubstitute)null, false); + ret.putSubstituteValueByPropertyName(hibernatePropertyInfo.getPropertyName(), propertySubstitute); + } + } + } + else + { + ArrayList<ObjectSubstitute> objectSubstituteCollection = new ArrayList<ObjectSubstitute>(); + + Collection col = (Collection) accessor.get(o); + if (isInitialized(col)) + { + objectSubstituteCollection = _prepareObjectSubstitutesForCollection(col, infoDataByClassName, doneObjs); + } + + PropertySubstitute propertySubstitute = new PropertySubstitute(hibernatePropertyInfo, objectSubstituteCollection, isInitialized(col)); + ret.putSubstituteValueByPropertyName(hibernatePropertyInfo.getPropertyName(), propertySubstitute); + } + } + +// Field[] declaredFields = o.getClass().getDeclaredFields(); +// for (Field declaredField : declaredFields) +// { +// if (infoDataByClassName.containsKey(declaredField.getType().getName())) +// { +// declaredField.setAccessible(true); +// Object fielddObj = declaredField.get(o); +// if (null != fielddObj) +// { +// if (-1 < fielddObj.getClass().getName().indexOf('$')) +// { +// ret.set(declaredField, null); +// //declaredField.set(o, null); +// } +// else +// { +// ret.set(declaredField, _prepareObjectSubstitutes(fielddObj, infoDataByClassName, doneObjs)); +// } +// } +// } +// else if (Collection.class.isAssignableFrom(declaredField.getType())) +// { +// declaredField.setAccessible(true); +// Object fielddObj = declaredField.get(o); +// ret.setList(declaredField, _prepareObjectSubstitutesForCollection((Collection) fielddObj, infoDataByClassName, doneObjs, false)); +// } +// } + + return ret; + } + + private Boolean isInitialized(Object obj) + { + return (Boolean) _rc.callStaticMethod(_cl, "org.hibernate.Hibernate", "isInitialized", new Class[]{Object.class}, new Object[]{obj}).getCallee(); + } + +} Added: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ObjectSubstituteRoot.java =================================================================== --- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ObjectSubstituteRoot.java (rev 0) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ObjectSubstituteRoot.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -0,0 +1,58 @@ +package net.sourceforge.squirrel_sql.plugins.hibernate.server; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class ObjectSubstituteRoot implements Serializable +{ + private ArrayList<ObjectSubstitute> _objectSubstituteArray; + private ObjectSubstitute _objectSubstitute; + + public ObjectSubstituteRoot(ArrayList<ObjectSubstitute> objectSubstituteArray) + { + _objectSubstituteArray = objectSubstituteArray; + } + + public ObjectSubstituteRoot(ObjectSubstitute objectSubstitute) + { + _objectSubstitute = objectSubstitute; + } + + public boolean isArray() + { + return null != _objectSubstituteArray; + } + + public int getArraySize() + { + return _objectSubstituteArray.size(); + } + + public ObjectSubstitute getArrayItemAt(int i) + { + return _objectSubstituteArray.get(i); + } + + public ObjectSubstitute getObjectSubstitute() + { + return _objectSubstitute; + } + + public static List<ObjectSubstitute> toObjectSubstitutes(List<ObjectSubstituteRoot> nonArrayRoots) + { + ArrayList<ObjectSubstitute> ret = new ArrayList<ObjectSubstitute>(); + + for (ObjectSubstituteRoot nonArrayRoot : nonArrayRoots) + { + if(nonArrayRoot.isArray()) + { + throw new IllegalArgumentException("Should only be called for non array"); + } + + ret.add(nonArrayRoot._objectSubstitute); + } + + return ret; + } +} Copied: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/PropertyAccessor.java (from rev 6557, trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/PropertyAccessor.java) =================================================================== --- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/PropertyAccessor.java (rev 0) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/PropertyAccessor.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -0,0 +1,101 @@ +package net.sourceforge.squirrel_sql.plugins.hibernate.server; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +public class PropertyAccessor +{ + private Field _field; + private Method _method; + + private PropertyAccessor(Field field) + { + _field = field; + _field.setAccessible(true); + } + + private PropertyAccessor(Method method) + { + _method = method; + _method.setAccessible(true); + } + + static PropertyAccessor createAccessor(Class<? extends Object> clazz, String propertyName) + { + if(null == clazz || clazz.equals(Object.class)) + { + return null; + } + + try + { + Field f = clazz.getDeclaredField(propertyName); + return new PropertyAccessor(f); + } + catch (NoSuchFieldException nsfe) + { + try + { + Method m = clazz.getDeclaredMethod(toGetter(propertyName, false)); + return new PropertyAccessor(m); + } + catch (NoSuchMethodException nsme) + { + try + { + Method m = clazz.getDeclaredMethod(toGetter(propertyName, true)); + return new PropertyAccessor(m); + } + catch (NoSuchMethodException e) + { + return createAccessor(clazz.getSuperclass(), propertyName); + } + } + } + } + + private static String toGetter(String propertyName, boolean isBoolean) + { + String ret = Character.toUpperCase(propertyName.charAt(0)) + propertyName.substring(1); + + if(isBoolean) + { + return "is" + ret; + } + else + { + return "get" + ret; + } + } + + Object get(Object obj) + { + try + { + if(null != _field) + { + return _field.get(obj); + } + else + { + return _method.invoke(obj, new Object[0]); + } + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } + + Class getType() + { + if(null != _field) + { + return _field.getType(); + } + else + { + return _method.getReturnType(); + } + } +} Added: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/PropertySubstitute.java =================================================================== --- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/PropertySubstitute.java (rev 0) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/PropertySubstitute.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -0,0 +1,78 @@ +package net.sourceforge.squirrel_sql.plugins.hibernate.server; + +import java.io.Serializable; +import java.util.ArrayList; + +public class PropertySubstitute implements Serializable +{ + private HibernatePropertyInfo _hibernatePropertyInfo; + private ArrayList<ObjectSubstitute> _objectSubstituteCollection; + private Object _plainValue; + private ObjectSubstitute _objectSubstitute; + private boolean _initialized; + + PropertySubstitute(HibernatePropertyInfo hibernatePropertyInfo, ObjectSubstitute objectSubstitute, boolean isInitialized) + { + _hibernatePropertyInfo = hibernatePropertyInfo; + _objectSubstitute = objectSubstitute; + _initialized = isInitialized; + } + + PropertySubstitute(HibernatePropertyInfo hibernatePropertyInfo, ArrayList<ObjectSubstitute> objectSubstituteCollection, boolean isInitialized) + { + _hibernatePropertyInfo = hibernatePropertyInfo; + _objectSubstituteCollection = objectSubstituteCollection; + _initialized = isInitialized; + } + + PropertySubstitute(HibernatePropertyInfo hibernatePropertyInfo, Object plainValue, boolean isInitialized) + { + _hibernatePropertyInfo = hibernatePropertyInfo; + _plainValue = plainValue; + _initialized = isInitialized; + } + + public HibernatePropertyInfo getHibernatePropertyInfo() + { + return _hibernatePropertyInfo; + } + + public ArrayList<ObjectSubstitute> getObjectSubstituteCollection() + { + return _objectSubstituteCollection; + } + + public boolean isInitialized() + { + return _initialized; + } + + public Object getSingleValue() + { + if(null != _objectSubstituteCollection) + { + throw new IllegalStateException("Is a collection"); + } + + if(null == _plainValue) + { + return _objectSubstitute; + } + else + { + return _plainValue; + } + + } + + public boolean isPersistenCollection() + { + return null != _objectSubstituteCollection; + + } + + public boolean isNull() + { + return null == _objectSubstituteCollection && null == _objectSubstitute && null == _plainValue; + } +} Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/RCParam.java =================================================================== --- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/RCParam.java 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/RCParam.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -2,16 +2,16 @@ import java.util.ArrayList; -public class RCParam +class RCParam { private ArrayList<Class> _types = new ArrayList<Class>(); private ArrayList<Object> _values = new ArrayList<Object>(); - public RCParam() + RCParam() { } - public RCParam(Object[] params) + RCParam(Object[] params) { for (int i = 0; i < params.length; i++) { @@ -21,7 +21,7 @@ } - public RCParam add(Object paramValue, Class type) + RCParam add(Object paramValue, Class type) { _types.add(type); _values.add(paramValue); @@ -29,17 +29,17 @@ return this; } - public int size() + int size() { return _values.size(); } - public Class getType(int i) + Class getType(int i) { return _types.get(i); } - public Object getValue(int i) + Object getValue(int i) { return _values.get(i); } 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 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ReflectionCaller.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -6,23 +6,23 @@ import java.util.Collection; import java.util.List; -public class ReflectionCaller +class ReflectionCaller { private Object _callee; - public ReflectionCaller(Object callee) + ReflectionCaller(Object callee) { _callee = callee; } - public ReflectionCaller() + ReflectionCaller() { this(null); } - public ReflectionCaller getClass(String className, ClassLoader cl) + ReflectionCaller getClass(String className, ClassLoader cl) { try { @@ -34,7 +34,7 @@ } } - public ReflectionCaller callConstructor(Class[] paramTypes, Object[] params) + ReflectionCaller callConstructor(Class[] paramTypes, Object[] params) { try { @@ -48,7 +48,7 @@ } - public List<ReflectionCaller> callArrayMethod(String methodName) + List<ReflectionCaller> callArrayMethod(String methodName) { try { @@ -73,12 +73,12 @@ } - public Object getCallee() + Object getCallee() { return _callee; } - public Collection<ReflectionCaller> callCollectionMethod(String methodName) + Collection<ReflectionCaller> callCollectionMethod(String methodName) { try { @@ -103,7 +103,7 @@ } } - public ReflectionCaller getField(String fieldName) + ReflectionCaller getField(String fieldName) { try { @@ -115,7 +115,7 @@ } } - public Class getCalleeClass() + Class getCalleeClass() { if(_callee instanceof Class) { @@ -133,18 +133,18 @@ * callMethod(String methodName, Object... params) * NoSuchMethodErrors occur if it isn't there. */ - public ReflectionCaller callMethod(String methodName) + ReflectionCaller callMethod(String methodName) { return callMethod(methodName, new RCParam(new Object[0])); } - public ReflectionCaller callMethod(String methodName, Object... params) + ReflectionCaller callMethod(String methodName, Object... params) { return callMethod(methodName, new RCParam(params)); } - public ReflectionCaller callMethod(String methodName, RCParam param) + ReflectionCaller callMethod(String methodName, RCParam param) { try { @@ -205,7 +205,7 @@ } - public ReflectionCaller callStaticMethod(ClassLoader cl, String className, String methName, Class[] paramTypes, Object[] args) + ReflectionCaller callStaticMethod(ClassLoader cl, String className, String methName, Class[] paramTypes, Object[] args) { try { Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ServerMainImpl.java =================================================================== --- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ServerMainImpl.java 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/ServerMainImpl.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -45,7 +45,7 @@ try { IntraVmConnectionFactory intraVmConnectionFactory = new IntraVmConnectionFactory(); - HibernateServerConnection ret = intraVmConnectionFactory.createHibernateConnection(cfg); + HibernateServerConnection ret = intraVmConnectionFactory.createHibernateConnection(cfg, true); return (HibernateServerConnection) UnicastRemoteObject.exportObject(ret, 0); } Added: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/SquirrelHibernateServerException.java =================================================================== --- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/SquirrelHibernateServerException.java (rev 0) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/SquirrelHibernateServerException.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -0,0 +1,33 @@ +package net.sourceforge.squirrel_sql.plugins.hibernate.server; + +import java.io.Serializable; + +/** + * Created by IntelliJ IDEA. + * User: gerd + * Date: 22.01.12 + * Time: 20:19 + */ +public class SquirrelHibernateServerException extends RuntimeException implements Serializable +{ + private String _originalMessage; + private String _originalExceptionClassName; + + public SquirrelHibernateServerException(String messageIncludingOriginalStackTrace, String originalMessage, String originalExceptionClassName) + { + super(messageIncludingOriginalStackTrace); + _originalMessage = originalMessage; + _originalExceptionClassName = originalExceptionClassName; + } + + @Override + public String getMessage() + { + return _originalMessage; + } + + public String getOriginalExceptionClassName() + { + return _originalExceptionClassName; + } +} Modified: 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 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/util/HqlQueryErrorUtil.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -6,6 +6,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.HQLPanelController; +import net.sourceforge.squirrel_sql.plugins.hibernate.server.SquirrelHibernateServerException; public class HqlQueryErrorUtil { @@ -20,7 +21,15 @@ ExceptionFormatter formatter = sess.getExceptionFormatter(); try { - ret = formatter.format(t); + if (t instanceof SquirrelHibernateServerException) + { + ret = t.getMessage(); + } + else + { + ret = formatter.format(t); + } + if (showInMessagePanel) { sess.showErrorMessage(ret); @@ -33,7 +42,7 @@ } if (sess.getProperties().getWriteSQLErrorsToLog() || - (-1 == t.getClass().getName().toLowerCase().indexOf("hibernate") && -1 == t.getClass().getName().toLowerCase().indexOf("antlr"))) + isHibernateException(t)) { // If this is not a hibernate error we write a log entry s_log.error(t); @@ -41,4 +50,19 @@ return ret; } + + private static boolean isHibernateException(Throwable t) + { + String className; + if (t instanceof SquirrelHibernateServerException) + { + className = ((SquirrelHibernateServerException)t).getOriginalExceptionClassName(); + } + else + { + className = t.getClass().getName(); + } + + return (-1 == className.toLowerCase().indexOf("hibernate") && -1 == className.toLowerCase().indexOf("antlr")); + } } Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/CommandLineOutput.java =================================================================== --- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/CommandLineOutput.java 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/CommandLineOutput.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -1,8 +1,8 @@ package net.sourceforge.squirrel_sql.plugins.hibernate.viewobjects; -import net.sourceforge.squirrel_sql.plugins.hibernate.server.ReflectionCaller; import net.sourceforge.squirrel_sql.plugins.hibernate.mapping.MappedClassInfo; import net.sourceforge.squirrel_sql.plugins.hibernate.mapping.PropertyInfo; +import net.sourceforge.squirrel_sql.plugins.hibernate.server.ObjectSubstitute; import java.util.ArrayList; @@ -19,7 +19,7 @@ for (SingleResult result : type.getResults()) { - Object firstObject = result.getObject(); + ObjectSubstitute firstObject = result.getObject(); displayMappedObject(mappedClassInfos, mci, firstObject, persistenCollectionClass); } } @@ -38,7 +38,7 @@ for (SingleResult queryResult : type.getResults()) { MappedClassInfo mci = queryResult.getMappedClassInfo(); - Object obj = queryResult.getObject(); + ObjectSubstitute obj = queryResult.getObject(); displayMappedObject(mappedClassInfos, mci, obj, persistenCollectionClass); } @@ -56,7 +56,7 @@ for (SingleResult singleResult : singleResults) { MappedClassInfo mci = singleResult.getMappedClassInfo(); - Object obj = singleResult.getObject(); + ObjectSubstitute obj = singleResult.getObject(); displayMappedObject(mappedClassInfos, mci, obj, persistenCollectionClass); } @@ -64,7 +64,7 @@ } } - static void displayMappedObject(ArrayList<MappedClassInfo> mappedClassInfos, MappedClassInfo mci, Object obj, Class persistenCollectionClass) + static void displayMappedObject(ArrayList<MappedClassInfo> mappedClassInfos, MappedClassInfo mci, ObjectSubstitute obj, Class persistenCollectionClass) { PropertyInfo[] propertyInfos = mci.getAttributes(); @@ -78,9 +78,7 @@ Object value = hpr.getValue(); if (null != value && persistenCollectionClass.isAssignableFrom(value.getClass())) { - ReflectionCaller rc = new ReflectionCaller(value); - - System.out.println(" PersistentCollection: " + hpr.getName() + "; wasInitialized=" + rc.callMethod("wasInitialized").getCallee()); + System.out.println(" PersistentCollection: " + hpr.getName() + "; wasInitialized=" + hpr.wasInitialized()); } else if (null != ViewObjectsUtil.findMappedClassInfo(hpr.getTypeName(), mappedClassInfos, true)) { 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 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/HibernatePropertyReader.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -1,25 +1,20 @@ package net.sourceforge.squirrel_sql.plugins.hibernate.viewobjects; +import net.sourceforge.squirrel_sql.plugins.hibernate.server.HibernatePropertyInfo; +import net.sourceforge.squirrel_sql.plugins.hibernate.server.ObjectSubstitute; import net.sourceforge.squirrel_sql.plugins.hibernate.util.HibernateUtil; -import net.sourceforge.squirrel_sql.plugins.hibernate.viewobjects.PropertyAccessor; -import java.lang.reflect.Field; -import java.lang.reflect.Method; +import java.util.Collection; public class HibernatePropertyReader { private String _propertyName; - private Object _obj; - private PropertyAccessor _propertyAccessor; + private ObjectSubstitute _obj; - public HibernatePropertyReader(String propertyName, Object obj) + public HibernatePropertyReader(String propertyName, ObjectSubstitute obj) { _propertyName = propertyName; _obj = obj; - if (null != obj) - { - _propertyAccessor = getAccessor(_obj.getClass()); - } } public String getName() @@ -30,82 +25,79 @@ public Object getValue() { - try + if (null == _obj) { - if (null == _propertyAccessor) - { - return HibernateUtil.OBJECT_IS_NULL; - } - else - { - return _propertyAccessor.get(_obj); - } + return HibernateUtil.OBJECT_IS_NULL; } - catch (Exception e) + else { - throw new RuntimeException("Cannot access property: " + _obj.getClass().getName() + "." + _propertyName, e); + return _obj.getValue(_propertyName); } } - private PropertyAccessor getAccessor(Class<? extends Object> clazz) + public String getTypeName() { - if(null == clazz || clazz.equals(Object.class)) + + if (null == _obj) { - return null; + return HibernateUtil.OBJECT_IS_NULL; } + else + { + return _obj.getTypeName(_propertyName); + } + } - try + public boolean wasInitialized() + { + if (null == _obj) { - Field f = clazz.getDeclaredField(_propertyName); - return new PropertyAccessor(f); + return true; } - catch (NoSuchFieldException nsfe) + else { - try - { - Method m = clazz.getDeclaredMethod(toGetter(_propertyName, false)); - return new PropertyAccessor(m); - } - catch (NoSuchMethodException nsme) - { - try - { - Method m = clazz.getDeclaredMethod(toGetter(_propertyName, true)); - return new PropertyAccessor(m); - } - catch (NoSuchMethodException e) - { - return getAccessor(clazz.getSuperclass()); - } - } + return _obj.wasInitialized(_propertyName); } } - private String toGetter(String propertyName, boolean isBoolean) + public boolean isPersistenCollection() { - String ret = Character.toUpperCase(propertyName.charAt(0)) + propertyName.substring(1); + if (null == _obj) + { + return false; + } + else + { + return _obj.isPersistenCollection(_propertyName); + } + } - if(isBoolean) + public Collection<? extends ObjectSubstitute> getPersistentCollection() + { + if (null == _obj) { - return "is" + ret; + return null; } else { - return "get" + ret; + return _obj.getPersistentCollection(_propertyName); } } - public String getTypeName() + public boolean isNull() { - if (null == _propertyAccessor) + if (null == _obj) { - return HibernateUtil.OBJECT_IS_NULL; + return false; } else { - return _propertyAccessor.getType().getName(); + return _obj.isNull(_propertyName); } } - + public HibernatePropertyInfo getHibernatePropertyInfo() + { + return _obj.getHibernatePropertyInfo(_propertyName); + } } 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 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/ObjectResultController.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -9,6 +9,8 @@ import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; import net.sourceforge.squirrel_sql.plugins.hibernate.HibernateConnection; import net.sourceforge.squirrel_sql.plugins.hibernate.HibernatePluginResources; +import net.sourceforge.squirrel_sql.plugins.hibernate.server.ObjectSubstitute; +import net.sourceforge.squirrel_sql.plugins.hibernate.server.ObjectSubstituteRoot; import javax.swing.*; import java.util.List; @@ -89,7 +91,7 @@ } } - List list = queryListCreator.getList(); + List<ObjectSubstituteRoot> list = queryListCreator.getList(); if (null == list) { Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/ObjectResultTabController.java =================================================================== --- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/ObjectResultTabController.java 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/ObjectResultTabController.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -6,6 +6,8 @@ import net.sourceforge.squirrel_sql.plugins.hibernate.HibernateConnection; import net.sourceforge.squirrel_sql.plugins.hibernate.mapping.MappedClassInfo; import net.sourceforge.squirrel_sql.plugins.hibernate.HibernatePluginResources; +import net.sourceforge.squirrel_sql.plugins.hibernate.server.ObjectSubstitute; +import net.sourceforge.squirrel_sql.plugins.hibernate.server.ObjectSubstituteRoot; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; @@ -26,7 +28,7 @@ private ObjectResultTab _tab; private ResultsController _resultsController; - public ObjectResultTabController(List objects, int maxNumResults, HibernateConnection con, String hqlQuery, HibernatePluginResources resource, final ObjectResultTabControllerListener l, ISession session) + public ObjectResultTabController(List<ObjectSubstituteRoot> objects, int maxNumResults, HibernateConnection con, String hqlQuery, HibernatePluginResources resource, final ObjectResultTabControllerListener l, ISession session) { _tab = new ObjectResultTab(resource); @@ -56,14 +58,12 @@ //String hql = "select be from Best be inner join fetch be.bestPosses bep"; - Class persistenCollectionClass = con.getPersistenCollectionClass(); - ArrayList<MappedClassInfo> mappedClassInfos = con.getMappedClassInfos(); - _resultsController = new ResultsController(_tab.pnlResults, hqlQuery, persistenCollectionClass, mappedClassInfos, session); + _resultsController = new ResultsController(_tab.pnlResults, hqlQuery, mappedClassInfos, session); - RootType qrmr = new RootType(objects, con.getMappedClassInfos(), persistenCollectionClass); + RootType qrmr = new RootType(objects, con.getMappedClassInfos()); DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(qrmr); _tab.treeTypes.setModel(new DefaultTreeModel(rootNode)); Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/PersistentCollectionResult.java =================================================================== --- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/PersistentCollectionResult.java 2012-01-23 18:42:15 UTC (rev 6561) +++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/PersistentCollectionResult.java 2012-01-23 18:53:11 UTC (rev 6562) @@ -2,56 +2,44 @@ import net.sourceforge.squirrel_sql.fw.util.StringManager; import net.sourceforge.squirrel_sql.fw.util... [truncated message content] |