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