001 package biz.hammurapi.sql; 002 003 import java.sql.Connection; 004 import java.sql.SQLException; 005 import java.text.MessageFormat; 006 007 /** 008 * Generates identities using SQLProcessor nextPK method 009 * @author Pavel Vlasov 010 * 011 */ 012 public class OracleSequenceIdentityGenerator implements IdentityGenerator { 013 014 /** 015 * Default constructor with "{0}_SEQ" pattern 016 */ 017 public OracleSequenceIdentityGenerator() { 018 this("{0}_SEQ"); 019 } 020 021 private int mode; // 0 - passthrough 1 - invariant 2 - format 022 private String seqName; 023 private MessageFormat mf; 024 private Object[] args=new Object[] {null}; 025 026 /** 027 * Constructor 028 * @param pattern - Key name pattern. {0} stands for table name. 029 */ 030 public OracleSequenceIdentityGenerator(String pattern) { 031 if ("{0}".equals(pattern)) { 032 mode=0; 033 } else if (pattern.indexOf("{0}")==-1) { 034 mode=1; 035 this.seqName=pattern; 036 } else { 037 mode=2; 038 mf=new MessageFormat(pattern); 039 } 040 } 041 042 public int generate(Connection con, String name) throws SQLException { 043 String ename; 044 switch (mode) { 045 case 0: 046 ename=name+"_SEQ"; 047 break; 048 case 1: 049 ename=seqName; 050 break; 051 case 2: 052 synchronized (mf) { 053 args[0]=name; 054 ename=mf.format(args, new StringBuffer(), null).toString(); 055 } 056 default: 057 throw new IllegalStateException("Invalid mode: "+mode); 058 } 059 060 return new SQLProcessor(con, null).projectSingleInt("SELECT "+ename+".NEXTVAL FROM DUAL", null); 061 } 062 063 }