1   /**
2    * Copyright (c) 2000-2010 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   *
12   *
13   */
14  
15  package com.liferay.portal.upgrade.v5_2_0;
16  
17  import com.liferay.portal.kernel.dao.jdbc.DataAccess;
18  import com.liferay.portal.kernel.upgrade.UpgradeProcess;
19  import com.liferay.portal.kernel.upgrade.util.TempUpgradeColumnImpl;
20  import com.liferay.portal.kernel.upgrade.util.UpgradeColumn;
21  import com.liferay.portal.kernel.upgrade.util.UpgradeTable;
22  import com.liferay.portal.kernel.upgrade.util.UpgradeTableFactoryUtil;
23  import com.liferay.portal.kernel.util.ArrayUtil;
24  import com.liferay.portal.upgrade.v5_2_0.util.OrganizationTable;
25  import com.liferay.portal.upgrade.v5_2_0.util.OrganizationTypeUpgradeColumnImpl;
26  
27  import java.lang.StringBuilder;
28  
29  import java.sql.Connection;
30  import java.sql.PreparedStatement;
31  import java.sql.ResultSet;
32  import java.sql.Types;
33  
34  /**
35   * <a href="UpgradeOrganization.java.html"><b><i>View Source</i></b></a>
36   *
37   * @author Jorge Ferrer
38   * @author Edward Shin
39   */
40  public class UpgradeOrganization extends UpgradeProcess {
41  
42      protected void doUpgrade() throws Exception {
43          UpgradeColumn locationColumn = new TempUpgradeColumnImpl(
44              "location", new Integer(Types.BOOLEAN));
45  
46          UpgradeColumn typeColumn = new OrganizationTypeUpgradeColumnImpl(
47              locationColumn);
48  
49          Object[][] organizationColumns1 =
50              {{"location", new Integer(Types.BOOLEAN)}};
51          Object[][] organizationColumns2 =
52              OrganizationTable.TABLE_COLUMNS.clone();
53  
54          Object[][] organizationColumns = ArrayUtil.append(
55              organizationColumns1, organizationColumns2);
56  
57          UpgradeTable upgradeTable = UpgradeTableFactoryUtil.getUpgradeTable(
58              OrganizationTable.TABLE_NAME, organizationColumns, locationColumn,
59              typeColumn);
60  
61          upgradeTable.updateTable();
62  
63          updateLocationResources();
64      }
65  
66      protected void updateLocationResources() throws Exception {
67          Connection con = null;
68          PreparedStatement ps = null;
69          ResultSet rs = null;
70  
71          try {
72              con = DataAccess.getConnection();
73  
74              StringBuilder sb = new StringBuilder();
75  
76              sb.append("select rLoc.resourceId from Resource_ rLoc inner join ");
77              sb.append("ResourceCode rcLoc on rLoc.codeId = rcLoc.codeId ");
78              sb.append("inner join ResourceCode rcOrg on rcLoc.scope = ");
79              sb.append("rcOrg.scope and rcLoc.companyId = rcOrg.companyId ");
80              sb.append("where rcLoc.name = ");
81              sb.append("'com.liferay.portal.model.Location' and rcOrg.name = ");
82              sb.append("'com.liferay.portal.model.Organization' and ((select ");
83              sb.append("count(*) from Resource_ where codeId = rcOrg.codeId) ");
84              sb.append("= 0)");
85  
86              ps = con.prepareStatement(sb.toString());
87  
88              rs = ps.executeQuery();
89  
90              while (rs.next()) {
91                  long resourceId = rs.getLong("resourceId");
92  
93                  sb = new StringBuilder();
94  
95                  sb.append("update Resource_ rLoc set rLoc.codeId = (select ");
96                  sb.append("rcOrg.codeId from ResourceCode rcOrg inner join ");
97                  sb.append("ResourceCode rcLoc on rcOrg.scope = rcLoc.scope ");
98                  sb.append("and rcOrg.companyId = rcLoc.companyId where ");
99                  sb.append("rcOrg.name = ");
100                 sb.append("'com.liferay.portal.model.Organization' and ");
101                 sb.append("rcLoc.codeId = rLoc.codeId) where rLoc.resourceId ");
102                 sb.append("= ");
103                 sb.append(resourceId);
104 
105                 runSQL(sb.toString());
106             }
107 
108             sb = new StringBuilder();
109 
110             sb.append("delete from Resource_ where codeId in ");
111             sb.append("(select rcLoc.codeId from ResourceCode rcLoc ");
112             sb.append("inner join ResourceCode rcOrg on ");
113             sb.append("rcLoc.scope = rcOrg.scope and ");
114             sb.append("rcLoc.companyId = rcOrg.companyId where ");
115             sb.append("rcLoc.name = 'com.liferay.portal.model.Location' and ");
116             sb.append("rcOrg.name = 'com.liferay.portal.model.Organization')");
117 
118             runSQL(sb.toString());
119         }
120         finally {
121             DataAccess.cleanUp(con, ps, rs);
122         }
123     }
124 
125 }