PageRenderTime 28ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/projects/roller-5.0.1/weblogger-business/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWeblogManagerImpl.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Java | 700 lines | 496 code | 108 blank | 96 comment | 100 complexity | ad48a43dc214c2dd65425323cd182384 MD5 | raw file
  1. /*
  2. * Licensed to the Apache Software Foundation (ASF) under one or more
  3. * contributor license agreements. The ASF licenses this file to You
  4. * under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License. For additional information regarding
  15. * copyright in this work, please see the NOTICE file in the top level
  16. * directory of this distribution.
  17. */
  18. package org.apache.roller.weblogger.business.jpa;
  19. import java.util.ArrayList;
  20. import java.util.Collections;
  21. import java.util.Date;
  22. import java.util.Iterator;
  23. import java.util.List;
  24. import java.util.Map;
  25. import java.util.TreeMap;
  26. import java.sql.Timestamp;
  27. import java.util.Comparator;
  28. import java.util.Hashtable;
  29. import javax.persistence.NoResultException;
  30. import javax.persistence.Query;
  31. import org.apache.commons.logging.Log;
  32. import org.apache.commons.logging.LogFactory;
  33. import org.apache.roller.weblogger.WebloggerException;
  34. import org.apache.roller.weblogger.business.BookmarkManager;
  35. import org.apache.roller.weblogger.business.MediaFileManager;
  36. import org.apache.roller.weblogger.business.UserManager;
  37. import org.apache.roller.weblogger.business.WeblogEntryManager;
  38. import org.apache.roller.weblogger.business.WeblogManager;
  39. import org.apache.roller.weblogger.business.Weblogger;
  40. import org.apache.roller.weblogger.business.WebloggerFactory;
  41. import org.apache.roller.weblogger.business.pings.AutoPingManager;
  42. import org.apache.roller.weblogger.business.pings.PingTargetManager;
  43. import org.apache.roller.weblogger.config.WebloggerConfig;
  44. import org.apache.roller.weblogger.pojos.AutoPing;
  45. import org.apache.roller.weblogger.pojos.MediaFileDirectory;
  46. import org.apache.roller.weblogger.pojos.PingQueueEntry;
  47. import org.apache.roller.weblogger.pojos.PingTarget;
  48. import org.apache.roller.weblogger.pojos.WeblogReferrer;
  49. import org.apache.roller.weblogger.pojos.StatCount;
  50. import org.apache.roller.weblogger.pojos.StatCountCountComparator;
  51. import org.apache.roller.weblogger.pojos.TagStat;
  52. import org.apache.roller.weblogger.pojos.WeblogCategory;
  53. import org.apache.roller.weblogger.pojos.WeblogEntry;
  54. import org.apache.roller.weblogger.pojos.WeblogEntryTagAggregate;
  55. import org.apache.roller.weblogger.pojos.WeblogEntryTag;
  56. import org.apache.roller.weblogger.pojos.Weblog;
  57. import org.apache.roller.weblogger.pojos.User;
  58. import org.apache.roller.weblogger.pojos.WeblogBookmark;
  59. import org.apache.roller.weblogger.pojos.WeblogBookmarkFolder;
  60. import org.apache.roller.weblogger.pojos.WeblogPermission;
  61. import org.apache.roller.weblogger.pojos.WeblogTemplate;
  62. /*
  63. * JPAWeblogManagerImpl.java
  64. * Created on May 31, 2006, 4:08 PM
  65. */
  66. @com.google.inject.Singleton
  67. public class JPAWeblogManagerImpl implements WeblogManager {
  68. /** The logger instance for this class. */
  69. private static Log log = LogFactory.getLog(JPAWeblogManagerImpl.class);
  70. private static final Comparator statCountCountReverseComparator =
  71. Collections.reverseOrder(StatCountCountComparator.getInstance());
  72. private final Weblogger roller;
  73. private final JPAPersistenceStrategy strategy;
  74. // cached mapping of weblogHandles -> weblogIds
  75. private Map weblogHandleToIdMap = new Hashtable();
  76. // cached mapping of userNames -> userIds
  77. private Map userNameToIdMap = new Hashtable();
  78. @com.google.inject.Inject
  79. protected JPAWeblogManagerImpl(Weblogger roller, JPAPersistenceStrategy strat) {
  80. log.debug("Instantiating JPA Weblog Manager");
  81. this.roller = roller;
  82. this.strategy = strat;
  83. }
  84. public void release() {}
  85. /**
  86. * Update existing website.
  87. */
  88. public void saveWeblog(Weblog website) throws WebloggerException {
  89. website.setLastModified(new java.util.Date());
  90. strategy.store(website);
  91. }
  92. public void removeWeblog(Weblog weblog) throws WebloggerException {
  93. // remove contents first, then remove website
  94. this.removeWebsiteContents(weblog);
  95. this.strategy.remove(weblog);
  96. // remove entry from cache mapping
  97. this.weblogHandleToIdMap.remove(weblog.getHandle());
  98. }
  99. /**
  100. * convenience method for removing contents of a weblog.
  101. * TODO BACKEND: use manager methods instead of queries here
  102. */
  103. private void removeWebsiteContents(Weblog website)
  104. throws WebloggerException {
  105. UserManager umgr = roller.getUserManager();
  106. WeblogManager wmgr = roller.getWeblogManager();
  107. WeblogEntryManager emgr = roller.getWeblogEntryManager();
  108. BookmarkManager bmgr = roller.getBookmarkManager();
  109. MediaFileManager mmgr = roller.getMediaFileManager();
  110. // remove tags
  111. Query tagQuery = strategy.getNamedQuery("WeblogEntryTag.getByWeblog");
  112. tagQuery.setParameter(1, website);
  113. List results = tagQuery.getResultList();
  114. for(Iterator iter = results.iterator(); iter.hasNext();) {
  115. WeblogEntryTag tagData = (WeblogEntryTag) iter.next();
  116. if (tagData.getWeblogEntry() != null) {
  117. tagData.getWeblogEntry().getTags().remove(tagData);
  118. }
  119. this.strategy.remove(tagData);
  120. }
  121. // remove site tag aggregates
  122. List tags = emgr.getTags(website, null, null, 0, -1);
  123. updateTagAggregates(tags);
  124. // delete all weblog tag aggregates
  125. Query removeAggs= strategy.getNamedUpdate(
  126. "WeblogEntryTagAggregate.removeByWeblog");
  127. removeAggs.setParameter(1, website);
  128. removeAggs.executeUpdate();
  129. // delete all bad counts
  130. Query removeCounts = strategy.getNamedUpdate(
  131. "WeblogEntryTagAggregate.removeByTotalLessEqual");
  132. removeCounts.setParameter(1, new Integer(0));
  133. removeCounts.executeUpdate();
  134. // Remove the website's ping queue entries
  135. Query q = strategy.getNamedQuery("PingQueueEntry.getByWebsite");
  136. q.setParameter(1, website);
  137. List queueEntries = q.getResultList();
  138. Iterator it = queueEntries.iterator();
  139. while(it.hasNext()) {
  140. this.strategy.remove((PingQueueEntry) it.next());
  141. }
  142. // Remove the website's auto ping configurations
  143. AutoPingManager autoPingMgr = roller
  144. .getAutopingManager();
  145. List autopings = autoPingMgr.getAutoPingsByWebsite(website);
  146. it = autopings.iterator();
  147. while(it.hasNext()) {
  148. this.strategy.remove((AutoPing) it.next());
  149. }
  150. // Remove the website's custom ping targets
  151. PingTargetManager pingTargetMgr = roller.getPingTargetManager();
  152. List pingtargets = pingTargetMgr.getCustomPingTargets(website);
  153. it = pingtargets.iterator();
  154. while(it.hasNext()) {
  155. this.strategy.remove((PingTarget) it.next());
  156. }
  157. // remove associated referers
  158. Query refQuery2 = strategy.getNamedQuery("WeblogReferrer.getByWebsite");
  159. refQuery2.setParameter(1, website);
  160. List referers = refQuery2.getResultList();
  161. for (Iterator iter = referers.iterator(); iter.hasNext();) {
  162. WeblogReferrer referer = (WeblogReferrer) iter.next();
  163. this.strategy.remove(referer.getClass(), referer.getId());
  164. }
  165. // TODO: can we eliminate this unnecessary flush with OpenJPA 1.0
  166. this.strategy.flush();
  167. // remove associated pages
  168. Query pageQuery = strategy.getNamedQuery("WeblogTemplate.getByWebsite");
  169. pageQuery.setParameter(1, website);
  170. List pages = pageQuery.getResultList();
  171. for (Iterator iter = pages.iterator(); iter.hasNext();) {
  172. WeblogTemplate page = (WeblogTemplate) iter.next();
  173. this.strategy.remove(page);
  174. }
  175. // remove folders (including bookmarks)
  176. WeblogBookmarkFolder rootFolder = bmgr.getRootFolder(website);
  177. if (null != rootFolder) {
  178. this.strategy.remove(rootFolder);
  179. }
  180. this.strategy.flush();
  181. // remove mediafile metadata
  182. // remove uploaded files
  183. MediaFileManager mfmgr = WebloggerFactory.getWeblogger().getMediaFileManager();
  184. mfmgr.removeAllFiles(website);
  185. //List<MediaFileDirectory> dirs = mmgr.getMediaFileDirectories(website);
  186. //for (MediaFileDirectory dir : dirs) {
  187. //this.strategy.remove(dir);
  188. //}
  189. this.strategy.flush();
  190. // remove entries
  191. Query refQuery = strategy.getNamedQuery("WeblogEntry.getByWebsite");
  192. refQuery.setParameter(1, website);
  193. List entries = refQuery.getResultList();
  194. for (Iterator iter = entries.iterator(); iter.hasNext();) {
  195. WeblogEntry entry = (WeblogEntry) iter.next();
  196. emgr.removeWeblogEntry(entry);
  197. }
  198. this.strategy.flush();
  199. // remove categories
  200. WeblogCategory rootCat = emgr.getRootWeblogCategory(website);
  201. if (null != rootCat) {
  202. this.strategy.remove(rootCat);
  203. }
  204. // remove permissions
  205. for (Iterator iterator = umgr.getWeblogPermissions(website).iterator(); iterator.hasNext();) {
  206. WeblogPermission perm = (WeblogPermission) iterator.next();
  207. umgr.revokeWeblogPermission(perm.getWeblog(), perm.getUser(), WeblogPermission.ALL_ACTIONS);
  208. }
  209. // flush the changes before returning. This is required as there is a
  210. // circular dependency between WeblogCategory and Weblog
  211. this.strategy.flush();
  212. }
  213. protected void updateTagAggregates(List tags) throws WebloggerException {
  214. for(Iterator iter = tags.iterator(); iter.hasNext();) {
  215. TagStat stat = (TagStat) iter.next();
  216. Query query = strategy.getNamedUpdate(
  217. "WeblogEntryTagAggregate.getByName&WebsiteNullOrderByLastUsedDesc");
  218. query.setParameter(1, stat.getName());
  219. try {
  220. WeblogEntryTagAggregate agg = (WeblogEntryTagAggregate)query.getSingleResult();
  221. agg.setTotal(agg.getTotal() - stat.getCount());
  222. } catch (NoResultException ignored) {} // no agg to be updated
  223. }
  224. }
  225. /**
  226. * @see org.apache.roller.weblogger.model.UserManager#storePage(org.apache.roller.weblogger.pojos.WeblogTemplate)
  227. */
  228. public void savePage(WeblogTemplate page) throws WebloggerException {
  229. this.strategy.store(page);
  230. // update weblog last modified date. date updated by saveWebsite()
  231. roller.getWeblogManager().saveWeblog(page.getWebsite());
  232. }
  233. public void removePage(WeblogTemplate page) throws WebloggerException {
  234. this.strategy.remove(page);
  235. // update weblog last modified date. date updated by saveWebsite()
  236. roller.getWeblogManager().saveWeblog(page.getWebsite());
  237. }
  238. public void addWeblog(Weblog newWeblog) throws WebloggerException {
  239. this.strategy.store(newWeblog);
  240. this.strategy.flush();
  241. this.addWeblogContents(newWeblog);
  242. }
  243. private void addWeblogContents(Weblog newWeblog)
  244. throws WebloggerException {
  245. // grant weblog creator ADMIN permission
  246. List<String> actions = new ArrayList<String>();
  247. actions.add(WeblogPermission.ADMIN);
  248. roller.getUserManager().grantWeblogPermission(
  249. newWeblog, newWeblog.getCreator(), actions);
  250. // add default category
  251. WeblogCategory rootCat = new WeblogCategory(
  252. newWeblog, // newWeblog
  253. null, // parent
  254. "root", // name
  255. "root", // description
  256. null ); // image
  257. this.strategy.store(rootCat);
  258. String cats = WebloggerConfig.getProperty("newuser.categories");
  259. WeblogCategory firstCat = rootCat;
  260. if (cats != null && cats.trim().length() > 0) {
  261. String[] splitcats = cats.split(",");
  262. for (int i=0; i<splitcats.length; i++) {
  263. WeblogCategory c = new WeblogCategory(
  264. newWeblog, // newWeblog
  265. rootCat, // parent
  266. splitcats[i], // name
  267. splitcats[i], // description
  268. null ); // image
  269. if (i == 0) firstCat = c;
  270. rootCat.getWeblogCategories().add(c);
  271. this.strategy.store(c);
  272. }
  273. }
  274. // Use first category as default for Blogger API
  275. newWeblog.setBloggerCategory(firstCat);
  276. // But default category for weblog itself should be root
  277. newWeblog.setDefaultCategory(rootCat);
  278. this.strategy.store(newWeblog);
  279. // add default bookmarks
  280. WeblogBookmarkFolder root = new WeblogBookmarkFolder(
  281. null, "root", "root", newWeblog);
  282. this.strategy.store(root);
  283. Integer zero = new Integer(0);
  284. String blogroll = WebloggerConfig.getProperty("newuser.blogroll");
  285. if (blogroll != null) {
  286. String[] splitroll = blogroll.split(",");
  287. for (int i=0; i<splitroll.length; i++) {
  288. String[] rollitems = splitroll[i].split("\\|");
  289. if (rollitems != null && rollitems.length > 1) {
  290. WeblogBookmark b = new WeblogBookmark(
  291. root, // parent
  292. rollitems[0], // name
  293. "", // description
  294. rollitems[1].trim(), // url
  295. null, // feedurl
  296. zero, // weight
  297. zero, // priority
  298. null); // image
  299. this.strategy.store(b);
  300. root.getBookmarks().add(b);
  301. }
  302. }
  303. }
  304. // add any auto enabled ping targets
  305. PingTargetManager pingTargetMgr = roller.getPingTargetManager();
  306. AutoPingManager autoPingMgr = roller.getAutopingManager();
  307. Iterator pingTargets = pingTargetMgr.getCommonPingTargets().iterator();
  308. PingTarget pingTarget = null;
  309. while(pingTargets.hasNext()) {
  310. pingTarget = (PingTarget) pingTargets.next();
  311. if(pingTarget.isAutoEnabled()) {
  312. AutoPing autoPing = new AutoPing(
  313. null, pingTarget, newWeblog);
  314. autoPingMgr.saveAutoPing(autoPing);
  315. }
  316. }
  317. roller.getMediaFileManager().createRootMediaFileDirectory(newWeblog);
  318. }
  319. public Weblog getWeblog(String id) throws WebloggerException {
  320. return (Weblog) this.strategy.load(Weblog.class, id);
  321. }
  322. public Weblog getWeblogByHandle(String handle) throws WebloggerException {
  323. return getWeblogByHandle(handle, Boolean.TRUE);
  324. }
  325. /**
  326. * Return website specified by handle.
  327. */
  328. public Weblog getWeblogByHandle(String handle, Boolean enabled)
  329. throws WebloggerException {
  330. if (handle==null )
  331. throw new WebloggerException("Handle cannot be null");
  332. // check cache first
  333. // NOTE: if we ever allow changing handles then this needs updating
  334. if(this.weblogHandleToIdMap.containsKey(handle)) {
  335. Weblog weblog = this.getWeblog(
  336. (String) this.weblogHandleToIdMap.get(handle));
  337. if(weblog != null) {
  338. // only return weblog if enabled status matches
  339. if(enabled == null || enabled.equals(weblog.getEnabled())) {
  340. log.debug("weblogHandleToId CACHE HIT - "+handle);
  341. return weblog;
  342. }
  343. } else {
  344. // mapping hit with lookup miss? mapping must be old, remove it
  345. this.weblogHandleToIdMap.remove(handle);
  346. }
  347. }
  348. Query query = strategy.getNamedQuery("Weblog.getByHandle");
  349. query.setParameter(1, handle);
  350. Weblog website = null;
  351. try {
  352. website = (Weblog)query.getSingleResult();
  353. } catch (NoResultException e) {
  354. website = null;
  355. }
  356. // add mapping to cache
  357. if(website != null) {
  358. log.debug("weblogHandleToId CACHE MISS - "+handle);
  359. this.weblogHandleToIdMap.put(website.getHandle(), website.getId());
  360. }
  361. if(website != null &&
  362. (enabled == null || enabled.equals(website.getEnabled()))) {
  363. return website;
  364. } else {
  365. return null;
  366. }
  367. }
  368. /**
  369. * Get websites of a user
  370. */
  371. public List getWeblogs(
  372. Boolean enabled, Boolean active,
  373. Date startDate, Date endDate, int offset, int length) throws WebloggerException {
  374. //if (endDate == null) endDate = new Date();
  375. List params = new ArrayList();
  376. int size = 0;
  377. StringBuffer queryString = new StringBuffer();
  378. StringBuffer whereClause = new StringBuffer();
  379. queryString.append("SELECT w FROM Weblog w WHERE ");
  380. if (startDate != null) {
  381. Timestamp start = new Timestamp(startDate.getTime());
  382. if (whereClause.length() > 0) whereClause.append(" AND ");
  383. params.add(size++, start);
  384. whereClause.append(" w.dateCreated > ?" + size);
  385. }
  386. if (endDate != null) {
  387. Timestamp end = new Timestamp(endDate.getTime());
  388. if (whereClause.length() > 0) whereClause.append(" AND ");
  389. params.add(size++, end);
  390. whereClause.append(" w.dateCreated < ?" + size);
  391. }
  392. if (enabled != null) {
  393. if (whereClause.length() > 0) whereClause.append(" AND ");
  394. params.add(size++, enabled);
  395. whereClause.append(" w.enabled = ?" + size);
  396. }
  397. if (active != null) {
  398. if (whereClause.length() > 0) whereClause.append(" AND ");
  399. params.add(size++, active);
  400. whereClause.append(" w.active = ?" + size);
  401. }
  402. whereClause.append(" ORDER BY w.dateCreated DESC");
  403. Query query = strategy.getDynamicQuery(queryString.toString() + whereClause.toString());
  404. if (offset != 0) {
  405. query.setFirstResult(offset);
  406. }
  407. if (length != -1) {
  408. query.setMaxResults(length);
  409. }
  410. for (int i=0; i<params.size(); i++) {
  411. query.setParameter(i+1, params.get(i));
  412. }
  413. return query.getResultList();
  414. }
  415. public List getUserWeblogs(User user, boolean enabledOnly) throws WebloggerException {
  416. List weblogs = new ArrayList();
  417. List<WeblogPermission> perms = roller.getUserManager().getWeblogPermissions(user);
  418. for (WeblogPermission perm : perms) {
  419. Weblog weblog = perm.getWeblog();
  420. if (!enabledOnly || weblog.getEnabled().booleanValue()) {
  421. if (weblog.getActive() != null && weblog.getActive().booleanValue()) {
  422. weblogs.add(weblog);
  423. }
  424. }
  425. }
  426. return weblogs;
  427. }
  428. public List getWeblogUsers(Weblog weblog, boolean enabledOnly) throws WebloggerException {
  429. List users = new ArrayList();
  430. List<WeblogPermission> perms = roller.getUserManager().getWeblogPermissions(weblog);
  431. for (WeblogPermission perm : perms) {
  432. User user = perm.getUser();
  433. if (user == null) {
  434. log.error("ERROR user is null, userName:" + perm.getUserName());
  435. continue;
  436. }
  437. if (!enabledOnly || user.getEnabled().booleanValue()) {
  438. users.add(user);
  439. }
  440. }
  441. return users;
  442. }
  443. public WeblogTemplate getPage(String id) throws WebloggerException {
  444. // Don't hit database for templates stored on disk
  445. if (id != null && id.endsWith(".vm")) return null;
  446. return (WeblogTemplate)this.strategy.load(WeblogTemplate.class,id);
  447. }
  448. /**
  449. * Use JPA directly because Weblogger's Query API does too much allocation.
  450. */
  451. public WeblogTemplate getPageByLink(Weblog website, String pagelink)
  452. throws WebloggerException {
  453. if (website == null)
  454. throw new WebloggerException("userName is null");
  455. if (pagelink == null)
  456. throw new WebloggerException("Pagelink is null");
  457. Query query = strategy.getNamedQuery("WeblogTemplate.getByWebsite&Link");
  458. query.setParameter(1, website);
  459. query.setParameter(2, pagelink);
  460. try {
  461. return (WeblogTemplate)query.getSingleResult();
  462. } catch (NoResultException e) {
  463. return null;
  464. }
  465. }
  466. /**
  467. * @see org.apache.roller.weblogger.model.UserManager#getPageByAction(Weblog, java.lang.String)
  468. */
  469. public WeblogTemplate getPageByAction(Weblog website, String action)
  470. throws WebloggerException {
  471. if (website == null)
  472. throw new WebloggerException("website is null");
  473. if (action == null)
  474. throw new WebloggerException("Action name is null");
  475. Query query = strategy.getNamedQuery("WeblogTemplate.getByAction");
  476. query.setParameter(1, website);
  477. query.setParameter(2, action);
  478. try {
  479. return (WeblogTemplate)query.getSingleResult();
  480. } catch (NoResultException e) {
  481. return null;
  482. }
  483. }
  484. /**
  485. * @see org.apache.roller.weblogger.model.UserManager#getPageByName(Weblog, java.lang.String)
  486. */
  487. public WeblogTemplate getPageByName(Weblog website, String pagename)
  488. throws WebloggerException {
  489. if (website == null)
  490. throw new WebloggerException("website is null");
  491. if (pagename == null)
  492. throw new WebloggerException("Page name is null");
  493. Query query = strategy.getNamedQuery("WeblogTemplate.getByWebsite&Name");
  494. query.setParameter(1, website);
  495. query.setParameter(2, pagename);
  496. try {
  497. return (WeblogTemplate)query.getSingleResult();
  498. } catch (NoResultException e) {
  499. return null;
  500. }
  501. }
  502. /**
  503. * @see org.apache.roller.weblogger.model.UserManager#getPages(Weblog)
  504. */
  505. public List getPages(Weblog website) throws WebloggerException {
  506. if (website == null)
  507. throw new WebloggerException("website is null");
  508. Query q = strategy.getNamedQuery(
  509. "WeblogTemplate.getByWebsiteOrderByName");
  510. q.setParameter(1, website);
  511. return q.getResultList();
  512. }
  513. public Map getWeblogHandleLetterMap() throws WebloggerException {
  514. String lc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  515. Map results = new TreeMap();
  516. Query query = strategy.getNamedQuery(
  517. "Weblog.getCountByHandleLike");
  518. for (int i=0; i<26; i++) {
  519. char currentChar = lc.charAt(i);
  520. query.setParameter(1, currentChar + "%");
  521. List row = query.getResultList();
  522. Long count = (Long) row.get(0);
  523. results.put(String.valueOf(currentChar), count);
  524. }
  525. return results;
  526. }
  527. public List getWeblogsByLetter(char letter, int offset, int length)
  528. throws WebloggerException {
  529. Query query = strategy.getNamedQuery(
  530. "Weblog.getByLetterOrderByHandle");
  531. query.setParameter(1, letter + "%");
  532. if (offset != 0) {
  533. query.setFirstResult(offset);
  534. }
  535. if (length != -1) {
  536. query.setMaxResults(length);
  537. }
  538. return query.getResultList();
  539. }
  540. public List getMostCommentedWeblogs(Date startDate, Date endDate,
  541. int offset, int length)
  542. throws WebloggerException {
  543. Query query = null;
  544. if (endDate == null) endDate = new Date();
  545. if (startDate != null) {
  546. Timestamp start = new Timestamp(startDate.getTime());
  547. Timestamp end = new Timestamp(endDate.getTime());
  548. query = strategy.getNamedQuery(
  549. "WeblogEntryComment.getMostCommentedWebsiteByEndDate&StartDate");
  550. query.setParameter(1, end);
  551. query.setParameter(2, start);
  552. } else {
  553. Timestamp end = new Timestamp(endDate.getTime());
  554. query = strategy.getNamedQuery(
  555. "WeblogEntryComment.getMostCommentedWebsiteByEndDate");
  556. query.setParameter(1, end);
  557. }
  558. if (offset != 0) {
  559. query.setFirstResult(offset);
  560. }
  561. if (length != -1) {
  562. query.setMaxResults(length);
  563. }
  564. List queryResults = query.getResultList();
  565. List results = new ArrayList();
  566. for (Iterator iter = queryResults.iterator(); iter.hasNext();) {
  567. Object[] row = (Object[]) iter.next();
  568. StatCount sc = new StatCount(
  569. (String)row[1], // website id
  570. (String)row[2], // website handle
  571. (String)row[3], // website name
  572. "statCount.weblogCommentCountType", // stat type
  573. ((Long)row[0]).longValue()); // # comments
  574. sc.setWeblogHandle((String)row[2]);
  575. results.add(sc);
  576. }
  577. // Original query ordered by desc # comments.
  578. // JPA QL doesn't allow queries to be ordered by agregates; do it in memory
  579. Collections.sort(results, statCountCountReverseComparator);
  580. return results;
  581. }
  582. /**
  583. * Get count of weblogs, active and inactive
  584. */
  585. public long getWeblogCount() throws WebloggerException {
  586. long ret = 0;
  587. List results = strategy.getNamedQuery(
  588. "Weblog.getCountAllDistinct").getResultList();
  589. ret = ((Long)results.get(0)).longValue();
  590. return ret;
  591. }
  592. }