001    /**
002     * Copyright (c) 2000-2013 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.kernel.dao.orm;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.kernel.search.Indexer;
020    import com.liferay.portal.service.BaseLocalService;
021    
022    import java.lang.reflect.InvocationTargetException;
023    import java.lang.reflect.Method;
024    
025    import java.util.List;
026    
027    /**
028     * @author Brian Wing Shun Chan
029     */
030    public abstract class BaseActionableDynamicQuery
031            implements ActionableDynamicQuery {
032    
033            @Override
034            public void performActions() throws PortalException, SystemException {
035                    DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
036                            _clazz, _classLoader);
037    
038                    Projection minPrimaryKeyProjection = ProjectionFactoryUtil.min(
039                            _primaryKeyPropertyName);
040                    Projection maxPrimaryKeyProjection = ProjectionFactoryUtil.max(
041                            _primaryKeyPropertyName);
042    
043                    ProjectionList projectionList = ProjectionFactoryUtil.projectionList();
044    
045                    projectionList.add(minPrimaryKeyProjection);
046                    projectionList.add(maxPrimaryKeyProjection);
047    
048                    dynamicQuery.setProjection(projectionList);
049    
050                    addDefaultCriteria(dynamicQuery);
051                    addCriteria(dynamicQuery);
052    
053                    List<Object[]> results = dynamicQuery(dynamicQuery);
054    
055                    Object[] minAndMaxPrimaryKeys = results.get(0);
056    
057                    if ((minAndMaxPrimaryKeys[0] == null) ||
058                            (minAndMaxPrimaryKeys[1] == null)) {
059    
060                            return;
061                    }
062    
063                    long minPrimaryKey = (Long)minAndMaxPrimaryKeys[0];
064                    long maxPrimaryKey = (Long)minAndMaxPrimaryKeys[1];
065    
066                    long startPrimaryKey = minPrimaryKey;
067                    long endPrimaryKey = startPrimaryKey + _interval;
068    
069                    while (startPrimaryKey <= maxPrimaryKey) {
070                            performActions(startPrimaryKey, endPrimaryKey);
071    
072                            startPrimaryKey = endPrimaryKey;
073                            endPrimaryKey += _interval;
074                    }
075            }
076    
077            public void performActions(long startPrimaryKey, long endPrimaryKey)
078                    throws PortalException, SystemException {
079    
080                    DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
081                            _clazz, _classLoader);
082    
083                    Property property = PropertyFactoryUtil.forName(
084                            _primaryKeyPropertyName);
085    
086                    dynamicQuery.add(property.ge(startPrimaryKey));
087                    dynamicQuery.add(property.lt(endPrimaryKey));
088    
089                    addDefaultCriteria(dynamicQuery);
090                    addCriteria(dynamicQuery);
091    
092                    List<Object> objects = dynamicQuery(dynamicQuery);
093    
094                    for (Object object : objects) {
095                            performAction(object);
096                    }
097            }
098    
099            @Override
100            public void setBaseLocalService(BaseLocalService baseLocalService)
101                    throws SystemException {
102    
103                    _baseLocalService = baseLocalService;
104    
105                    Class<?> clazz = _baseLocalService.getClass();
106    
107                    try {
108                            _dynamicQueryMethod = clazz.getMethod(
109                                    "dynamicQuery", DynamicQuery.class);
110                    }
111                    catch (NoSuchMethodException nsme) {
112                            throw new SystemException(nsme);
113                    }
114            }
115    
116            @Override
117            public void setClass(Class<?> clazz) {
118                    _clazz = clazz;
119            }
120    
121            @Override
122            public void setClassLoader(ClassLoader classLoader) {
123                    _classLoader = classLoader;
124            }
125    
126            @Override
127            public void setCompanyId(long companyId) {
128                    _companyId = companyId;
129            }
130    
131            @Override
132            public void setGroupId(long groupId) {
133                    _groupId = groupId;
134            }
135    
136            @Override
137            public void setInterval(int interval) {
138                    _interval = interval;
139            }
140    
141            @Override
142            public void setPrimaryKeyPropertyName(String primaryKeyPropertyName) {
143                    _primaryKeyPropertyName = primaryKeyPropertyName;
144            }
145    
146            protected void addCriteria(DynamicQuery dynamicQuery) {
147            }
148    
149            protected void addDefaultCriteria(DynamicQuery dynamicQuery) {
150                    if (_companyId > 0) {
151                            Property property = PropertyFactoryUtil.forName("companyId");
152    
153                            dynamicQuery.add(property.eq(_companyId));
154                    }
155    
156                    if (_groupId > 0) {
157                            Property property = PropertyFactoryUtil.forName("groupId");
158    
159                            dynamicQuery.add(property.eq(_groupId));
160                    }
161            }
162    
163            @SuppressWarnings("rawtypes")
164            protected List dynamicQuery(DynamicQuery dynamicQuery)
165                    throws PortalException, SystemException {
166    
167                    try {
168                            return (List)_dynamicQueryMethod.invoke(
169                                    _baseLocalService, dynamicQuery);
170                    }
171                    catch (InvocationTargetException ite) {
172                            Throwable throwable = ite.getCause();
173    
174                            if (throwable instanceof PortalException) {
175                                    throw (PortalException)throwable;
176                            }
177                            else if (throwable instanceof SystemException) {
178                                    throw (SystemException)throwable;
179                            }
180    
181                            throw new SystemException(ite);
182                    }
183                    catch (Exception e) {
184                            throw new SystemException(e);
185                    }
186            }
187    
188            protected abstract void performAction(Object object)
189                    throws PortalException, SystemException;
190    
191            private BaseLocalService _baseLocalService;
192            private ClassLoader _classLoader;
193            private Class<?> _clazz;
194            private long _companyId;
195            private Method _dynamicQueryMethod;
196            private long _groupId;
197            private int _interval = Indexer.DEFAULT_INTERVAL;
198            private String _primaryKeyPropertyName;
199    
200    }