moved xpql over and test for release
This commit is contained in:
parent
a51eeeb254
commit
fa06f4e015
56 changed files with 3009 additions and 158 deletions
|
|
@ -0,0 +1,40 @@
|
|||
|
||||
package com.idcanet.vasc.xpql.ejb3;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.ejb.Local;
|
||||
import javax.ejb.Remote;
|
||||
|
||||
import com.idcanet.vasc.xpql.query.Query;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Willem Cazander
|
||||
* @version 1.0 17 Sep 2010
|
||||
*/
|
||||
public interface XpqlQueryManager {
|
||||
|
||||
public Query getQuery(String name);
|
||||
|
||||
public List<Object> execute(Query query);
|
||||
|
||||
public Object executeObject(Query query);
|
||||
|
||||
public Integer executeUpdate(Query query);
|
||||
|
||||
public List<Object> execute(String query,Map<String,Object> parameters);
|
||||
|
||||
public Object executeObject(String query,Map<String,Object> parameters);
|
||||
|
||||
public Integer executeUpdate(String query,Map<String,Object> parameters);
|
||||
|
||||
@Local
|
||||
public interface ILocal extends XpqlQueryManager {
|
||||
}
|
||||
|
||||
@Remote
|
||||
public interface IRemote extends XpqlQueryManager {
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,321 @@
|
|||
|
||||
package com.idcanet.vasc.xpql.ejb3;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.Resource;
|
||||
import javax.ejb.Stateless;
|
||||
import javax.ejb.TransactionManagement;
|
||||
import javax.ejb.TransactionManagementType;
|
||||
import javax.naming.InitialContext;
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.transaction.UserTransaction;
|
||||
|
||||
import com.idcanet.vasc.xpql.QueryStore;
|
||||
import com.idcanet.vasc.xpql.XPQLParser;
|
||||
import com.idcanet.vasc.xpql.query.Query;
|
||||
import com.idcanet.vasc.xpql.query.QueryParameterValue;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Willem Cazander
|
||||
* @version 1.0 16 Jul 2007
|
||||
*/
|
||||
@Stateless(name="ejb/xpqlQueryManager")
|
||||
@TransactionManagement(TransactionManagementType.BEAN)
|
||||
public class XpqlQueryManagerImpl implements XpqlQueryManager.ILocal,XpqlQueryManager.IRemote {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(XpqlQueryManagerImpl.class.getName());
|
||||
|
||||
private EntityManager entityManager;
|
||||
|
||||
@Resource
|
||||
private UserTransaction utx;
|
||||
|
||||
private Map<String,Query> queries = new HashMap<String,Query>(100);
|
||||
|
||||
@PostConstruct
|
||||
public void loadAll() {
|
||||
logger.fine("XtesManager created now loading resources...");
|
||||
try {
|
||||
long s = System.currentTimeMillis();
|
||||
|
||||
Map<String,String> keys = loadKeys();
|
||||
for (String key:keys.keySet()) {
|
||||
String value = keys.get(key);
|
||||
if (key.startsWith("load")) {
|
||||
loadResource(value);
|
||||
}
|
||||
if ("persistenceUnit".equals(key)) {
|
||||
logger.fine("getting EntityManager: "+value);
|
||||
entityManager = (EntityManager)new InitialContext().lookup(value);
|
||||
}
|
||||
}
|
||||
long t = System.currentTimeMillis()-s;
|
||||
logger.info("Total loaded xpql queries: "+queries.size()+" in "+t+" ms.");
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Error while load xpql resources error: "+e.getMessage(),e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads xtes-xpql-ejb3.xml from meta-inf and gives the keys
|
||||
*/
|
||||
protected Map<String,String> loadKeys() throws IOException {
|
||||
|
||||
Properties properties = new Properties();
|
||||
|
||||
logger.fine("Getting urls");
|
||||
Enumeration<URL> e = Thread.currentThread().getContextClassLoader().getResources("META-INF/xtes-xpql-ejb3.xml");
|
||||
while(e.hasMoreElements()) {
|
||||
URL u = e.nextElement();
|
||||
logger.finer("Loading reletive namespaces of: "+u+" for: META-INF/xtes-xpql-ejb3.xml");
|
||||
InputStream in = u.openStream();
|
||||
try {
|
||||
properties.loadFromXML(in);
|
||||
} finally {
|
||||
if (in!=null) {
|
||||
in.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
e = Thread.currentThread().getContextClassLoader().getResources("/META-INF/xtes-xpql-ejb3.xml");
|
||||
while(e.hasMoreElements()) {
|
||||
URL u = e.nextElement();
|
||||
logger.finer("Loading root namespaces of: "+u+" for: /META-INF/xtes-xpql-ejb3.xml");
|
||||
InputStream in = u.openStream();
|
||||
try {
|
||||
properties.loadFromXML(in);
|
||||
} finally {
|
||||
if (in!=null) {
|
||||
in.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
logger.fine("done loading");
|
||||
|
||||
Map<String,String> result = new HashMap<String,String>(20);
|
||||
for (Object key:properties.keySet()) {
|
||||
if (key instanceof String) {
|
||||
String key2 = (String) key;
|
||||
String value = properties.getProperty(key2);
|
||||
result.put(key2, value);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
private void loadResource(String resource) {
|
||||
XPQLParser parser = new XPQLParser();
|
||||
logger.fine("Try loading: "+resource);
|
||||
try {
|
||||
parser.parseResource(resource);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Could not load xpql resource: "+resource+" error: "+e.getMessage(),e);
|
||||
}
|
||||
QueryStore store = parser.getQueryStore();
|
||||
|
||||
for (String key:store.getQueryNames()) {
|
||||
Query q = store.getQuery(key);
|
||||
|
||||
queries.put(q.getName(),q);
|
||||
|
||||
String out = "\n\n=========== SQL: "+q.getName()+"\n";
|
||||
//out +=q.toSQL(q);
|
||||
out +="=========== XML: "+q.getName()+"\n";
|
||||
out +=q.toXML(q);
|
||||
//out +="=========== Edit: "+q.getName()+"\n";
|
||||
//out +=q.toEdit(q);
|
||||
out +="=========== Prepard: "+q.getName()+"\n";
|
||||
out +=q.toPreparedSQL(q)+"\n";
|
||||
logger.finer("FOUND Query: "+out);
|
||||
}
|
||||
}
|
||||
|
||||
public Query getQuery(String name) {
|
||||
Query q = queries.get(name);
|
||||
return q;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<Object> execute(Query query) {
|
||||
String sql = query.toPreparedSQL(query);
|
||||
logger.finer("Executing: "+query.getName()+" sql: "+sql);
|
||||
javax.persistence.Query q2 = null;
|
||||
if (Query.QueryType.hql==query.getType()) {
|
||||
q2 = entityManager.createQuery(sql);
|
||||
}
|
||||
if (Query.QueryType.sql==query.getType()) {
|
||||
q2 = entityManager.createNativeQuery(sql);
|
||||
}
|
||||
|
||||
// TODO: move this hack to xtest xpql
|
||||
if (query.getProperty("limit")!=null) {
|
||||
int max = new Integer(query.getPropertyString("limit"));
|
||||
q2.setMaxResults(max);
|
||||
}
|
||||
if (query.getProperty("offset")!=null) {
|
||||
int offset = new Integer(query.getPropertyString("offset"));
|
||||
q2.setFirstResult(offset);
|
||||
}
|
||||
|
||||
|
||||
List<QueryParameterValue> options = query.getOrderQueryParameterValues();
|
||||
int i=1;
|
||||
for ( QueryParameterValue value : options ) {
|
||||
Object para = value.getValue();
|
||||
if(para==null) {
|
||||
para = value.getDefaultValue();
|
||||
}
|
||||
logger.finest( "nr: " + i + " value: " + para+" name: "+value.getName());
|
||||
q2.setParameter(i,para);
|
||||
i++;
|
||||
}
|
||||
return q2.getResultList();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public Object executeObject(Query query) {
|
||||
String sql = query.toPreparedSQL(query);
|
||||
logger.finer("Executing: "+query.getName()+" sql: "+sql);
|
||||
javax.persistence.Query q2 = null;
|
||||
if (Query.QueryType.hql==query.getType()) {
|
||||
q2 = entityManager.createQuery(sql);
|
||||
}
|
||||
if (Query.QueryType.sql==query.getType()) {
|
||||
q2 = entityManager.createNativeQuery(sql);
|
||||
}
|
||||
|
||||
|
||||
// TODO: move this hack to xtest xpql
|
||||
if (query.getProperty("limit")!=null) {
|
||||
int max = new Integer(query.getPropertyString("limit"));
|
||||
q2.setMaxResults(max);
|
||||
}
|
||||
if (query.getProperty("offset")!=null) {
|
||||
int offset = new Integer(query.getPropertyString("offset"));
|
||||
q2.setFirstResult(offset);
|
||||
}
|
||||
|
||||
List<QueryParameterValue> options = query.getOrderQueryParameterValues();
|
||||
int i=1;
|
||||
for ( QueryParameterValue value : options ) {
|
||||
Object para = value.getValue();
|
||||
if(para==null) {
|
||||
para = value.getDefaultValue();
|
||||
}
|
||||
logger.finest( "nr: " + i + " value: " + para+" name: "+value.getName());
|
||||
q2.setParameter(i,para);
|
||||
i++;
|
||||
}
|
||||
try {
|
||||
utx.begin();
|
||||
Object result = null;
|
||||
try {
|
||||
result = q2.getSingleResult();
|
||||
utx.commit();
|
||||
} finally {
|
||||
if (result==null) {
|
||||
utx.rollback();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
} catch (Exception se) {
|
||||
throw new RuntimeException("Transaction error: "+se.getMessage(),se);
|
||||
}
|
||||
}
|
||||
|
||||
public List<Object> execute(String name,Map<String,Object> parameters) {
|
||||
Query query = getQuery(name);
|
||||
if (parameters!=null) {
|
||||
for (String key:parameters.keySet()) {
|
||||
Object value = parameters.get(key);
|
||||
query.setQueryParameter(key, value);
|
||||
}
|
||||
}
|
||||
return execute(query);
|
||||
}
|
||||
|
||||
public Object executeObject(String name,Map<String,Object> parameters) {
|
||||
Query query = getQuery(name);
|
||||
if (parameters!=null) {
|
||||
for (String key:parameters.keySet()) {
|
||||
Object value = parameters.get(key);
|
||||
query.setQueryParameter(key, value);
|
||||
}
|
||||
}
|
||||
return executeObject(query);
|
||||
}
|
||||
|
||||
public Integer executeUpdate(Query query) {
|
||||
String sql = query.toPreparedSQL(query);
|
||||
logger.fine("Executing: "+query.getName()+" sql: "+sql);
|
||||
try {
|
||||
javax.persistence.Query q2 = null;
|
||||
if (Query.QueryType.hql==query.getType()) {
|
||||
q2 = entityManager.createQuery(sql);
|
||||
List<QueryParameterValue> options = query.getOrderQueryParameterValues();
|
||||
int i=1;
|
||||
for ( QueryParameterValue value : options ) {
|
||||
Object para = value.getValue();
|
||||
if(para==null) {
|
||||
para = value.getDefaultValue();
|
||||
}
|
||||
logger.finest( "nr: " + i + " value: " + para+" name: "+value.getName());
|
||||
q2.setParameter(i,para);
|
||||
i++;
|
||||
}
|
||||
utx.begin();
|
||||
Integer result = q2.executeUpdate();
|
||||
utx.commit();
|
||||
return result;
|
||||
}
|
||||
|
||||
if (Query.QueryType.sql==query.getType()) {
|
||||
q2 = entityManager.createNativeQuery(sql);
|
||||
List<QueryParameterValue> options = query.getOrderQueryParameterValues();
|
||||
int i=1;
|
||||
for ( QueryParameterValue value : options ) {
|
||||
Object para = value.getValue();
|
||||
if(para==null) {
|
||||
para = value.getDefaultValue();
|
||||
}
|
||||
logger.finest( "nr: " + i + " value: " + para+" name: "+value.getName());
|
||||
q2.setParameter(i,para);
|
||||
i++;
|
||||
}
|
||||
utx.begin();
|
||||
Integer result = q2.executeUpdate();
|
||||
utx.commit();
|
||||
return result;
|
||||
}
|
||||
} catch (Exception se) {
|
||||
throw new RuntimeException("Transaction error: "+se.getMessage(),se);
|
||||
}
|
||||
throw new IllegalStateException("unknow query type");
|
||||
}
|
||||
|
||||
/**
|
||||
* @see com.idcanet.showplanner.ejb.services.XtesManagerLocal#executeUpdate(java.lang.String, java.lang.String, java.util.Map)
|
||||
*/
|
||||
public Integer executeUpdate(String name,Map<String, Object> parameters) {
|
||||
Query query = getQuery(name);
|
||||
for (String key:parameters.keySet()) {
|
||||
Object value = parameters.get(key);
|
||||
query.setQueryParameter(key, value);
|
||||
}
|
||||
return executeUpdate(query);
|
||||
}
|
||||
}
|
||||
0
vasc-xpql-ejb3/src/main/resources/.empty
Normal file
0
vasc-xpql-ejb3/src/main/resources/.empty
Normal file
0
vasc-xpql-ejb3/src/test/java/.empty
Normal file
0
vasc-xpql-ejb3/src/test/java/.empty
Normal file
0
vasc-xpql-ejb3/src/test/resources/.empty
Normal file
0
vasc-xpql-ejb3/src/test/resources/.empty
Normal file
Loading…
Add table
Add a link
Reference in a new issue