001    package biz.hammurapi.sql.syntax;
002    
003    import java.io.Serializable;
004    import java.sql.PreparedStatement;
005    import java.sql.SQLException;
006    import java.util.ArrayList;
007    import java.util.Arrays;
008    import java.util.Iterator;
009    import java.util.List;
010    
011    public class And implements StatementFragment, Serializable {
012            
013            private List fragments = new ArrayList();
014    
015            public And(List fragments) {            
016                    this.fragments.addAll(fragments);
017            }
018    
019            public And(StatementFragment[] fragments) {
020                    this.fragments.addAll(Arrays.asList(fragments));
021            }
022            
023            public And() {
024                    // Empty AND
025            }
026            
027            public void add(StatementFragment fragment) {
028                    fragments.add(fragment);
029            }
030            
031            public int parameterize(PreparedStatement statement, int idx) throws SQLException {
032                    Iterator it = fragments.iterator();
033                    while (it.hasNext()) {
034                            idx = ((StatementFragment) it.next()).parameterize(statement, idx);
035                    }
036                    
037                    return idx;
038            }
039    
040            public String toSqlString() {
041                    StringBuffer ret = new StringBuffer();
042                    Iterator it = fragments.iterator();
043                    while (it.hasNext()) {
044                            Object next = it.next();
045                            if (next instanceof Or) {
046                                    ret.append("(");
047                                    ret.append(((Or) next).toSqlString());
048                                    ret.append(")");
049                            } else {
050                                    ret.append(((StatementFragment) next).toSqlString());
051                            }
052                            
053                            if (it.hasNext()) {
054                                    ret.append(" AND ");
055                            }
056                            
057                    }
058                    
059                    return ret.toString();
060            }
061    
062            public int hashCode() {
063                    final int prime = 31;
064                    int result = 1;
065                    result = prime * result
066                                    + ((fragments == null) ? 0 : fragments.hashCode());
067                    return result;
068            }
069    
070            public boolean equals(Object obj) {
071                    if (this == obj)
072                            return true;
073                    if (obj == null)
074                            return false;
075                    if (getClass() != obj.getClass())
076                            return false;
077                    final And other = (And) obj;
078                    if (fragments == null) {
079                            if (other.fragments != null)
080                                    return false;
081                    } else if (!fragments.equals(other.fragments))
082                            return false;
083                    return true;
084            }
085    }