001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.verify;
016    
017    import com.liferay.portal.kernel.bean.PortalBeanLocatorUtil;
018    import com.liferay.portal.kernel.concurrent.ThrowableAwareRunnable;
019    import com.liferay.portal.kernel.dao.db.DB;
020    import com.liferay.portal.kernel.dao.db.DBManagerUtil;
021    import com.liferay.portal.kernel.dao.jdbc.DataAccess;
022    import com.liferay.portal.kernel.util.StringBundler;
023    import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
024    import com.liferay.portal.verify.model.VerifiableUUIDModel;
025    
026    import java.sql.Connection;
027    import java.sql.PreparedStatement;
028    import java.sql.ResultSet;
029    
030    import java.util.ArrayList;
031    import java.util.Collection;
032    import java.util.List;
033    import java.util.Map;
034    
035    /**
036     * @author Brian Wing Shun Chan
037     */
038    public class VerifyUUID extends VerifyProcess {
039    
040            public static void verify(VerifiableUUIDModel ... verifiableUUIDModels)
041                    throws Exception {
042    
043                    VerifyUUID verifyUUID = new VerifyUUID();
044    
045                    verifyUUID.doVerify(verifiableUUIDModels);
046            }
047    
048            @Override
049            protected void doVerify() throws Exception {
050                    Map<String, VerifiableUUIDModel> verifiableUUIDModelsMap =
051                            PortalBeanLocatorUtil.locate(VerifiableUUIDModel.class);
052    
053                    Collection<VerifiableUUIDModel> verifiableUUIDModels =
054                            verifiableUUIDModelsMap.values();
055    
056                    doVerify(
057                            verifiableUUIDModels.toArray(
058                                    new VerifiableUUIDModel[verifiableUUIDModels.size()]));
059            }
060    
061            protected void doVerify(VerifiableUUIDModel... verifiableUUIDModels)
062                    throws Exception {
063    
064                    List<VerifyUUIDRunnable> verifyUUIDRunnables = new ArrayList<>(
065                            verifiableUUIDModels.length);
066    
067                    for (VerifiableUUIDModel verifiableUUIDModel : verifiableUUIDModels) {
068                            VerifyUUIDRunnable verifyUUIDRunnable = new VerifyUUIDRunnable(
069                                    verifiableUUIDModel);
070    
071                            verifyUUIDRunnables.add(verifyUUIDRunnable);
072                    }
073    
074                    doVerify(verifyUUIDRunnables);
075            }
076    
077            protected void updateUUID(
078                            Connection con, VerifiableUUIDModel verifiableUUIDModel,
079                            long primKey)
080                    throws Exception {
081    
082                    DB db = DBManagerUtil.getDB();
083    
084                    StringBundler sb = new StringBundler(8);
085    
086                    sb.append("update ");
087                    sb.append(verifiableUUIDModel.getTableName());
088                    sb.append(" set uuid_ = '");
089                    sb.append(PortalUUIDUtil.generate());
090                    sb.append("' where ");
091                    sb.append(verifiableUUIDModel.getPrimaryKeyColumnName());
092                    sb.append(" = ");
093                    sb.append(primKey);
094    
095                    db.runSQL(con, sb.toString());
096            }
097    
098            protected void verifyUUID(VerifiableUUIDModel verifiableUUIDModel)
099                    throws Exception {
100    
101                    PreparedStatement ps = null;
102                    ResultSet rs = null;
103    
104                    try (Connection con = DataAccess.getUpgradeOptimizedConnection()) {
105                            ps = con.prepareStatement(
106                                    "select " + verifiableUUIDModel.getPrimaryKeyColumnName() +
107                                            " from " + verifiableUUIDModel.getTableName() +
108                                                    " where uuid_ is null or uuid_ = ''");
109    
110                            rs = ps.executeQuery();
111    
112                            while (rs.next()) {
113                                    long pk = rs.getLong(
114                                            verifiableUUIDModel.getPrimaryKeyColumnName());
115    
116                                    updateUUID(con, verifiableUUIDModel, pk);
117                            }
118                    }
119                    finally {
120                            DataAccess.cleanUp(ps, rs);
121                    }
122            }
123    
124            private class VerifyUUIDRunnable extends ThrowableAwareRunnable {
125    
126                    public VerifyUUIDRunnable(VerifiableUUIDModel verifiableUUIDModel) {
127                            _verifiableUUIDModel = verifiableUUIDModel;
128                    }
129    
130                    @Override
131                    protected void doRun() throws Exception {
132                            verifyUUID(_verifiableUUIDModel);
133                    }
134    
135                    private final VerifiableUUIDModel _verifiableUUIDModel;
136    
137            }
138    
139    }