Author: snjeza
Date: 2009-05-15 14:11:38 -0400 (Fri, 15 May 2009)
New Revision: 15318
Added:
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/HibernateResult.java
Removed:
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/ReflectServerOdaFactory.java
Modified:
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/IOdaFactory.java
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/AbstractOdaFactory.java
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/ConsoleConfigurationOdaFactory.java
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/HibernateConnection.java
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/HibernateOdaQuery.java
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/HibernateResultSet.java
Log:
https://jira.jboss.org/jira/browse/JBIDE-4149 Hibernate ODA errors on subreport on
subsequent calls to Dataset
Modified:
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/IOdaFactory.java
===================================================================
---
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/IOdaFactory.java 2009-05-15
17:52:33 UTC (rev 15317)
+++
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/IOdaFactory.java 2009-05-15
18:11:38 UTC (rev 15318)
@@ -10,11 +10,11 @@
************************************************************************************/
package org.jboss.tools.birt.oda;
-import java.util.Iterator;
-import java.util.List;
-
import org.eclipse.datatools.connectivity.oda.OdaException;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
import org.jboss.tools.birt.oda.impl.HibernateOdaQuery;
+import org.jboss.tools.birt.oda.impl.HibernateResult;
import org.jboss.tools.birt.oda.impl.HibernateResultSetMetaData;
/**
@@ -31,12 +31,9 @@
void close();
boolean isOpen();
- HibernateResultSetMetaData prepare(String queryText) throws OdaException;
+ HibernateResultSetMetaData prepare(String queryText,Session session) throws
OdaException;
void setMaxRows(int max);
int getMaxRows();
- void executeQuery(HibernateOdaQuery query) throws OdaException;
- Iterator getIterator();
- List getResult();
- Object getResult(int rstcol) throws OdaException;
- void next();
+ HibernateResult executeQuery(HibernateOdaQuery query,Session session) throws
OdaException;
+ SessionFactory getSessionFactory();
}
Modified:
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/AbstractOdaFactory.java
===================================================================
---
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/AbstractOdaFactory.java 2009-05-15
17:52:33 UTC (rev 15317)
+++
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/AbstractOdaFactory.java 2009-05-15
18:11:38 UTC (rev 15318)
@@ -2,22 +2,17 @@
import java.util.ArrayList;
import java.util.Collections;
-import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
-import org.eclipse.datatools.connectivity.oda.IParameterMetaData;
-import org.eclipse.datatools.connectivity.oda.IResultSetMetaData;
import org.eclipse.datatools.connectivity.oda.OdaException;
import org.eclipse.osgi.util.NLS;
-import org.hibernate.EntityMode;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.engine.query.HQLQueryPlan;
import org.hibernate.impl.SessionFactoryImpl;
-import org.hibernate.metadata.ClassMetadata;
import org.hibernate.type.Type;
import org.jboss.tools.birt.oda.IOdaFactory;
import org.jboss.tools.birt.oda.Messages;
@@ -26,40 +21,41 @@
protected SessionFactory sessionFactory;
private int maxRows;
- private List result;
- private Iterator iterator;
- private Type[] queryReturnTypes;
- private Object currentRow;
- private HibernateOdaQuery query;
- private Session session;
+ //private List result;
+ //private Iterator iterator;
+ //private Type[] queryReturnTypes;
+ //private Object currentRow;
+ //private HibernateOdaQuery query;
+ //private Session session;
private String queryText;
public void close() {
- sessionFactory = null;
- if (session != null) {
- session.close();
- session = null;
- }
+// if (session != null) {
+// session.close();
+// session = null;
+// }
}
+
+ public boolean isOpen() {
+ return getSessionFactory() != null;
+ }
public SessionFactory getSessionFactory() {
return sessionFactory;
}
- public HibernateResultSetMetaData prepare(String queryText) throws OdaException {
+ public HibernateResultSetMetaData prepare(String queryText,Session session) throws
OdaException {
this.queryText = queryText;
- return parseQuery();
+ return parseQuery(session);
}
- private HibernateResultSetMetaData parseQuery()
+ private HibernateResultSetMetaData parseQuery(Session session)
throws OdaException {
List arColsType = new ArrayList();
List arCols = new ArrayList();
List arColClass = new ArrayList();
String[] props = null;
- Session session = null;
try {
- session = getSessionFactory().openSession();
Query query = session.createQuery(queryText);
int maxRows = getMaxRows();
if (maxRows > 0) {
@@ -112,10 +108,6 @@
.toArray(new String[arColClass.size()]));
} catch (Exception e) {
throw new OdaException(e.getLocalizedMessage());
- } finally {
- if (session != null) {
- session.close();
- }
}
}
@@ -156,10 +148,8 @@
this.maxRows = maxRows;
}
- public void executeQuery(HibernateOdaQuery query) throws OdaException {
- this.query = query;
+ public HibernateResult executeQuery(HibernateOdaQuery query,Session session) throws
OdaException {
try {
- session = getSessionFactory().openSession();
Query q = session.createQuery(queryText);
HibernateParameterMetaData parameterMetaData = (HibernateParameterMetaData)
query.getParameterMetaData();
List<Parameter> parameters = parameterMetaData.getParameters();
@@ -174,58 +164,11 @@
break;
}
}
- result = q.list();
- iterator = result.iterator();
- this.queryReturnTypes = q.getReturnTypes();
+ HibernateResult hibernateResult = new HibernateResult(q,this, query);
+ return hibernateResult;
} catch (HibernateException e) {
throw new OdaException(e.getLocalizedMessage());
}
}
-
- public Iterator getIterator() {
- return iterator;
- }
-
- public List getResult() {
- return result;
- }
-
- public Object getResult(int rstcol) throws OdaException {
- Object obj = this.currentRow;
- Object value = null;
- try {
- if (queryReturnTypes.length > 0
- && queryReturnTypes[0].isEntityType()) {
- String checkClass = ((HibernateResultSetMetaData) getMetaData())
- .getColumnClass(rstcol);
- SessionFactory sf = getSessionFactory();
- ClassMetadata metadata = sf.getClassMetadata(checkClass);
- if (metadata == null) {
- metadata = sf.getClassMetadata(obj.getClass());
- }
- value = metadata.getPropertyValue(obj, getMetaData()
- .getColumnName(rstcol), EntityMode.POJO);
- } else {
- if (getMetaData().getColumnCount() == 1) {
- value = obj;
- } else {
- Object[] values = (Object[]) obj;
- value = values[rstcol - 1];
- }
- }
- } catch (Exception e) {
- throw new OdaException(e.getLocalizedMessage());
- }
- return (value);
- }
-
- private IResultSetMetaData getMetaData() throws OdaException {
- return query.getMetaData();
- }
-
- public void next() {
- currentRow = getIterator().next();
- }
-
}
Modified:
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/ConsoleConfigurationOdaFactory.java
===================================================================
---
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/ConsoleConfigurationOdaFactory.java 2009-05-15
17:52:33 UTC (rev 15317)
+++
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/ConsoleConfigurationOdaFactory.java 2009-05-15
18:11:38 UTC (rev 15318)
@@ -29,7 +29,7 @@
public class ConsoleConfigurationOdaFactory extends AbstractOdaFactory {
ConsoleConfiguration consoleConfiguration;
-
+
public ConsoleConfigurationOdaFactory(Properties properties) throws OdaException {
getSessionFactory(properties);
String maxRowString = properties.getProperty(IOdaFactory.MAX_ROWS);
@@ -49,7 +49,7 @@
break;
}
}
- if (isOpen()) {
+ if (!isOpen()) {
try {
sessionFactory = consoleConfiguration.getSessionFactory();
if (sessionFactory == null) {
@@ -65,14 +65,5 @@
}
return sessionFactory;
}
-
- @Override
- public void close() {
- consoleConfiguration = null;
- super.close();
- }
- public boolean isOpen() {
- return consoleConfiguration != null;
- }
}
Modified:
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/HibernateConnection.java
===================================================================
---
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/HibernateConnection.java 2009-05-15
17:52:33 UTC (rev 15317)
+++
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/HibernateConnection.java 2009-05-15
18:11:38 UTC (rev 15318)
@@ -16,6 +16,7 @@
import org.eclipse.datatools.connectivity.oda.IDataSetMetaData;
import org.eclipse.datatools.connectivity.oda.IQuery;
import org.eclipse.datatools.connectivity.oda.OdaException;
+import org.hibernate.Session;
import org.jboss.tools.birt.oda.IOdaFactory;
import org.jboss.tools.birt.oda.Messages;
import org.osgi.framework.Bundle;
@@ -29,8 +30,10 @@
*/
public class HibernateConnection implements IConnection {
private IOdaFactory odaSessionFactory;
- private Map appContext;
+ private Session session;
+ //private Map appContext;
+
/*
* @see
* org.eclipse.datatools.connectivity.oda.IConnection#open(java.util.Properties
@@ -45,6 +48,7 @@
} else {
odaSessionFactory = new ServerOdaFactory(connProperties);
}
+ session = odaSessionFactory.getSessionFactory().openSession();
}
/*
@@ -56,21 +60,28 @@
if (!(context instanceof Map)) {
throw new OdaException(Messages.HibernateConnection_Invalid_AppContext);
}
- this.appContext = (Map) context;
+ //this.appContext = (Map) context;
}
/*
* @see org.eclipse.datatools.connectivity.oda.IConnection#close()
*/
public void close() throws OdaException {
- odaSessionFactory.close();
+ if (odaSessionFactory != null) {
+ odaSessionFactory.close();
+ odaSessionFactory = null;
+ }
+ if (session != null) {
+ session.close();
+ session = null;
+ }
}
/*
* @see org.eclipse.datatools.connectivity.oda.IConnection#isOpen()
*/
public boolean isOpen() throws OdaException {
- return odaSessionFactory != null && odaSessionFactory.isOpen();
+ return session != null && session.isOpen();
}
/*
@@ -116,15 +127,15 @@
// do nothing; assumes no transaction support needed
}
- /*
- * public SessionFactory getSessionFactory() { return
- * odaSessionFactory.getSessionFactory(); }
- */
-
public IOdaFactory getOdaSessionFactory() {
return odaSessionFactory;
}
+ public Session getSession() {
+ return session;
+ }
+
+
/* (non-Javadoc)
* @see
org.eclipse.datatools.connectivity.oda.IConnection#setLocale(com.ibm.icu.util.ULocale)
*/
Modified:
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/HibernateOdaQuery.java
===================================================================
---
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/HibernateOdaQuery.java 2009-05-15
17:52:33 UTC (rev 15317)
+++
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/HibernateOdaQuery.java 2009-05-15
18:11:38 UTC (rev 15318)
@@ -21,6 +21,7 @@
import org.eclipse.datatools.connectivity.oda.OdaException;
import org.eclipse.datatools.connectivity.oda.SortSpec;
import org.eclipse.datatools.connectivity.oda.spec.QuerySpecification;
+import org.hibernate.Session;
/**
* Implementation class of IQuery for an ODA runtime driver.
@@ -31,9 +32,11 @@
private HibernateConnection connection;
private HibernateResultSetMetaData resultSetMetaData;
private HibernateParameterMetaData parameterMetaData = new
HibernateParameterMetaData();
+ private Session session;
public HibernateOdaQuery(HibernateConnection connection) {
this.connection = connection;
+ this.session = connection.getSession();
}
/*
@@ -42,7 +45,7 @@
*/
public void prepare(String queryText) throws OdaException {
this.resultSetMetaData = getConnection().getOdaSessionFactory()
- .prepare(queryText);
+ .prepare(queryText,session);
}
/*
Added:
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/HibernateResult.java
===================================================================
---
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/HibernateResult.java
(rev 0)
+++
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/HibernateResult.java 2009-05-15
18:11:38 UTC (rev 15318)
@@ -0,0 +1,82 @@
+package org.jboss.tools.birt.oda.impl;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.datatools.connectivity.oda.IResultSetMetaData;
+import org.eclipse.datatools.connectivity.oda.OdaException;
+import org.hibernate.EntityMode;
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.hibernate.metadata.ClassMetadata;
+import org.hibernate.type.Type;
+import org.jboss.tools.birt.oda.IOdaFactory;
+
+public class HibernateResult {
+
+ private List result;
+ private Iterator iterator;
+ private Type[] queryReturnTypes;
+ private Object currentRow;
+ private IOdaFactory odaFactory;
+ private HibernateOdaQuery query;
+
+ public HibernateResult(Query q, IOdaFactory odaFactory, HibernateOdaQuery query) {
+ this.result = q.list();
+ this.iterator = result.iterator();
+ this.queryReturnTypes = q.getReturnTypes();
+ this.odaFactory = odaFactory;
+ this.query = query;
+ }
+
+ public Iterator getIterator() {
+ return iterator;
+ }
+
+ public List getResult() {
+ return result;
+ }
+
+ public Object getResult(int rstcol) throws OdaException {
+ Object obj = this.currentRow;
+ Object value = null;
+ try {
+ if (queryReturnTypes.length > 0
+ && queryReturnTypes[0].isEntityType()) {
+ String checkClass = ((HibernateResultSetMetaData) getMetaData())
+ .getColumnClass(rstcol);
+ SessionFactory sf = odaFactory.getSessionFactory();
+ ClassMetadata metadata = sf.getClassMetadata(checkClass);
+ if (metadata == null) {
+ metadata = sf.getClassMetadata(obj.getClass());
+ }
+ value = metadata.getPropertyValue(obj, getMetaData()
+ .getColumnName(rstcol), EntityMode.POJO);
+ } else {
+ if (getMetaData().getColumnCount() == 1) {
+ value = obj;
+ } else {
+ Object[] values = (Object[]) obj;
+ value = values[rstcol - 1];
+ }
+ }
+ } catch (Exception e) {
+ throw new OdaException(e.getLocalizedMessage());
+ }
+ return (value);
+ }
+
+ public void next() {
+ currentRow = getIterator().next();
+ }
+
+ private IResultSetMetaData getMetaData() throws OdaException {
+ return query.getMetaData();
+ }
+
+ public void close() {
+ if (result != null) {
+ result.clear();
+ }
+ }
+}
Modified:
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/HibernateResultSet.java
===================================================================
---
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/HibernateResultSet.java 2009-05-15
17:52:33 UTC (rev 15317)
+++
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/HibernateResultSet.java 2009-05-15
18:11:38 UTC (rev 15318)
@@ -25,6 +25,8 @@
import org.eclipse.datatools.connectivity.oda.IResultSetMetaData;
import org.eclipse.datatools.connectivity.oda.OdaException;
import org.eclipse.osgi.util.NLS;
+import org.hibernate.Session;
+import org.jboss.tools.birt.oda.IOdaFactory;
import org.jboss.tools.birt.oda.Messages;
/**
@@ -38,12 +40,16 @@
private int rowNumber = -1;
private boolean wasNull;
+ private HibernateResult hibernateResult;
private static DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
//$NON-NLS-1$
public HibernateResultSet(HibernateOdaQuery query) throws OdaException {
this.query = query;
- query.getConnection().getOdaSessionFactory().executeQuery(query);
+ HibernateConnection connection = query.getConnection();
+ IOdaFactory odaSessionFactory = connection.getOdaSessionFactory();
+ Session session = connection.getSession();
+ hibernateResult = odaSessionFactory.executeQuery(query,session);
}
/*
@@ -75,7 +81,7 @@
*/
public boolean next() throws OdaException {
if (getIterator().hasNext()) {
- query.getConnection().getOdaSessionFactory().next();
+ hibernateResult.next();
rowNumber++;
return true;
}
@@ -84,22 +90,18 @@
}
private Iterator getIterator() {
- return query.getConnection().getOdaSessionFactory().getIterator();
+ return hibernateResult.getIterator();
}
/*
* @see org.eclipse.datatools.connectivity.oda.IResultSet#close()
*/
public void close() throws OdaException {
- List result = getResult();
- if (result != null)
- result.clear();
- query.getConnection().getOdaSessionFactory().close();
- result = null;
+ hibernateResult.close();
}
private List getResult() {
- return query.getConnection().getOdaSessionFactory().getResult();
+ return hibernateResult.getResult();
}
/*
@@ -111,7 +113,7 @@
}
private Object getResult(int rstcol) throws OdaException {
- return query.getConnection().getOdaSessionFactory().getResult(rstcol);
+ return hibernateResult.getResult(rstcol);
}
/*
Deleted:
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/ReflectServerOdaFactory.java
===================================================================
---
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/ReflectServerOdaFactory.java 2009-05-15
17:52:33 UTC (rev 15317)
+++
trunk/birt/plugins/org.jboss.tools.birt.oda/src/org/jboss/tools/birt/oda/impl/ReflectServerOdaFactory.java 2009-05-15
18:11:38 UTC (rev 15318)
@@ -1,336 +0,0 @@
-/*************************************************************************************
- * Copyright (c) 2008 JBoss, a division of Red Hat and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * JBoss, a division of Red Hat - Initial implementation.
- ************************************************************************************/
-package org.jboss.tools.birt.oda.impl;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-import java.util.StringTokenizer;
-
-import javax.naming.InitialContext;
-
-import org.eclipse.datatools.connectivity.oda.IResultSetMetaData;
-import org.eclipse.datatools.connectivity.oda.OdaException;
-import org.eclipse.osgi.util.NLS;
-import org.hibernate.SessionFactory;
-import org.jboss.tools.birt.oda.Activator;
-import org.jboss.tools.birt.oda.IOdaFactory;
-import org.jboss.tools.birt.oda.Messages;
-
-/**
- *
- * @author snjeza
- *
- */
-public class ReflectServerOdaFactory implements IOdaFactory {
-
- private static final Integer INTZERO = new Integer(0);
- private static Class[] emptyClassArg = new Class[0];
- private static Object[] emptyObjectArg = new Object[0];
- private Object sessionFactory;
- private Integer maxRows;
- private String queryText;
- private List result;
- private Iterator iterator;
- private Object currentRow;
- private HibernateOdaQuery query;
- private Object session;
- private Object[] queryReturnTypes;
-
- public ReflectServerOdaFactory(Properties properties) throws OdaException {
- getSessionFactory(properties);
- String maxRowString = properties.getProperty(IOdaFactory.MAX_ROWS);
- try {
- maxRows = new Integer(maxRowString);
- } catch (NumberFormatException e) {
- // ignore
- }
- }
-
- public Object getSessionFactory(Properties properties)
- throws OdaException {
- String configurationName = properties.getProperty(CONFIGURATION);
- if (sessionFactory == null) {
- InitialContext ctx = null;
- try {
- ctx = new InitialContext();
- Object obj = ctx.lookup("java:/" + configurationName); //$NON-NLS-1$
- sessionFactory = obj;
- SessionFactory sf = (SessionFactory) obj;
- System.out.println(sf);
- } catch (Exception e) {
- e.printStackTrace();
- throw new OdaException(
- Messages.ReflectServerOdaFactory_Cannot_create_Hibernate_session_factory);
- }
-
- }
- return sessionFactory;
- }
-
- public Object getSessionFactory() {
- return sessionFactory;
- }
-
- public void close() {
- closeSession(session);
- }
-
- public boolean isOpen() {
- if (sessionFactory == null)
- return false;
- boolean isClosed = true;
- try {
- Method method = sessionFactory.getClass().getMethod("isClosed", new
Class[0]); //$NON-NLS-1$
- if (method != null) {
- Object closed = method.invoke(sessionFactory, new Object[0]);
- isClosed = ((Boolean) closed).booleanValue();
- }
- } catch (Exception e) {
- // ignore
- }
- return !isClosed;
- }
-
- public int getMaxRows() {
- return maxRows;
- }
-
- public HibernateResultSetMetaData prepare(String queryText)
- throws OdaException {
- this.queryText = queryText;
- List arColsType = new ArrayList();
- List arCols = new ArrayList();
- List arColClass = new ArrayList();
- String[] props = null;
- Object session = null;
-
- try {
- session = openSession();
- Object query = createQuery(session, queryText);
- if (maxRows > 0) {
- Method setFirstResult = query.getClass().getMethod("setFirstResult", new
Class[] {Integer.TYPE}); //$NON-NLS-1$
- setFirstResult.invoke(query, new Object[] {INTZERO});
- Method setMaxResults = query.getClass().getMethod("setMaxResults", new
Class[] {Integer.TYPE}); //$NON-NLS-1$
- setMaxResults.invoke(query, new Object[] {new Integer(maxRows)});
- }
- Method getReturnTypes = query.getClass().getMethod("getReturnTypes",
emptyClassArg); //$NON-NLS-1$
- Object returnType = getReturnTypes.invoke(query, emptyObjectArg);
- Object[] qryReturnTypes = (Object[]) returnType;
- if (checkEntityType(qryReturnTypes)) {
- for (int j = 0; j < qryReturnTypes.length; j++) {
- String clsName = getReturnTypeName(qryReturnTypes[j]);
- props = getHibernateProp(clsName);
- for (int x = 0; x < props.length; x++) {
- String propType = getHibernatePropTypes(clsName,
- props[x]);
- if (DataTypes.isValidType(propType)) {
- arColsType.add(propType);
- arCols.add(props[x]);
- arColClass.add(clsName);
- } else {
- arColsType.add(DataTypes.UNKNOWN);
- arCols.add(props[x]);
- arColClass.add("java.lang.String"); //$NON-NLS-1$
- }
- }
- }
- } else {
- props = extractColumns(queryText);
- for (int t = 0; t < qryReturnTypes.length; t++) {
- String typeName = getReturnTypeName(qryReturnTypes[t]);
- if (DataTypes.isValidType(typeName)) {
- arColsType.add(typeName);
- arCols.add(props[t]);
- } else {
- throw new
OdaException(NLS.bind(Messages.ReflectServerOdaFactory_The_type_is_not_valid, typeName));
- }
- }
- }
- String[] arLabels = (String[]) arCols.toArray(new String[arCols
- .size()]);
- for (int j = 0; j < arLabels.length; j++) {
- arLabels[j] = arLabels[j].replace('.', ':');
- }
-
- return new HibernateResultSetMetaData(arLabels,
- (String[]) arColsType
- .toArray(new String[arColsType.size()]), arLabels,
- (String[]) arColClass
- .toArray(new String[arColClass.size()]));
- } catch (Exception e) {
- throw new OdaException(e.getLocalizedMessage());
- } finally {
- closeSession(session);
- }
- }
-
- private void closeSession(Object session) {
- if (session != null) {
- try {
- Method close = session.getClass().getMethod("close", emptyClassArg);
//$NON-NLS-1$
- close.invoke(session, emptyObjectArg);
- session = null;
- } catch (Exception e) {
- // ignore
- }
- }
- }
-
- private boolean checkEntityType(Object[] qryReturnTypes) throws SecurityException,
NoSuchMethodException, IllegalArgumentException, IllegalAccessException,
InvocationTargetException {
- Object first = qryReturnTypes[0];
- Method isEntityType = first.getClass().getMethod("isEntityType",
emptyClassArg); //$NON-NLS-1$
- Object ret = isEntityType.invoke(first, emptyObjectArg);
- boolean isEntity = ((Boolean)ret).booleanValue();
- return qryReturnTypes.length > 0 && isEntity;
- }
-
- private Object createQuery(Object session, String queryText)
- throws NoSuchMethodException, IllegalAccessException,
- InvocationTargetException {
- Method createQuery = session.getClass().getMethod("createQuery", new Class[]
{String.class}); //$NON-NLS-1$
- Object query = createQuery.invoke(session, new Object[] {queryText});
- return query;
- }
-
- private Object openSession() throws NoSuchMethodException,
- IllegalAccessException, InvocationTargetException {
- Object session;
- Method openSession = sessionFactory.getClass().getMethod("openSession",
emptyClassArg); //$NON-NLS-1$
- session = openSession.invoke(sessionFactory, emptyObjectArg);
- return session;
- }
-
- private static String[] extractColumns(final String query) {
- int fromPosition = query.toLowerCase().indexOf("from"); //$NON-NLS-1$
- int selectPosition = query.toLowerCase().indexOf("select");
//$NON-NLS-1$
- if (selectPosition >= 0) {
- String columns = query.substring(selectPosition + 6, fromPosition);
- StringTokenizer st = new StringTokenizer(columns, ",");
//$NON-NLS-1$
- List columnList = new ArrayList();
- while (st.hasMoreTokens()) {
- columnList.add(st.nextToken().trim());
- }
- return (String[]) columnList.toArray(new String[0]);
- } else {
- return null;
- }
- }
-
- private String getReturnTypeName(Object returnType) throws SecurityException,
NoSuchMethodException, IllegalArgumentException, IllegalAccessException,
InvocationTargetException {
- Method getName = returnType.getClass().getMethod("getName", emptyClassArg);
//$NON-NLS-1$
- Object name = getName.invoke(returnType, emptyObjectArg);
- return (String) name;
- }
-
- private String[] getHibernateProp(String className) throws SecurityException,
NoSuchMethodException, IllegalArgumentException, IllegalAccessException,
InvocationTargetException{
- Object classMetadata = getClassMetadata(className);
- Method getPropertyNames =
classMetadata.getClass().getMethod("getPropertyNames", emptyClassArg);
//$NON-NLS-1$
- String[] properties = (String[]) getPropertyNames.invoke(classMetadata,
emptyObjectArg);
- return properties;
- }
-
- private Object getClassMetadata(String className)
- throws NoSuchMethodException, IllegalAccessException,
- InvocationTargetException {
- Method getClassMetadata =
sessionFactory.getClass().getMethod("getClassMetadata", new Class[]
{String.class}); //$NON-NLS-1$
- Object classMetadata = getClassMetadata.invoke(sessionFactory, new Object[]
{className});
- return classMetadata;
- }
-
- private Object getClassMetadata(Class clazz) throws NoSuchMethodException,
- IllegalAccessException, InvocationTargetException {
- Method getClassMetadata = sessionFactory.getClass().getMethod(
- "getClassMetadata", new Class[] { Class.class }); //$NON-NLS-1$
- Object classMetadata = getClassMetadata.invoke(sessionFactory,
- new Object[] { clazz });
- return classMetadata;
- }
-
- private String getHibernatePropTypes(String className, String property) throws
NoSuchMethodException, IllegalAccessException, InvocationTargetException{
- Object classMetadata = getClassMetadata(className);
- Method getPropertyType =
classMetadata.getClass().getMethod("getPropertyType", new Class[]
{String.class}); //$NON-NLS-1$
- Object type = getPropertyType.invoke(classMetadata, new Object[] {property});
- return getReturnTypeName(type);
- }
-
- public void setMaxRows(int max) {
- maxRows = max;
- }
-
- public void executeQuery(HibernateOdaQuery query) throws OdaException {
- this.query = query;
- try {
- session = openSession();
- Object q = createQuery(session,queryText);
- Method list = q.getClass().getMethod("list", emptyClassArg); //$NON-NLS-1$
- result = (List) list.invoke(q, emptyObjectArg);
- iterator = result.iterator();
- Method getReturnTypes = q.getClass().getMethod("getReturnTypes",
emptyClassArg); //$NON-NLS-1$
- this.queryReturnTypes = (Object[]) getReturnTypes.invoke(q, emptyObjectArg);
- } catch (Exception e) {
- throw new OdaException(e.getLocalizedMessage());
- }
- }
-
- public Iterator getIterator() {
- return iterator;
- }
-
- public List getResult() {
- return result;
- }
-
- public Object getResult(int rstcol) throws OdaException {
- Object obj = this.currentRow;
- Object value = null;
- try {
- if (checkEntityType(queryReturnTypes)) {
- String checkClass = ((HibernateResultSetMetaData) getMetaData())
- .getColumnClass(rstcol);
- Object metadata = getClassMetadata(checkClass);
- if (metadata == null) {
- metadata = getClassMetadata(obj.getClass());
- }
- String className = "org.hibernate.EntityMode"; //$NON-NLS-1$
- Class pojo = Activator.classForName(className, getClass());
- Field pojoField = pojo.getField("POJO"); //$NON-NLS-1$
- Object POJO = pojoField.get(null);
- Class[] parameterTypes = new Class[] {Object.class,String.class, POJO.getClass()};
- Method getPropertyValue = metadata.getClass().getMethod("getPropertyValue",
parameterTypes); //$NON-NLS-1$
- Object[] args = new Object[] {obj,getMetaData().getColumnName(rstcol),POJO};
- value = getPropertyValue.invoke(metadata, args);
- } else {
- if (getMetaData().getColumnCount() == 1) {
- value = obj;
- } else {
- Object[] values = (Object[]) obj;
- value = values[rstcol - 1];
- }
- }
- } catch (Exception e) {
- throw new OdaException(e.getLocalizedMessage());
- }
- return (value);
- }
-
- public void next() {
- currentRow = getIterator().next();
- }
-
- private IResultSetMetaData getMetaData() throws OdaException {
- return query.getMetaData();
- }
-}