1 25 26 27 28 package org.nemesis.forum.impl; 29 30 import java.sql.Connection ; 31 import java.sql.PreparedStatement ; 32 import java.sql.ResultSet ; 33 import java.util.HashMap ; 34 35 import org.apache.commons.logging.Log; 36 import org.apache.commons.logging.LogFactory; 37 import org.nemesis.forum.util.jdbc.DbConnectionManager; 38 39 51 public class DbSequenceManager { 52 static protected Log log = LogFactory.getLog(DbSequenceManager.class); 53 private static final String NEXT_FORUM_ID = "SELECT max(forumID) FROM yazdForum"; 54 private static final String NEXT_THREAD_ID = "SELECT max(threadID) FROM yazdThread"; 55 private static final String NEXT_MESSAGE_ID = "SELECT max(messageID) FROM yazdMessage"; 56 private static final String NEXT_GROUP_ID = "SELECT max(groupID) FROM yazdGroup"; 57 private static final String NEXT_USER_ID = "SELECT max(userID) FROM yazdUser"; 58 59 62 private static DbSequenceManager sequenceManager = null; 63 64 67 private static Object initLock = new Object (); 68 69 75 public static int nextID(String type) { 76 if (sequenceManager == null) { 77 synchronized(initLock) { 78 if (sequenceManager == null) { 79 sequenceManager = new DbSequenceManager(); 80 } 81 } 82 } 83 return sequenceManager.nextUniqueID(type); 84 } 85 86 private HashMap uniqueIDCounters; 87 88 91 public DbSequenceManager() { 92 uniqueIDCounters = new HashMap (); 93 uniqueIDCounters.put("Forum", new Counter(getNextDbID(NEXT_FORUM_ID))); 95 uniqueIDCounters.put("ForumThread", new Counter(getNextDbID(NEXT_THREAD_ID))); 97 uniqueIDCounters.put("ForumMessage", new Counter(getNextDbID(NEXT_MESSAGE_ID))); 99 uniqueIDCounters.put("Group", new Counter(getNextDbID(NEXT_GROUP_ID))); 101 uniqueIDCounters.put("User", new Counter(getNextDbID(NEXT_USER_ID))); 103 } 104 105 115 public int nextUniqueID(String counterName) { 116 Counter counter = (Counter)uniqueIDCounters.get(counterName); 117 return counter.next(); 118 } 119 120 125 private int getNextDbID(String query) { 126 int currentID = 0; 127 Connection con = null; 128 PreparedStatement pstmt = null; 129 130 try { 131 con = DbConnectionManager.getConnection(); 132 pstmt = con.prepareStatement(query); 133 ResultSet rs = pstmt.executeQuery(); 134 rs.next(); 135 currentID = rs.getInt(1); 136 } 137 catch( Exception sqle ) { 138 log.error("Error in DbSequenceManager:getNextDbID()-" , sqle); 139 140 } 141 finally { 142 try { pstmt.close(); } 143 catch (Exception e) { log.error("" , e); } 144 try { con.close(); } 145 catch (Exception e) { log.error("" , e); } 146 } 147 if (currentID < 0) { 149 currentID = 0; 150 } 151 return currentID; 152 } 153 154 157 private final class Counter { 158 159 private int count; 160 161 public Counter(int currentCount) { 162 count = currentCount; 163 } 164 165 public final synchronized int next() { 166 return (++count); 167 } 168 } 169 } 170 | Popular Tags |