001: package liquibase.change;
002:
003: import liquibase.database.Database;
004: import liquibase.database.sql.AddDefaultValueStatement;
005: import liquibase.database.sql.SqlStatement;
006: import liquibase.database.structure.Column;
007: import liquibase.database.structure.DatabaseObject;
008: import liquibase.database.structure.Table;
009: import liquibase.exception.UnsupportedChangeException;
010: import liquibase.util.ISODateFormat;
011: import org.w3c.dom.Document;
012: import org.w3c.dom.Element;
013:
014: import java.text.NumberFormat;
015: import java.text.ParseException;
016: import java.util.Arrays;
017: import java.util.HashSet;
018: import java.util.Set;
019:
020: /**
021: * Sets a new default value to an existing column.
022: */
023: public class AddDefaultValueChange extends AbstractChange {
024:
025: private String schemaName;
026: private String tableName;
027: private String columnName;
028: private String defaultValue;
029: private String defaultValueNumeric;
030: private String defaultValueDate;
031: private Boolean defaultValueBoolean;
032:
033: public AddDefaultValueChange() {
034: super ("addDefaultValue", "Add Default Value");
035: }
036:
037: public String getSchemaName() {
038: return schemaName;
039: }
040:
041: public void setSchemaName(String schemaName) {
042: this .schemaName = schemaName;
043: }
044:
045: public String getTableName() {
046: return tableName;
047: }
048:
049: public void setTableName(String tableName) {
050: this .tableName = tableName;
051: }
052:
053: public String getColumnName() {
054: return columnName;
055: }
056:
057: public void setColumnName(String columnName) {
058: this .columnName = columnName;
059: }
060:
061: public String getDefaultValue() {
062: return defaultValue;
063: }
064:
065: public void setDefaultValue(String defaultValue) {
066: this .defaultValue = defaultValue;
067: }
068:
069: public String getDefaultValueNumeric() {
070: return defaultValueNumeric;
071: }
072:
073: public void setDefaultValueNumeric(String defaultValueNumeric) {
074: this .defaultValueNumeric = defaultValueNumeric;
075: }
076:
077: public String getDefaultValueDate() {
078: return defaultValueDate;
079: }
080:
081: public void setDefaultValueDate(String defaultValueDate) {
082: this .defaultValueDate = defaultValueDate;
083: }
084:
085: public Boolean getDefaultValueBoolean() {
086: return defaultValueBoolean;
087: }
088:
089: public void setDefaultValueBoolean(Boolean defaultValueBoolean) {
090: this .defaultValueBoolean = defaultValueBoolean;
091: }
092:
093: public SqlStatement[] generateStatements(Database database)
094: throws UnsupportedChangeException {
095: Object defaultValue = null;
096: try {
097: if (getDefaultValue() != null) {
098: defaultValue = getDefaultValue();
099: } else if (getDefaultValueBoolean() != null) {
100: defaultValue = Boolean
101: .valueOf(getDefaultValueBoolean());
102: } else if (getDefaultValueNumeric() != null) {
103: defaultValue = NumberFormat.getInstance().parse(
104: getDefaultValueNumeric());
105: } else if (getDefaultValueDate() != null) {
106: defaultValue = new ISODateFormat()
107: .parse(getDefaultValueDate());
108: }
109: } catch (ParseException e) {
110: throw new RuntimeException(e);
111: }
112:
113: return new SqlStatement[] { new AddDefaultValueStatement(
114: getSchemaName() == null ? database
115: .getDefaultSchemaName() : getSchemaName(),
116: getTableName(), getColumnName(), defaultValue) };
117: }
118:
119: protected Change[] createInverses() {
120: DropDefaultValueChange inverse = new DropDefaultValueChange();
121: inverse.setSchemaName(getSchemaName());
122: inverse.setTableName(getTableName());
123: inverse.setColumnName(getColumnName());
124:
125: return new Change[] { inverse };
126: }
127:
128: public String getConfirmationMessage() {
129: return "Default value added to " + getTableName() + "."
130: + getColumnName();
131: }
132:
133: public Element createNode(Document currentChangeLogFileDOM) {
134: Element node = currentChangeLogFileDOM
135: .createElement(getTagName());
136: if (getSchemaName() != null) {
137: node.setAttribute("schemaName", getSchemaName());
138: }
139: node.setAttribute("tableName", getTableName());
140: node.setAttribute("columnName", getColumnName());
141: if (getDefaultValue() != null) {
142: node.setAttribute("defaultValue", getDefaultValue());
143: }
144: if (getDefaultValueNumeric() != null) {
145: node.setAttribute("defaultValueNumeric",
146: getDefaultValueNumeric());
147: }
148: if (getDefaultValueDate() != null) {
149: node
150: .setAttribute("defaultValueDate",
151: getDefaultValueDate());
152: }
153: if (getDefaultValueBoolean() != null) {
154: node.setAttribute("defaultValueBoolean",
155: getDefaultValueBoolean().toString());
156: }
157:
158: return node;
159: }
160:
161: public Set<DatabaseObject> getAffectedDatabaseObjects() {
162: Column column = new Column();
163:
164: Table table = new Table(getTableName());
165: column.setTable(table);
166:
167: column.setName(columnName);
168:
169: return new HashSet<DatabaseObject>(Arrays.asList(table, column));
170:
171: }
172:
173: }
|