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    }