/*
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.hibernate.eclipse.console.common;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.hibernate.console.AbstractQueryPage;
import org.hibernate.console.ConsoleMessages;
import org.hibernate.console.QueryInputModel;
import org.jboss.tools.hibernate.runtime.spi.ICriteria;
import org.jboss.tools.hibernate.runtime.spi.ISession;
import bsh.EvalError;
import bsh.Interpreter;
/**
* @author MAX
*
*
*/
public class JavaPage extends AbstractQueryPage {
private String criteriaCode;
ICriteria criteria = null;
private Interpreter ip;
/**
* @param model
* @param session2
*/
public JavaPage(HibernateExtension extension, String criteriaCode, QueryInputModel model) {
super(extension, model);
this.criteriaCode = criteriaCode;
setTabName(getQueryString().replace('\n', ' ').replace('\r', ' '));
}
@SuppressWarnings("unchecked")
@Override
public void setSession(ISession s) {
super.setSession(s);
try {
if(criteriaCode.indexOf( "System.exit" )>=0) { // TODO: externalize run so we don't need this bogus check! //$NON-NLS-1$
list = Collections.emptyList();
addException( new IllegalArgumentException(ConsoleMessages.JavaPage_not_allowed) );
return;
}
ip = setupInterpreter(getSession());
Object o = ip.eval(criteriaCode);
// ugly! TODO: make un-ugly!
if(o instanceof ICriteria) {
criteria = (ICriteria) o;
if(model.getMaxResults()!=null) {
criteria.setMaxResults( model.getMaxResults().intValue() );
}
} else if (o instanceof List<?>) {
list = (List<Object>) o;
if(model.getMaxResults()!=null) {
list = list.subList( 0, Math.min( list.size(), model.getMaxResults().intValue() ) );
}
} else {
list = new ArrayList<Object>();
list.add(o);
}
}
catch (EvalError e) {
addException(e);
}
catch (RuntimeException e) {
addException(e);
}
}
private Interpreter setupInterpreter(ISession session) throws EvalError, RuntimeException {
Interpreter interpreter = new Interpreter();
interpreter.set("session", session); //$NON-NLS-1$
interpreter.setClassLoader( Thread.currentThread().getContextClassLoader() );
Map<String, ?> map = session.getSessionFactory().getAllClassMetadata();
Iterator<String> iterator = map.keySet().iterator();
//TODO: filter non classes.
String imports = ""; //$NON-NLS-1$
while (iterator.hasNext() ) {
String element = iterator.next();
imports += "import " + element + ";\n"; //$NON-NLS-1$ //$NON-NLS-2$
}
imports += "import org.hibernate.criterion.*;\n"; //$NON-NLS-1$
imports += "import org.hibernate.*;\n"; //$NON-NLS-1$
// TODO: expose the parameters as values to be used in the code.
interpreter.eval(imports);
return interpreter;
}
public List<Object> getList() {
if(list!=null) return list;
try {
if(criteria!=null) {
long startTime = System.currentTimeMillis();
list = criteria.list();
queryTime = System.currentTimeMillis() - startTime;
}
else {
return Collections.emptyList();
}
}
catch (RuntimeException e) {
list = Collections.emptyList();
addException(e);
}
return list;
}
public List<String> getPathNames() {
List<String> l = new ArrayList<String>();
l.add(ConsoleMessages.JavaPage_no_info);
return l;
}
public String getQueryString() {
return criteriaCode;
}
public void setQueryString(String queryString) {
this.criteriaCode = queryString;
list = null;
ip = null;
}
public void release() {
if (((ISession)getSession()).isOpen() ) {
try {
((ISession)getSession()).close();
}
catch (RuntimeException e) {
exceptions.add(e);
}
}
}
}