package eu.play_project.dcep.distributedetalis.persistence; import java.io.File; import java.io.Serializable; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.HashSet; import java.util.Set; public class Sqlite implements Persistence { private Connection sqliteConn; final String sqliteTable = "subscriptionsEc"; public Sqlite() throws PersistenceException { this( new File(System.getProperty("java.io.tmpdir") + File.pathSeparator + "play-dcep" + File.pathSeparator + "dcep.db")); // TODO stuehmer: this should be unique for more than one Detalis instance per machine } public Sqlite(File dbFile) throws PersistenceException { try { Class.forName(org.sqlite.JDBC.class.getName()); sqliteConn = DriverManager.getConnection("jdbc:sqlite:" + dbFile.getPath()); sqliteConn.setAutoCommit(true); Statement stat = sqliteConn.createStatement(); stat.executeUpdate(String.format("CREATE TABLE IF NOT EXISTS %s (cloudId, subscriptionId);", sqliteTable)); // if not exists } catch (ClassNotFoundException e) { throw new PersistenceException("Error retrieving old subscriptions from database.", e); } catch (SQLException e) { throw new PersistenceException("Error retrieving old subscriptions from database.", e); } } /* (non-Javadoc) * @see eu.play_project.dcep.distributedetalis.persistence.Persistence#storeSubscription(java.lang.String, java.lang.String) */ @Override public void storeSubscription(String cloudId, String subscriptionId) { try { sqliteConn.createStatement().execute( String.format("INSERT INTO %s VALUES ('%s', '%s');", sqliteTable, cloudId, subscriptionId)); } catch (SQLException e) { e.printStackTrace(); } } /* (non-Javadoc) * @see eu.play_project.dcep.distributedetalis.persistence.Persistence#deleteAllSubscriptions() */ @Override public void deleteAllSubscriptions() { try { sqliteConn.createStatement().execute(String.format("DELETE FROM %s;", sqliteTable)); } catch (SQLException e) { e.printStackTrace(); } } /* (non-Javadoc) * @see eu.play_project.dcep.distributedetalis.persistence.Persistence#getSubscriptions() */ @Override public Set<SubscriptionPerCloud> getSubscriptions() throws PersistenceException { Set<SubscriptionPerCloud> persistedSubscriptions = new HashSet<SubscriptionPerCloud>(); try { ResultSet rs = sqliteConn.createStatement().executeQuery( String.format("SELECT cloudId, subscriptionId FROM %s;", sqliteTable)); while (rs.next()) { final String cloudId = rs.getString("cloudId"); final String subscriptionId = rs.getString("subscriptionId"); persistedSubscriptions.add(new SubscriptionPerCloud(cloudId, subscriptionId)); } rs.close(); } catch (SQLException e) { throw new PersistenceException( "Error retrieving old subscriptions from database.", e); } return persistedSubscriptions; } public class SubscriptionPerCloud implements Serializable { private static final long serialVersionUID = 100L; public SubscriptionPerCloud(String cloudId, String subscriptionId) { this.subscriptionId = subscriptionId; this.cloudId = cloudId; } public String subscriptionId; public String cloudId; } }