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