1 16 package scriptella.driver.janino; 17 18 import scriptella.spi.AbstractConnection; 19 import scriptella.spi.ConnectionParameters; 20 import scriptella.spi.ParametersCallback; 21 import scriptella.spi.ProviderException; 22 import scriptella.spi.QueryCallback; 23 import scriptella.spi.Resource; 24 25 32 public class JaninoConnection extends AbstractConnection { 33 private CodeCompiler compiler = new CodeCompiler(); 34 35 39 public JaninoConnection(ConnectionParameters parameters) { 40 super(Driver.DIALECT_IDENTIFIER, parameters); 41 } 42 43 public void executeScript(Resource scriptContent, ParametersCallback parametersCallback) throws ProviderException { 44 JaninoScript s = compiler.compileScript(scriptContent); 45 s.setParametersCallback(parametersCallback); 46 try { 47 s.execute(); 48 } catch (Exception e) { 49 throw guessErrorStatement(new JaninoProviderException( 50 "Script execution failed due to exception",e), scriptContent, s.getClass()); 51 } finally { 52 s.setParametersCallback(null); 54 } 55 } 56 57 66 public void executeQuery(Resource queryContent, ParametersCallback parametersCallback, QueryCallback queryCallback) throws ProviderException { 67 68 JaninoQuery q = compiler.compileQuery(queryContent); 69 q.setParametersCallback(parametersCallback); 70 q.setQueryCallback(queryCallback); 71 try { 72 q.execute(); 73 } catch (Exception e) { 74 throw guessErrorStatement(new JaninoProviderException( 75 "Query execution failed due to exception",e), queryContent, q.getClass()); 76 } finally { 77 q.setParametersCallback(null); 79 q.setQueryCallback(null); 80 } 81 } 82 83 91 private static JaninoProviderException guessErrorStatement(JaninoProviderException e, Resource content, Class scriptClass) { 92 Throwable ex = e.getCause(); 93 StackTraceElement [] trace = ex.getStackTrace(); 94 final String scriptClassName = scriptClass.getName(); 95 for (StackTraceElement el : trace) { String className = el.getClassName(); 97 if (scriptClassName.equals(className)) { 98 String st = CodeCompiler.getLine(content, el.getLineNumber()); 99 e.setErrorStatement(st); 100 break; 101 } 102 103 } 104 return e; 105 } 106 107 110 public void close() throws ProviderException { 111 compiler=null; 112 } 113 114 } 115 | Popular Tags |