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