package org.t4f.msc.db.dao; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import java.util.regex.Pattern; import org.t4f.msc.db.ConnectionManager; import org.t4f.msc.model.Subscriber; public class SubscriberDAO { private final static Logger LOGGER = Logger.getLogger("POCSAG-MSC"); private static final String QUERY_CREATE_TABLE = "CREATE TABLE SUBSCRIBERS" + "(ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)," + "NICKNAME VARCHAR(20) NOT NULL UNIQUE, REALNAME VARCHAR(100), RIC INTEGER NOT NULL, " + " FREQUENCY INTEGER NOT NULL, BAUDS SMALLINT NOT NULL, CONSTRAINT PRIMARY_KEY_SUBSCRIBERS PRIMARY KEY (ID))"; private static final String QUERY_DROP_TABLE = "DROP TABLE SUBSCRIBERS"; private static final String QUERY_CREATE = "INSERT INTO SUBSCRIBERS (NICKNAME, REALNAME, RIC, FREQUENCY," + " BAUDS) VALUES (?,?,?,?,?)"; private static final String QUERY_READ = "SELECT * FROM SUBSCRIBERS WHERE ID = ?"; private static final String QUERY_UPDATE = "UPDATE SUBSCRIBERS SET NICKNAME=?, REALNAME=?, RIC=?, FREQUENCY=?," + " BAUDS=? WHERE ID =?"; private static final String QUERY_DELETE = "DELETE FROM SUBSCRIBERS WHERE ID = ?"; private static final String QUERY_FIND = "SELECT * FROM SUBSCRIBERS WHERE UPPER(NICKNAME) LIKE ? " + "AND UPPER(REALNAME) LIKE ? AND CHAR(RIC) LIKE ? AND CHAR(FREQUENCY) LIKE ? AND CHAR(BAUDS) LIKE ?"; private static final String QUERY_FIND_BY_GROUPID = "SELECT s.* FROM SUBSCRIBERS s, SUBSCRIBER_SUBSCRIBERS_GROUPS ssg where s.ID = ssg.ID_SUBSCRIBER and ssg.ID_SUBSCRIBERS_GROUP = ?"; public boolean existTable() { try { return ConnectionManager.checkTableExist("SUBSCRIBERS"); } catch (SQLException e) { LOGGER.warning("Can't access DB to check if table NODES if exists\n" + e.toString()); return false; } } public boolean createTable() { LOGGER.info("Creating table SUBSCRIBER"); try { Connection conn = ConnectionManager.getConnection(); Statement st = conn.createStatement(); st.executeUpdate(QUERY_CREATE_TABLE); st.close(); conn.close(); return false; } catch (SQLException e) { LOGGER.warning("Can't create table SUBSCRIBERS\n" + e.toString()); return true; } } public boolean dropTable() { LOGGER.info("Dropping table SUBSCRIBER"); try { Connection conn = ConnectionManager.getConnection(); Statement st = conn.createStatement(); st.executeUpdate(QUERY_DROP_TABLE); st.close(); conn.close(); return false; } catch (SQLException e) { LOGGER.warning("Can't drop table SUBSCRIBERS\n" + e.toString()); return true; } } public boolean create(Subscriber subscriber) { LOGGER.finest("Inserting into table SUBSCRIBER:\n" + subscriber.toString()); try { String query = QUERY_CREATE.replaceFirst(Pattern.quote("?"), "'" + subscriber.getNickName() + "'"); query = query.replaceFirst(Pattern.quote("?"),"'" + subscriber.getRealName() + "'"); query = query.replaceFirst(Pattern.quote("?"), "" + subscriber.getRIC()); query = query.replaceFirst(Pattern.quote("?"), "" + subscriber.getFrequency()); query = query.replaceFirst(Pattern.quote("?"), "" + subscriber.getBauds()); Connection conn = ConnectionManager.getConnection(); Statement st = conn.createStatement(); int result = st.executeUpdate(query); st.close(); conn.close(); return (result==0); } catch (SQLException e) { LOGGER.severe("Can't insert into table SUBSCRIBERS.\n" + e.toString()); return true; } } public Subscriber read(int id) { LOGGER.finest("Reading from table SUBSCRIBER for subscriber with ID " + id); try { String query = QUERY_READ.replaceFirst(Pattern.quote("?"), "" + id); Connection conn = ConnectionManager.getConnection(); Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(query); if (rs.next()) { Subscriber s = rs2Subscriber(rs); rs.close(); st.close(); conn.close(); return s; } else return null; } catch (SQLException e) { LOGGER.finest("Can't read from table SUBSCRIBERS.\n" + e.toString()); return null; } } public boolean update(Subscriber subscriber) { LOGGER.finest("Updating in table SUBSCRIBER:\n" + subscriber.toString()); try { String query = QUERY_UPDATE.replaceFirst(Pattern.quote("?"), "'" + subscriber.getNickName() + "'"); query = query.replaceFirst(Pattern.quote("?"),"'" + subscriber.getRealName() + "'"); query = query.replaceFirst(Pattern.quote("?"), "" + subscriber.getRIC()); query = query.replaceFirst(Pattern.quote("?"), "" + subscriber.getFrequency()); query = query.replaceFirst(Pattern.quote("?"), "" + subscriber.getBauds()); query = query.replaceFirst(Pattern.quote("?"), "" + subscriber.getId()); Connection conn = ConnectionManager.getConnection(); Statement st = conn.createStatement(); int result = st.executeUpdate(query); st.close(); conn.close(); return (result==0); } catch (SQLException e) { LOGGER.severe("Can't update in table SUBSCRIBERS.\n" + e.toString()); return true; } } public boolean delete(int id) { LOGGER.finest("Deleting from table SUBSCRIBER subscriber with id " + id); try { String query = QUERY_DELETE.replaceFirst(Pattern.quote("?"), "" + id); Connection conn = ConnectionManager.getConnection(); Statement st = conn.createStatement(); int result = st.executeUpdate(query); st.close(); conn.close(); return (result==0); } catch (SQLException e) { LOGGER.severe("Can't delete in table SUBSCRIBERS.\n" + e.toString()); return true; } } public boolean delete(Subscriber subscriber) { return delete(subscriber.getId()); } public List<Subscriber> find(Subscriber subscriber) { LOGGER.finest("Finding in table SUBSCRIBER for subscribers that match: " + subscriber); ArrayList<Subscriber> list = new ArrayList<Subscriber>(); String nickName = subscriber.getNickName(); nickName = (nickName == null || nickName.equals("")) ? "%" : nickName.toUpperCase().replace("*", "%"); String realName = subscriber.getRealName(); realName = (realName == null || realName.equals("")) ? "%" : realName.toUpperCase().replace("*", "%"); String RIC = (subscriber.getRIC() == null) ? "%" : subscriber.getRIC().toString(); String frequency = (subscriber.getFrequency() == null) ? "%" : subscriber.getFrequency().toString(); String bauds = (subscriber.getBauds() == null) ? "%" : subscriber.getBauds().toString(); try { String query = QUERY_FIND.replaceFirst(Pattern.quote("?"), "'" + nickName + "'"); query = query.replaceFirst(Pattern.quote("?"),"'" + realName + "'"); query = query.replaceFirst(Pattern.quote("?"), "'" + RIC + "'"); query = query.replaceFirst(Pattern.quote("?"), "'" + frequency + "'"); query = query.replaceFirst(Pattern.quote("?"), "'" + bauds + "'"); Connection conn = ConnectionManager.getConnection(); Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(query); while (rs.next()) { list.add(rs2Subscriber(rs)); } rs.close(); st.close(); conn.close(); return list; } catch (SQLException e) { LOGGER.finest("Can't find in table SUBSCRIBERS.\n" + e.toString()); return null; } } public List<Subscriber> findByGroupId(int groupId) { LOGGER.finest("Finding subscribers in table SUBSCRIBERS_GROUPS for group id = " + groupId); ArrayList<Subscriber> list = new ArrayList<Subscriber>(); String query = QUERY_FIND_BY_GROUPID.replaceFirst(Pattern.quote("?"), "" + groupId); try { Connection conn = ConnectionManager.getConnection(); Statement st = conn.createStatement(); LOGGER.finest("Executing query: " + query); ResultSet rs = st.executeQuery(query); while (rs.next()) { list.add(rs2Subscriber(rs)); } rs.close(); st.close(); conn.close(); return list; } catch (SQLException e) { LOGGER.finest("Can't get elements in table SUBSCRIBERS_GROUPS.\n" + e.toString()); return null; } } private Subscriber rs2Subscriber(ResultSet rs) throws SQLException { Subscriber subscriber = new Subscriber(); subscriber.setId(rs.getInt("ID")); subscriber.setNickName(rs.getString("NICKNAME")); subscriber.setRealName(rs.getString("REALNAME")); subscriber.setRIC(rs.getInt("RIC")); subscriber.setFrequency(rs.getInt("FREQUENCY")); subscriber.setBauds(rs.getInt("BAUDS")); return subscriber; } }