/* * Copyright (c) 2004, 2005, 2006 TADA AB - Taby Sweden * Distributed under the terms shown in the file COPYRIGHT * found in the root directory of this distribution or at * http://eng.tada.se/osprojects/COPYRIGHT.html */ package org.postgresql.pljava.tasks; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.tools.ant.BuildException; public class JarLoaderTask extends PLJavaTask { private boolean m_deploy = true; private boolean m_reload = false; private File m_file; private String m_name; private String m_schema; public void execute() throws BuildException { if(m_file == null) throw new BuildException("file must be set", this.getLocation()); if(m_name == null) throw new BuildException("name must be set", this.getLocation()); InputStream in = null; byte[] image; try { int count; in = new FileInputStream(m_file); ByteArrayOutputStream bld = new ByteArrayOutputStream(); byte[] buf = new byte[0x1000]; while((count = in.read(buf)) > 0) bld.write(buf, 0, count); image = bld.toByteArray(); } catch(IOException e) { throw new BuildException("Unable to read file " + m_file, e, this.getLocation()); } finally { if(in != null) try { in.close(); } catch(IOException e) {} } ResultSet rs = null; PreparedStatement stmt = null; Connection conn = this.getConnection(); try { stmt = conn.prepareStatement(m_reload ? "SELECT sqlj.replace_jar(?, ?, ?)" : "SELECT sqlj.install_jar(?, ?, ?)"); stmt.setBytes(1, image); stmt.setString(2, m_name); stmt.setBoolean(3, m_deploy); stmt.executeQuery().close(); if(m_schema != null) { boolean found = false; stmt.close(); stmt = null; stmt = conn.prepareStatement("SELECT sqlj.get_classpath(?)"); stmt.setString(1, m_schema); rs = stmt.executeQuery(); String path = null; if(!rs.next()) { path = rs.getString(1); if(path != null) { String[] jars = path.split(":"); int idx = jars.length; while(--idx >= 0) if(jars[idx].equals(m_name)) { found = true; break; } } } rs.close(); rs = null; if(!found) { if(path != null && path.length() > 0) path = path + ":" + m_name; else path = m_name; stmt.close(); stmt = null; stmt = conn.prepareStatement("SELECT sqlj.set_classpath(?, ?)"); stmt.setString(1, m_schema); stmt.setString(2, path); stmt.executeQuery().close(); } } conn.commit(); } catch(SQLException e) { try { conn.rollback(); } catch(SQLException e2) {} throw new BuildException("Unable to do install_jar: " + e.getMessage(), e, this.getLocation()); } finally { if(rs != null) try { rs.close(); } catch(SQLException e) {} if(stmt != null) try { stmt.close(); } catch(SQLException e) {} try { conn.close(); } catch(SQLException ingore) {} } } public final boolean isDeploy() { return m_deploy; } public final void setDeploy(boolean deploy) { m_deploy = deploy; } public final File getFile() { return m_file; } public final void setFile(File file) { m_file = file; } public final String getName() { return m_name; } public final void setName(String name) { m_name = name; } public final boolean isReload() { return m_reload; } public final void setReload(boolean reload) { m_reload = reload; } public final String getSchema() { return m_schema; } public final void setSchema(String schema) { m_schema = schema; } }