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.DBFactoryUtil;
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 =
065                            new ArrayList<VerifyUUIDRunnable>(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                            VerifiableUUIDModel verifiableUUIDModel, long primKey)
079                    throws Exception {
080    
081                    DB db = DBFactoryUtil.getDB();
082    
083                    StringBundler sb = new StringBundler(8);
084    
085                    sb.append("update ");
086                    sb.append(verifiableUUIDModel.getTableName());
087                    sb.append(" set uuid_ = '");
088                    sb.append(PortalUUIDUtil.generate());
089                    sb.append("' where ");
090                    sb.append(verifiableUUIDModel.getPrimaryKeyColumnName());
091                    sb.append(" = ");
092                    sb.append(primKey);
093    
094                    db.runSQL(sb.toString());
095            }
096    
097            protected void verifyUUID(VerifiableUUIDModel verifiableUUIDModel)
098                    throws Exception {
099    
100                    Connection con = null;
101                    PreparedStatement ps = null;
102                    ResultSet rs = null;
103    
104                    try {
105                            con = DataAccess.getUpgradeOptimizedConnection();
106    
107                            ps = con.prepareStatement(
108                                    "select " + verifiableUUIDModel.getPrimaryKeyColumnName() +
109                                            " from " + verifiableUUIDModel.getTableName() +
110                                                    " where uuid_ is null or uuid_ = ''");
111    
112                            rs = ps.executeQuery();
113    
114                            while (rs.next()) {
115                                    long pk = rs.getLong(
116                                            verifiableUUIDModel.getPrimaryKeyColumnName());
117    
118                                    updateUUID(verifiableUUIDModel, pk);
119                            }
120                    }
121                    finally {
122                            DataAccess.cleanUp(con, ps, rs);
123                    }
124            }
125    
126            private class VerifyUUIDRunnable extends ThrowableAwareRunnable {
127    
128                    public VerifyUUIDRunnable(VerifiableUUIDModel verifiableUUIDModel) {
129                            _verifiableUUIDModel = verifiableUUIDModel;
130                    }
131    
132                    @Override
133                    protected void doRun() throws Exception {
134                            verifyUUID(_verifiableUUIDModel);
135                    }
136    
137                    private final VerifiableUUIDModel _verifiableUUIDModel;
138    
139            }
140    
141    }