1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portal.upgrade.util;
24  
25  import com.liferay.portal.kernel.util.Validator;
26  import com.liferay.portal.tools.comparator.ColumnsComparator;
27  import com.liferay.portal.upgrade.StagnantRowException;
28  
29  import java.sql.PreparedStatement;
30  import java.sql.ResultSet;
31  
32  import java.util.ArrayList;
33  import java.util.Arrays;
34  import java.util.List;
35  
36  /**
37   * <a href="DefaultUpgradeTableImpl.java.html"><b><i>View Source</i></b></a>
38   *
39   * @author Alexander Chow
40   * @author Bruno Farache
41   *
42   */
43  public class DefaultUpgradeTableImpl
44      extends BaseUpgradeTableImpl implements UpgradeTable {
45  
46      public DefaultUpgradeTableImpl(String tableName, Object[][] columns) {
47          this(tableName, columns, null);
48      }
49  
50      public DefaultUpgradeTableImpl(
51          String tableName, Object[][] columns, UpgradeColumn upgradeColumn1) {
52  
53          this(tableName, columns, upgradeColumn1, null);
54      }
55  
56      public DefaultUpgradeTableImpl(
57          String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
58          UpgradeColumn upgradeColumn2) {
59  
60          this(tableName, columns, upgradeColumn1, upgradeColumn2, null);
61      }
62  
63      public DefaultUpgradeTableImpl(
64          String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
65          UpgradeColumn upgradeColumn2, UpgradeColumn upgradeColumn3) {
66  
67          this(
68              tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
69              null);
70      }
71  
72      public DefaultUpgradeTableImpl(
73          String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
74          UpgradeColumn upgradeColumn2, UpgradeColumn upgradeColumn3,
75          UpgradeColumn upgradeColumn4) {
76  
77          this(
78              tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
79              upgradeColumn4, null);
80      }
81  
82      public DefaultUpgradeTableImpl(
83          String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
84          UpgradeColumn upgradeColumn2, UpgradeColumn upgradeColumn3,
85          UpgradeColumn upgradeColumn4, UpgradeColumn upgradeColumn5) {
86  
87          this(
88              tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
89              upgradeColumn4, upgradeColumn5, null);
90      }
91  
92      public DefaultUpgradeTableImpl(
93          String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
94          UpgradeColumn upgradeColumn2, UpgradeColumn upgradeColumn3,
95          UpgradeColumn upgradeColumn4, UpgradeColumn upgradeColumn5,
96          UpgradeColumn upgradeColumn6) {
97  
98          this(
99              tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
100             upgradeColumn4, upgradeColumn5, upgradeColumn6, null);
101     }
102 
103     public DefaultUpgradeTableImpl(
104         String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
105         UpgradeColumn upgradeColumn2, UpgradeColumn upgradeColumn3,
106         UpgradeColumn upgradeColumn4, UpgradeColumn upgradeColumn5,
107         UpgradeColumn upgradeColumn6, UpgradeColumn upgradeColumn7) {
108 
109         this(
110             tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
111             upgradeColumn4, upgradeColumn5, upgradeColumn6, upgradeColumn7,
112             null);
113     }
114 
115     public DefaultUpgradeTableImpl(
116         String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
117         UpgradeColumn upgradeColumn2, UpgradeColumn upgradeColumn3,
118         UpgradeColumn upgradeColumn4, UpgradeColumn upgradeColumn5,
119         UpgradeColumn upgradeColumn6, UpgradeColumn upgradeColumn7,
120         UpgradeColumn upgradeColumn8) {
121 
122         this(
123             tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
124             upgradeColumn4, upgradeColumn5, upgradeColumn6, upgradeColumn7,
125             upgradeColumn8, null);
126     }
127 
128     public DefaultUpgradeTableImpl(
129         String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
130         UpgradeColumn upgradeColumn2, UpgradeColumn upgradeColumn3,
131         UpgradeColumn upgradeColumn4, UpgradeColumn upgradeColumn5,
132         UpgradeColumn upgradeColumn6, UpgradeColumn upgradeColumn7,
133         UpgradeColumn upgradeColumn8, UpgradeColumn upgradeColumn9) {
134 
135         this(
136             tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
137             upgradeColumn4, upgradeColumn5, upgradeColumn6, upgradeColumn7,
138             upgradeColumn8, upgradeColumn9, null);
139     }
140 
141     public DefaultUpgradeTableImpl(
142         String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
143         UpgradeColumn upgradeColumn2, UpgradeColumn upgradeColumn3,
144         UpgradeColumn upgradeColumn4, UpgradeColumn upgradeColumn5,
145         UpgradeColumn upgradeColumn6, UpgradeColumn upgradeColumn7,
146         UpgradeColumn upgradeColumn8, UpgradeColumn upgradeColumn9,
147         UpgradeColumn upgradeColumn10) {
148 
149         super(tableName);
150 
151         // Sort the column names to ensure they're sorted based on the
152         // constructor's list of columns to upgrade. This is needed if you
153         // use TempUpgradeColumnImpl and need to ensure a column's temporary
154         // value is populated in the correct order.
155 
156         columns = columns.clone();
157 
158         List<String> sortedColumnNames = new ArrayList<String>();
159 
160         getSortedColumnName(sortedColumnNames, upgradeColumn1);
161         getSortedColumnName(sortedColumnNames, upgradeColumn2);
162         getSortedColumnName(sortedColumnNames, upgradeColumn3);
163         getSortedColumnName(sortedColumnNames, upgradeColumn4);
164         getSortedColumnName(sortedColumnNames, upgradeColumn5);
165         getSortedColumnName(sortedColumnNames, upgradeColumn6);
166         getSortedColumnName(sortedColumnNames, upgradeColumn7);
167         getSortedColumnName(sortedColumnNames, upgradeColumn8);
168         getSortedColumnName(sortedColumnNames, upgradeColumn9);
169         getSortedColumnName(sortedColumnNames, upgradeColumn10);
170 
171         if (sortedColumnNames.size() > 0) {
172             Arrays.sort(columns, new ColumnsComparator(sortedColumnNames));
173         }
174 
175         setColumns(columns);
176 
177         _upgradeColumns = new UpgradeColumn[columns.length];
178 
179         prepareUpgradeColumns(upgradeColumn1);
180         prepareUpgradeColumns(upgradeColumn2);
181         prepareUpgradeColumns(upgradeColumn3);
182         prepareUpgradeColumns(upgradeColumn4);
183         prepareUpgradeColumns(upgradeColumn5);
184         prepareUpgradeColumns(upgradeColumn6);
185         prepareUpgradeColumns(upgradeColumn7);
186         prepareUpgradeColumns(upgradeColumn8);
187         prepareUpgradeColumns(upgradeColumn9);
188         prepareUpgradeColumns(upgradeColumn10);
189     }
190 
191     public String getExportedData(ResultSet rs) throws Exception {
192         StringBuilder sb = new StringBuilder();
193 
194         Object[][] columns = getColumns();
195 
196         for (int i = 0; i < columns.length; i++) {
197             boolean last = false;
198 
199             if ((i + 1) == columns.length) {
200                 last = true;
201             }
202 
203             if (_upgradeColumns[i] == null) {
204                 appendColumn(
205                     sb, rs, (String)columns[i][0], (Integer)columns[i][1],
206                     last);
207             }
208             else {
209                 try {
210                     Integer columnType = _upgradeColumns[i].getOldColumnType(
211                         (Integer)columns[i][1]);
212 
213                     Object oldValue = getValue(
214                         rs, (String)columns[i][0], columnType);
215 
216                     _upgradeColumns[i].setOldValue(oldValue);
217 
218                     Object newValue = _upgradeColumns[i].getNewValue(oldValue);
219 
220                     _upgradeColumns[i].setNewValue(newValue);
221 
222                     appendColumn(sb, newValue, last);
223                 }
224                 catch (StagnantRowException sre) {
225                     _upgradeColumns[i].setNewValue(null);
226 
227                     throw new StagnantRowException(
228                         "Column " + columns[i][0] + " with value " +
229                             sre.getMessage(),
230                         sre);
231                 }
232             }
233         }
234 
235         return sb.toString();
236     }
237 
238     public void setColumn(
239             PreparedStatement ps, int index, Integer type, String value)
240         throws Exception {
241 
242         if (_upgradeColumns[index] != null) {
243             if (getCreateSQL() == null) {
244                 type = _upgradeColumns[index].getOldColumnType(type);
245             }
246             else {
247                 type = _upgradeColumns[index].getNewColumnType(type);
248             }
249         }
250 
251         super.setColumn(ps, index, type, value);
252     }
253 
254     protected void getSortedColumnName(
255         List<String> sortedColumnNames, UpgradeColumn upgradeColumn) {
256 
257         if (upgradeColumn == null) {
258             return;
259         }
260 
261         String name = upgradeColumn.getName();
262 
263         if (Validator.isNotNull(name)) {
264             sortedColumnNames.add(name);
265         }
266     }
267 
268     protected void prepareUpgradeColumns(UpgradeColumn upgradeColumn) {
269         if (upgradeColumn == null) {
270             return;
271         }
272 
273         Object[][] columns = getColumns();
274 
275         for (int i = 0; i < columns.length; i++) {
276             String name = (String)columns[i][0];
277 
278             if (upgradeColumn.isApplicable(name)) {
279                 _upgradeColumns[i] = upgradeColumn;
280             }
281         }
282     }
283 
284     private UpgradeColumn[] _upgradeColumns;
285 
286 }