001
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
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 }