1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    *
5    *
6    *
7    * The contents of this file are subject to the terms of the Liferay Enterprise
8    * Subscription License ("License"). You may not use this file except in
9    * compliance with the License. You can obtain a copy of the License by
10   * contacting Liferay, Inc. See the License for the specific language governing
11   * permissions and limitations under the License, including but not limited to
12   * distribution rights 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  public class DefaultUpgradeTableImpl
43      extends BaseUpgradeTableImpl implements UpgradeTable {
44  
45      public DefaultUpgradeTableImpl(String tableName, Object[][] columns) {
46          this(tableName, columns, null);
47      }
48  
49      public DefaultUpgradeTableImpl(
50          String tableName, Object[][] columns, UpgradeColumn upgradeColumn1) {
51  
52          this(tableName, columns, upgradeColumn1, null);
53      }
54  
55      public DefaultUpgradeTableImpl(
56          String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
57          UpgradeColumn upgradeColumn2) {
58  
59          this(tableName, columns, upgradeColumn1, upgradeColumn2, null);
60      }
61  
62      public DefaultUpgradeTableImpl(
63          String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
64          UpgradeColumn upgradeColumn2, UpgradeColumn upgradeColumn3) {
65  
66          this(
67              tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
68              null);
69      }
70  
71      public DefaultUpgradeTableImpl(
72          String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
73          UpgradeColumn upgradeColumn2, UpgradeColumn upgradeColumn3,
74          UpgradeColumn upgradeColumn4) {
75  
76          this(
77              tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
78              upgradeColumn4, null);
79      }
80  
81      public DefaultUpgradeTableImpl(
82          String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
83          UpgradeColumn upgradeColumn2, UpgradeColumn upgradeColumn3,
84          UpgradeColumn upgradeColumn4, UpgradeColumn upgradeColumn5) {
85  
86          this(
87              tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
88              upgradeColumn4, upgradeColumn5, null);
89      }
90  
91      public DefaultUpgradeTableImpl(
92          String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
93          UpgradeColumn upgradeColumn2, UpgradeColumn upgradeColumn3,
94          UpgradeColumn upgradeColumn4, UpgradeColumn upgradeColumn5,
95          UpgradeColumn upgradeColumn6) {
96  
97          this(
98              tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
99              upgradeColumn4, upgradeColumn5, upgradeColumn6, null);
100     }
101 
102     public DefaultUpgradeTableImpl(
103         String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
104         UpgradeColumn upgradeColumn2, UpgradeColumn upgradeColumn3,
105         UpgradeColumn upgradeColumn4, UpgradeColumn upgradeColumn5,
106         UpgradeColumn upgradeColumn6, UpgradeColumn upgradeColumn7) {
107 
108         this(
109             tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
110             upgradeColumn4, upgradeColumn5, upgradeColumn6, upgradeColumn7,
111             null);
112     }
113 
114     public DefaultUpgradeTableImpl(
115         String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
116         UpgradeColumn upgradeColumn2, UpgradeColumn upgradeColumn3,
117         UpgradeColumn upgradeColumn4, UpgradeColumn upgradeColumn5,
118         UpgradeColumn upgradeColumn6, UpgradeColumn upgradeColumn7,
119         UpgradeColumn upgradeColumn8) {
120 
121         this(
122             tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
123             upgradeColumn4, upgradeColumn5, upgradeColumn6, upgradeColumn7,
124             upgradeColumn8, null);
125     }
126 
127     public DefaultUpgradeTableImpl(
128         String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
129         UpgradeColumn upgradeColumn2, UpgradeColumn upgradeColumn3,
130         UpgradeColumn upgradeColumn4, UpgradeColumn upgradeColumn5,
131         UpgradeColumn upgradeColumn6, UpgradeColumn upgradeColumn7,
132         UpgradeColumn upgradeColumn8, UpgradeColumn upgradeColumn9) {
133 
134         this(
135             tableName, columns, upgradeColumn1, upgradeColumn2, upgradeColumn3,
136             upgradeColumn4, upgradeColumn5, upgradeColumn6, upgradeColumn7,
137             upgradeColumn8, upgradeColumn9, null);
138     }
139 
140     public DefaultUpgradeTableImpl(
141         String tableName, Object[][] columns, UpgradeColumn upgradeColumn1,
142         UpgradeColumn upgradeColumn2, UpgradeColumn upgradeColumn3,
143         UpgradeColumn upgradeColumn4, UpgradeColumn upgradeColumn5,
144         UpgradeColumn upgradeColumn6, UpgradeColumn upgradeColumn7,
145         UpgradeColumn upgradeColumn8, UpgradeColumn upgradeColumn9,
146         UpgradeColumn upgradeColumn10) {
147 
148         super(tableName);
149 
150         // Sort the column names to ensure they're sorted based on the
151         // constructor's list of columns to upgrade. This is needed if you
152         // use TempUpgradeColumnImpl and need to ensure a column's temporary
153         // value is populated in the correct order.
154 
155         columns = columns.clone();
156 
157         List<String> sortedColumnNames = new ArrayList<String>();
158 
159         getSortedColumnName(sortedColumnNames, upgradeColumn1);
160         getSortedColumnName(sortedColumnNames, upgradeColumn2);
161         getSortedColumnName(sortedColumnNames, upgradeColumn3);
162         getSortedColumnName(sortedColumnNames, upgradeColumn4);
163         getSortedColumnName(sortedColumnNames, upgradeColumn5);
164         getSortedColumnName(sortedColumnNames, upgradeColumn6);
165         getSortedColumnName(sortedColumnNames, upgradeColumn7);
166         getSortedColumnName(sortedColumnNames, upgradeColumn8);
167         getSortedColumnName(sortedColumnNames, upgradeColumn9);
168         getSortedColumnName(sortedColumnNames, upgradeColumn10);
169 
170         if (sortedColumnNames.size() > 0) {
171             Arrays.sort(columns, new ColumnsComparator(sortedColumnNames));
172         }
173 
174         setColumns(columns);
175 
176         _upgradeColumns = new UpgradeColumn[columns.length];
177 
178         prepareUpgradeColumns(upgradeColumn1);
179         prepareUpgradeColumns(upgradeColumn2);
180         prepareUpgradeColumns(upgradeColumn3);
181         prepareUpgradeColumns(upgradeColumn4);
182         prepareUpgradeColumns(upgradeColumn5);
183         prepareUpgradeColumns(upgradeColumn6);
184         prepareUpgradeColumns(upgradeColumn7);
185         prepareUpgradeColumns(upgradeColumn8);
186         prepareUpgradeColumns(upgradeColumn9);
187         prepareUpgradeColumns(upgradeColumn10);
188     }
189 
190     public String getExportedData(ResultSet rs) throws Exception {
191         StringBuilder sb = new StringBuilder();
192 
193         Object[][] columns = getColumns();
194 
195         for (int i = 0; i < columns.length; i++) {
196             boolean last = false;
197 
198             if ((i + 1) == columns.length) {
199                 last = true;
200             }
201 
202             if (_upgradeColumns[i] == null) {
203                 appendColumn(
204                     sb, rs, (String)columns[i][0], (Integer)columns[i][1],
205                     last);
206             }
207             else {
208                 try {
209                     Integer columnType = _upgradeColumns[i].getOldColumnType(
210                         (Integer)columns[i][1]);
211 
212                     Object oldValue = getValue(
213                         rs, (String)columns[i][0], columnType);
214 
215                     _upgradeColumns[i].setOldValue(oldValue);
216 
217                     Object newValue = _upgradeColumns[i].getNewValue(oldValue);
218 
219                     _upgradeColumns[i].setNewValue(newValue);
220 
221                     appendColumn(sb, newValue, last);
222                 }
223                 catch (StagnantRowException sre) {
224                     _upgradeColumns[i].setNewValue(null);
225 
226                     throw new StagnantRowException(
227                         "Column " + columns[i][0] + " with value " +
228                             sre.getMessage(),
229                         sre);
230                 }
231             }
232         }
233 
234         return sb.toString();
235     }
236 
237     public void setColumn(
238             PreparedStatement ps, int index, Integer type, String value)
239         throws Exception {
240 
241         if (_upgradeColumns[index] != null) {
242             if (getCreateSQL() == null) {
243                 type = _upgradeColumns[index].getOldColumnType(type);
244             }
245             else {
246                 type = _upgradeColumns[index].getNewColumnType(type);
247             }
248         }
249 
250         super.setColumn(ps, index, type, value);
251     }
252 
253     protected void getSortedColumnName(
254         List<String> sortedColumnNames, UpgradeColumn upgradeColumn) {
255 
256         if (upgradeColumn == null) {
257             return;
258         }
259 
260         String name = upgradeColumn.getName();
261 
262         if (Validator.isNotNull(name)) {
263             sortedColumnNames.add(name);
264         }
265     }
266 
267     protected void prepareUpgradeColumns(UpgradeColumn upgradeColumn) {
268         if (upgradeColumn == null) {
269             return;
270         }
271 
272         Object[][] columns = getColumns();
273 
274         for (int i = 0; i < columns.length; i++) {
275             String name = (String)columns[i][0];
276 
277             if (upgradeColumn.isApplicable(name)) {
278                 _upgradeColumns[i] = upgradeColumn;
279             }
280         }
281     }
282 
283     private UpgradeColumn[] _upgradeColumns;
284 
285 }