package org.cagrid.gaards.dorian.service; import gov.nih.nci.cagrid.common.FaultHelper; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.cagrid.gaards.dorian.Metadata; import org.cagrid.gaards.dorian.common.LoggingObject; import org.cagrid.gaards.dorian.stubs.types.DorianInternalFault; import org.cagrid.tools.database.Database; /** * @author <A href="mailto:langella@bmi.osu.edu">Stephen Langella </A> * @author <A href="mailto:oster@bmi.osu.edu">Scott Oster </A> * @author <A href="mailto:hastings@bmi.osu.edu">Shannon Hastings </A> * @version $Id: ArgumentManagerTable.java,v 1.2 2004/10/15 16:35:16 langella * Exp $ */ public class MetadataManager extends LoggingObject { private Database db; private boolean dbBuilt = false; private String table; public MetadataManager(Database db, String table) { this.db = db; this.table = table; } public boolean exists(String name) throws DorianInternalFault { this.buildDatabase(); Connection c = null; boolean exists = false; try { c = db.getConnection(); PreparedStatement s = c.prepareStatement("select count(*) from " + table + " where name= ?"); s.setString(1, name); ResultSet rs = s.executeQuery(); if (rs.next()) { int count = rs.getInt(1); if (count > 0) { exists = true; } } rs.close(); s.close(); } catch (Exception e) { logError(e.getMessage(), e); DorianInternalFault fault = new DorianInternalFault(); fault.setFaultString("Unexpected Database Error, could not determine if the metadata " + name + " exists."); FaultHelper helper = new FaultHelper(fault); helper.addFaultCause(e); fault = (DorianInternalFault) helper.getFault(); throw fault; } finally { db.releaseConnection(c); } return exists; } public synchronized void insert(Metadata metadata) throws DorianInternalFault { this.buildDatabase(); Connection c = null; try { if (!exists(metadata.getName())) { c = db.getConnection(); PreparedStatement s = c.prepareStatement("INSERT INTO " + table + " SET NAME= ?, DESCRIPTION= ?, VALUE= ?"); s.setString(1, metadata.getName()); s.setString(2, metadata.getDescription()); s.setString(3, metadata.getValue()); s.execute(); } else { DorianInternalFault fault = new DorianInternalFault(); fault.setFaultString("Could not insert the metadata " + metadata.getName() + " because it already exists."); throw fault; } } catch (Exception e) { logError(e.getMessage(), e); DorianInternalFault fault = new DorianInternalFault(); fault.setFaultString("Unexpected Database Error, could insert metadata!!!"); FaultHelper helper = new FaultHelper(fault); helper.addFaultCause(e); fault = (DorianInternalFault) helper.getFault(); throw fault; } finally { db.releaseConnection(c); } } public synchronized void update(Metadata metadata) throws DorianInternalFault { this.buildDatabase(); Connection c = null; try { if (exists(metadata.getName())) { c = db.getConnection(); PreparedStatement s = c.prepareStatement("UPDATE " + table + " SET DESCRIPTION= ?, VALUE= ? WHERE NAME= ?"); s.setString(1, metadata.getDescription()); s.setString(2, metadata.getValue()); s.setString(3, metadata.getName()); s.execute(); } else { insert(metadata); } } catch (Exception e) { logError(e.getMessage(), e); DorianInternalFault fault = new DorianInternalFault(); fault.setFaultString("Unexpected Database Error, could update metadata!!!"); FaultHelper helper = new FaultHelper(fault); helper.addFaultCause(e); fault = (DorianInternalFault) helper.getFault(); throw fault; } finally { db.releaseConnection(c); } } public synchronized void remove(String name) throws DorianInternalFault { this.buildDatabase(); Connection c = null; try { c = db.getConnection(); PreparedStatement s = c.prepareStatement("DELETE FROM " + table + " WHERE NAME= ?"); s.setString(1, name); s.execute(); } catch (Exception e) { logError(e.getMessage(), e); DorianInternalFault fault = new DorianInternalFault(); fault.setFaultString("Unexpected Database Error, could remove metadata!!!"); FaultHelper helper = new FaultHelper(fault); helper.addFaultCause(e); fault = (DorianInternalFault) helper.getFault(); throw fault; } finally { db.releaseConnection(c); } } public Metadata get(String name) throws DorianInternalFault { this.buildDatabase(); Connection c = null; String value = null; String description = null; try { c = db.getConnection(); PreparedStatement s = c.prepareStatement("select DESCRIPTION,VALUE from " + table + " where name= ?"); s.setString(1, name); ResultSet rs = s.executeQuery(); if (rs.next()) { value = rs.getString("VALUE"); description = rs.getString("DESCRIPTION"); } rs.close(); s.close(); } catch (Exception e) { logError(e.getMessage(), e); DorianInternalFault fault = new DorianInternalFault(); fault.setFaultString("Unexpected Database Error, obtain the metadata " + name + "."); FaultHelper helper = new FaultHelper(fault); helper.addFaultCause(e); fault = (DorianInternalFault) helper.getFault(); throw fault; } finally { db.releaseConnection(c); } if (value == null) { return null; } else { Metadata metadata = new Metadata(); metadata.setName(name); metadata.setValue(value); metadata.setDescription(description); return metadata; } } public void clearDatabase() throws DorianInternalFault { this.buildDatabase(); try { db.update("DELETE FROM " + table); } catch (Exception e) { logError(e.getMessage(), e); DorianInternalFault fault = new DorianInternalFault(); fault.setFaultString("Unexpected Database Error."); FaultHelper helper = new FaultHelper(fault); helper.addFaultCause(e); fault = (DorianInternalFault) helper.getFault(); throw fault; } } private void buildDatabase() throws DorianInternalFault { try { if (!dbBuilt) { if (!this.db.tableExists(table)) { String applications = "CREATE TABLE " + table + " (" + "NAME VARCHAR(255) NOT NULL PRIMARY KEY," + "DESCRIPTION TEXT," + "VALUE TEXT NOT NULL," + "INDEX document_index (NAME));"; db.update(applications); } this.dbBuilt = true; } } catch (Exception e) { logError(e.getMessage(), e); DorianInternalFault fault = new DorianInternalFault(); fault.setFaultString("Unexpected Database Error."); FaultHelper helper = new FaultHelper(fault); helper.addFaultCause(e); fault = (DorianInternalFault) helper.getFault(); throw fault; } } }