1   /**
2    * Copyright (c) 2000-2007 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.StringMaker;
26  import com.liferay.portal.kernel.util.Validator;
27  import com.liferay.portal.tools.comparator.ColumnsComparator;
28  import com.liferay.portal.upgrade.StagnantRowException;
29  
30  import java.sql.PreparedStatement;
31  import java.sql.ResultSet;
32  
33  import java.util.ArrayList;
34  import java.util.Arrays;
35  import java.util.List;
36  
37  /**
38   * <a href="DefaultUpgradeTableImpl.java.html"><b><i>View Source</i></b></a>
39   *
40   * @author Alexander Chow
41   * @author Bruno Farache
42   *
43   */
44  public class DefaultUpgradeTableImpl
45      extends BaseUpgradeTableImpl implements UpgradeTable {
46  
47      public DefaultUpgradeTableImpl(String tableName, Object[][] columns) {
48          this(tableName, columns, null);
49      }
50  
51      public DefaultUpgradeTableImpl(String tableName, Object[][] columns,
52                                     UpgradeColumn upgradeColumn1) {
53  
54          this(tableName, columns, upgradeColumn1, null);
55      }
56  
57      public DefaultUpgradeTableImpl(String tableName, Object[][] columns,
58                                     UpgradeColumn upgradeColumn1,
59                                     UpgradeColumn upgradeColumn2) {
60  
61          this(tableName, columns, upgradeColumn1, upgradeColumn2, null);
62      }
63  
64      public DefaultUpgradeTableImpl(String tableName, Object[][] columns,
65                                     UpgradeColumn upgradeColumn1,
66                                     UpgradeColumn upgradeColumn2,
67                                     UpgradeColumn upgradeColumn3) {
68  
69          this(
70              tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
71              null);
72      }
73  
74      public DefaultUpgradeTableImpl(String tableName, Object[][] columns,
75                                     UpgradeColumn upgradeColumn1,
76                                     UpgradeColumn upgradeColumn2,
77                                     UpgradeColumn upgradeColumn3,
78                                     UpgradeColumn upgradeColumn4) {
79  
80          this(
81              tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
82              upgradeColumn4, null);
83      }
84  
85      public DefaultUpgradeTableImpl(String tableName, Object[][] columns,
86                                     UpgradeColumn upgradeColumn1,
87                                     UpgradeColumn upgradeColumn2,
88                                     UpgradeColumn upgradeColumn3,
89                                     UpgradeColumn upgradeColumn4,
90                                     UpgradeColumn upgradeColumn5) {
91  
92          this(
93              tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
94              upgradeColumn4, upgradeColumn5, null);
95      }
96  
97      public DefaultUpgradeTableImpl(String tableName, Object[][] columns,
98                                     UpgradeColumn upgradeColumn1,
99                                     UpgradeColumn upgradeColumn2,
100                                    UpgradeColumn upgradeColumn3,
101                                    UpgradeColumn upgradeColumn4,
102                                    UpgradeColumn upgradeColumn5,
103                                    UpgradeColumn upgradeColumn6) {
104 
105         this(
106             tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
107             upgradeColumn4, upgradeColumn5, upgradeColumn6, null);
108     }
109 
110     public DefaultUpgradeTableImpl(String tableName, Object[][] columns,
111                                    UpgradeColumn upgradeColumn1,
112                                    UpgradeColumn upgradeColumn2,
113                                    UpgradeColumn upgradeColumn3,
114                                    UpgradeColumn upgradeColumn4,
115                                    UpgradeColumn upgradeColumn5,
116                                    UpgradeColumn upgradeColumn6,
117                                    UpgradeColumn upgradeColumn7) {
118 
119         this(
120             tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
121             upgradeColumn4, upgradeColumn5, upgradeColumn6, upgradeColumn7,
122             null);
123     }
124 
125     public DefaultUpgradeTableImpl(String tableName, Object[][] columns,
126                                    UpgradeColumn upgradeColumn1,
127                                    UpgradeColumn upgradeColumn2,
128                                    UpgradeColumn upgradeColumn3,
129                                    UpgradeColumn upgradeColumn4,
130                                    UpgradeColumn upgradeColumn5,
131                                    UpgradeColumn upgradeColumn6,
132                                    UpgradeColumn upgradeColumn7,
133                                    UpgradeColumn upgradeColumn8) {
134 
135         this(
136             tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
137             upgradeColumn4, upgradeColumn5, upgradeColumn6, upgradeColumn7,
138             upgradeColumn8, null);
139     }
140 
141     public DefaultUpgradeTableImpl(String tableName, Object[][] columns,
142                                    UpgradeColumn upgradeColumn1,
143                                    UpgradeColumn upgradeColumn2,
144                                    UpgradeColumn upgradeColumn3,
145                                    UpgradeColumn upgradeColumn4,
146                                    UpgradeColumn upgradeColumn5,
147                                    UpgradeColumn upgradeColumn6,
148                                    UpgradeColumn upgradeColumn7,
149                                    UpgradeColumn upgradeColumn8,
150                                    UpgradeColumn upgradeColumn9) {
151 
152         this(
153             tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
154             upgradeColumn4, upgradeColumn5, upgradeColumn6, upgradeColumn7,
155             upgradeColumn8, upgradeColumn9, null);
156     }
157 
158     public DefaultUpgradeTableImpl(String tableName, Object[][] columns,
159                                    UpgradeColumn upgradeColumn1,
160                                    UpgradeColumn upgradeColumn2,
161                                    UpgradeColumn upgradeColumn3,
162                                    UpgradeColumn upgradeColumn4,
163                                    UpgradeColumn upgradeColumn5,
164                                    UpgradeColumn upgradeColumn6,
165                                    UpgradeColumn upgradeColumn7,
166                                    UpgradeColumn upgradeColumn8,
167                                    UpgradeColumn upgradeColumn9,
168                                    UpgradeColumn upgradeColumn10) {
169 
170         super(tableName);
171 
172         // Sort the column names to ensure they're sorted based on the
173         // constructor's list of columns to upgrade. This is needed if you
174         // use TempUpgradeColumnImpl and need to ensure a column's temporary
175         // value is populated in the correct order.
176 
177         columns = (Object[][])columns.clone();
178 
179         List sortedColumnNames = new ArrayList();
180 
181         getSortedColumnName(sortedColumnNames, upgradeColumn1);
182         getSortedColumnName(sortedColumnNames, upgradeColumn2);
183         getSortedColumnName(sortedColumnNames, upgradeColumn3);
184         getSortedColumnName(sortedColumnNames, upgradeColumn4);
185         getSortedColumnName(sortedColumnNames, upgradeColumn5);
186         getSortedColumnName(sortedColumnNames, upgradeColumn6);
187         getSortedColumnName(sortedColumnNames, upgradeColumn7);
188         getSortedColumnName(sortedColumnNames, upgradeColumn8);
189         getSortedColumnName(sortedColumnNames, upgradeColumn9);
190         getSortedColumnName(sortedColumnNames, upgradeColumn10);
191 
192         if (sortedColumnNames.size() > 0) {
193             Arrays.sort(columns, new ColumnsComparator(sortedColumnNames));
194         }
195 
196         setColumns(columns);
197 
198         _upgradeColumns = new UpgradeColumn[columns.length];
199 
200         prepareUpgradeColumns(upgradeColumn1);
201         prepareUpgradeColumns(upgradeColumn2);
202         prepareUpgradeColumns(upgradeColumn3);
203         prepareUpgradeColumns(upgradeColumn4);
204         prepareUpgradeColumns(upgradeColumn5);
205         prepareUpgradeColumns(upgradeColumn6);
206         prepareUpgradeColumns(upgradeColumn7);
207         prepareUpgradeColumns(upgradeColumn8);
208         prepareUpgradeColumns(upgradeColumn9);
209         prepareUpgradeColumns(upgradeColumn10);
210     }
211 
212     public String getExportedData(ResultSet rs) throws Exception {
213         StringMaker sm = new StringMaker();
214 
215         Object[][] columns = getColumns();
216 
217         for (int i = 0; i < columns.length; i++) {
218             boolean last = false;
219 
220             if ((i + 1) == columns.length) {
221                 last = true;
222             }
223 
224             if (_upgradeColumns[i] == null) {
225                 appendColumn(
226                     sm, rs, (String)columns[i][0], (Integer)columns[i][1],
227                     last);
228             }
229             else {
230                 try {
231                     Integer columnType = _upgradeColumns[i].getOldColumnType(
232                         (Integer)columns[i][1]);
233 
234                     Object oldValue = getValue(
235                         rs, (String)columns[i][0], columnType);
236 
237                     _upgradeColumns[i].setOldValue(oldValue);
238 
239                     Object newValue = _upgradeColumns[i].getNewValue(oldValue);
240 
241                     _upgradeColumns[i].setNewValue(newValue);
242 
243                     appendColumn(sm, newValue, last);
244                 }
245                 catch (StagnantRowException sre) {
246                     _upgradeColumns[i].setNewValue(null);
247 
248                     throw new StagnantRowException(
249                         "Column " + columns[i][0] + " with value " +
250                             sre.getMessage(),
251                         sre);
252                 }
253             }
254         }
255 
256         return sm.toString();
257     }
258 
259     public void setColumn(
260             PreparedStatement ps, int index, Integer type, String value)
261         throws Exception {
262 
263         if (_upgradeColumns[index] != null) {
264             if (getCreateSQL() == null) {
265                 type = _upgradeColumns[index].getOldColumnType(type);
266             }
267             else {
268                 type = _upgradeColumns[index].getNewColumnType(type);
269             }
270         }
271 
272         super.setColumn(ps, index, type, value);
273     }
274 
275     protected void getSortedColumnName(
276         List sortedColumnNames, UpgradeColumn upgradeColumn) {
277 
278         if (upgradeColumn == null) {
279             return;
280         }
281 
282         String name = upgradeColumn.getName();
283 
284         if (Validator.isNotNull(name)) {
285             sortedColumnNames.add(name);
286         }
287     }
288 
289     protected void prepareUpgradeColumns(UpgradeColumn upgradeColumn) {
290         if (upgradeColumn == null) {
291             return;
292         }
293 
294         Object[][] columns = getColumns();
295 
296         for (int i = 0; i < columns.length; i++) {
297             String name = (String)columns[i][0];
298 
299             if (upgradeColumn.isApplicable(name)) {
300                 _upgradeColumns[i] = upgradeColumn;
301             }
302         }
303     }
304 
305     private UpgradeColumn[] _upgradeColumns;
306 
307 }