1 18 21 package org.apache.roller.business.hibernate; 22 23 import java.io.StringReader ; 24 import org.hibernate.Criteria; 25 import org.hibernate.HibernateException; 26 import org.hibernate.Session; 27 import org.hibernate.criterion.Expression; 28 import org.apache.roller.RollerException; 29 import org.apache.roller.pojos.Assoc; 30 import org.apache.roller.pojos.BookmarkData; 31 import org.apache.roller.pojos.FolderAssoc; 32 import org.apache.roller.pojos.FolderData; 33 import org.apache.roller.pojos.WebsiteData; 34 import java.util.Iterator ; 35 import java.util.LinkedList ; 36 import java.util.List ; 37 import org.apache.commons.logging.Log; 38 import org.apache.commons.logging.LogFactory; 39 import org.jdom.Document; 40 import org.jdom.Element; 41 import org.jdom.input.SAXBuilder; 42 import org.apache.roller.model.BookmarkManager; 43 import org.apache.roller.model.RollerFactory; 44 import org.apache.roller.util.Utilities; 45 46 47 50 public class HibernateBookmarkManagerImpl implements BookmarkManager { 51 52 static final long serialVersionUID = 5286654557062382772L; 53 54 private static Log log = LogFactory.getLog(HibernateBookmarkManagerImpl.class); 55 56 private HibernatePersistenceStrategy strategy = null; 57 58 59 63 public HibernateBookmarkManagerImpl(HibernatePersistenceStrategy strat) { 64 log.debug("Instantiating Hibernate Bookmark Manager"); 65 66 this.strategy = strat; 67 } 68 69 70 public void saveBookmark(BookmarkData bookmark) throws RollerException { 71 this.strategy.store(bookmark); 72 73 RollerFactory.getRoller().getUserManager().saveWebsite(bookmark.getWebsite()); 75 } 76 77 78 public BookmarkData getBookmark(String id) throws RollerException { 79 BookmarkData bd = (BookmarkData) 80 strategy.load(id, BookmarkData.class); 81 if (bd != null) bd.setBookmarkManager(this); 83 return bd; 84 } 85 86 87 public void removeBookmark(BookmarkData bookmark) throws RollerException { 88 this.strategy.remove(bookmark); 89 90 RollerFactory.getRoller().getUserManager().saveWebsite(bookmark.getWebsite()); 92 } 93 94 96 97 public void saveFolder(FolderData folder) throws RollerException { 98 99 if(isDuplicateFolderName(folder)) { 100 throw new RollerException("Duplicate folder name"); 101 } 102 103 this.strategy.store(folder); 104 105 RollerFactory.getRoller().getUserManager().saveWebsite(folder.getWebsite()); 107 } 108 109 110 public void removeFolder(FolderData folder) throws RollerException { 111 112 this.strategy.remove(folder); 113 114 RollerFactory.getRoller().getUserManager().saveWebsite(folder.getWebsite()); 116 } 117 118 119 122 public FolderData getFolder(String id) throws RollerException { 123 return (FolderData)strategy.load(id, FolderData.class); 124 } 125 126 128 public void importBookmarks(WebsiteData website, String folderName, String opml) 129 throws RollerException { 130 131 String msg = "importBookmarks"; 132 try { 133 SAXBuilder builder = new SAXBuilder(); 135 StringReader reader = new StringReader ( opml ); 136 Document doc = builder.build( reader ); 137 138 FolderData newFolder = getFolder(website, folderName); 139 if (newFolder == null) { 140 newFolder = new FolderData( 141 getRootFolder(website), folderName, folderName, website); 142 this.strategy.store(newFolder); 143 } 144 145 Element body = doc.getRootElement().getChild("body"); 147 Iterator iter = body.getChildren().iterator(); 148 while (iter.hasNext()) { 149 Element elem = (Element)iter.next(); 150 importOpmlElement( website, elem, newFolder ); 151 } 152 153 } catch (Exception ex) { 154 throw new RollerException(ex); 155 } 156 } 157 158 private void importOpmlElement( 161 WebsiteData website, Element elem, FolderData parent) 162 throws RollerException { 163 String text = elem.getAttributeValue("text"); 164 String title = elem.getAttributeValue("title"); 165 String desc = elem.getAttributeValue("description"); 166 String url = elem.getAttributeValue("url"); 167 String xmlUrl = elem.getAttributeValue("xmlUrl"); 169 String htmlUrl = elem.getAttributeValue("htmlUrl"); 170 171 title = null!=title ? title : text; 172 desc = null!=desc ? desc : title; 173 xmlUrl = null!=xmlUrl ? xmlUrl : url; 174 url = null!=htmlUrl ? htmlUrl : url; 175 176 if (elem.getChildren().size()==0) { 177 if (null != title && null != url) { 183 BookmarkData bd = new BookmarkData(parent, 184 title, 185 desc, 186 url, 187 xmlUrl, 188 new Integer (0), 189 new Integer (100), 190 null); 191 parent.addBookmark(bd); 192 this.strategy.store(bd); 194 } 195 } else { 196 FolderData fd = new FolderData( 198 parent, 199 title, 200 desc, 201 parent.getWebsite()); 202 this.strategy.store(fd); 203 204 Iterator iter = elem.getChildren("outline").iterator(); 206 while ( iter.hasNext() ) { 207 Element subelem = (Element)iter.next(); 208 importOpmlElement( website, subelem, fd ); 209 } 210 } 211 } 212 213 public void moveFolderContents(FolderData src, FolderData dest) 215 throws RollerException { 216 217 if (dest.descendentOf(src)) { 218 throw new RollerException( 219 "ERROR cannot move parent folder into it's own child"); 220 } 221 222 try { 223 LinkedList deleteList = new LinkedList (); 225 Iterator srcBookmarks = src.getBookmarks().iterator(); 226 while (srcBookmarks.hasNext()) { 227 BookmarkData bd = (BookmarkData)srcBookmarks.next(); 228 deleteList.add(bd); 229 230 BookmarkData movedBd = new BookmarkData(); 231 movedBd.setData(bd); 232 movedBd.setId(null); 233 234 dest.addBookmark(movedBd); 235 this.strategy.store(movedBd); 236 } 237 238 Iterator deleteIter = deleteList.iterator(); 240 while (deleteIter.hasNext()) { 241 BookmarkData bd = (BookmarkData)deleteIter.next(); 242 src.removeBookmark(bd); 243 this.strategy.remove(bd); 245 } 246 247 } catch (Exception ex) { 248 throw new RollerException(ex); 249 } 250 } 251 252 public void removeFolderContents(FolderData src) throws RollerException { 254 255 Iterator srcBookmarks = src.getBookmarks().iterator(); 257 while (srcBookmarks.hasNext()) { 258 BookmarkData bd = (BookmarkData)srcBookmarks.next(); 259 this.strategy.remove(bd); 260 } 261 } 262 263 265 public FolderData getFolder(WebsiteData website, String folderPath) 266 throws RollerException { 267 return getFolderByPath(website, null, folderPath); 268 } 269 270 public String getPath(FolderData folder) throws RollerException { 271 if (null == folder.getParent()) { 272 return "/"; 273 } else { 274 String parentPath = getPath(folder.getParent()); 275 parentPath = "/".equals(parentPath) ? "" : parentPath; 276 return parentPath + "/" + folder.getName(); 277 } 278 } 279 280 public FolderData getFolderByPath( 281 WebsiteData website, FolderData folder, String path) 282 throws RollerException { 283 final Iterator folders; 284 final String [] pathArray = Utilities.stringToStringArray(path, "/"); 285 286 if (folder == null && (null == path || "".equals(path.trim()))) { 287 throw new RollerException("Bad arguments."); 288 } 289 290 if (path.trim().equals("/")) { 291 return getRootFolder(website); 292 } else if (folder == null || path.trim().startsWith("/")) { 293 folders = getRootFolder(website).getFolders().iterator(); 294 } else { 295 folders = folder.getFolders().iterator(); 296 } 297 298 while (folders.hasNext()) { 299 FolderData possibleMatch = (FolderData)folders.next(); 300 if (possibleMatch.getName().equals(pathArray[0])) { 301 if (pathArray.length == 1) { 302 return possibleMatch; 303 } else { 304 String [] subpath = new String [pathArray.length - 1]; 305 System.arraycopy(pathArray, 1, subpath, 0, subpath.length); 306 307 String pathString= Utilities.stringArrayToString(subpath,"/"); 308 return getFolderByPath(website, possibleMatch, pathString); 309 } 310 } 311 } 312 313 return null; 315 } 316 317 319 320 public FolderAssoc retrieveFolderAssoc(String id) throws RollerException { 321 return (FolderAssoc)strategy.load(id, FolderAssoc.class); 322 } 323 324 public void release() {} 325 326 330 public List getBookmarks(FolderData folder, boolean subfolders) 331 throws RollerException { 332 try { 333 Session session = ((HibernatePersistenceStrategy) strategy).getSession(); 334 List bookmarks = new LinkedList (); 335 if (subfolders) { 336 Criteria assocsQuery = session 338 .createCriteria(FolderAssoc.class); 339 assocsQuery.add(Expression.eq("ancestorFolder", folder)); 340 Iterator assocs = assocsQuery.list().iterator(); 341 while (assocs.hasNext()) { 342 FolderAssoc assoc = (FolderAssoc) assocs.next(); 343 Criteria bookmarksQuery = session 344 .createCriteria(BookmarkData.class); 345 bookmarksQuery.add(Expression.eq("folder", assoc 346 .getFolder())); 347 Iterator bookmarkIter = bookmarksQuery.list().iterator(); 348 while (bookmarkIter.hasNext()) { 349 BookmarkData entry = (BookmarkData) bookmarkIter.next(); 350 bookmarks.add(entry); 351 } 352 } 353 } 354 355 Criteria bookmarksQuery = session 357 .createCriteria(BookmarkData.class); 358 bookmarksQuery.add(Expression.eq("folder", folder)); 359 Iterator bookmarkIter = bookmarksQuery.list().iterator(); 360 while (bookmarkIter.hasNext()) { 361 BookmarkData bookmark = (BookmarkData) bookmarkIter.next(); 362 bookmarks.add(bookmark); 363 } 364 return bookmarks; 365 } catch (HibernateException e) { 366 throw new RollerException(e); 367 } 368 } 369 370 public FolderData getRootFolder(WebsiteData website) throws RollerException { 371 if (website == null) 372 throw new RollerException("website is null"); 373 try { 374 Session session = ((HibernatePersistenceStrategy) strategy).getSession(); 375 Criteria criteria = session.createCriteria(FolderAssoc.class); 376 criteria.createAlias("folder", "f"); 377 criteria.add(Expression.eq("f.website", website)); 378 criteria.add(Expression.isNull("ancestorFolder")); 379 criteria.add(Expression.eq("relation", FolderAssoc.PARENT)); 380 List results = criteria.list(); 381 if (results.size() > 1) { 382 throw new RollerException( 384 "More than one root folder found for website " 385 + website.getId()); 386 } else if (results.size() == 1) { 387 return ((FolderAssoc) results.get(0)).getFolder(); 389 } 390 return null; 391 } catch (HibernateException e) { 392 throw new RollerException(e); 393 } 394 } 395 396 public List getAllFolders(WebsiteData website) throws RollerException { 397 if (website == null) 398 throw new RollerException("Website is null"); 399 400 try { 401 Session session = ((HibernatePersistenceStrategy) strategy).getSession(); 402 Criteria criteria = session.createCriteria(FolderData.class); 403 criteria.add(Expression.eq("website", website)); 404 return criteria.list(); 405 } catch (HibernateException e) { 406 throw new RollerException(e); 407 } 408 409 } 410 411 414 public boolean isDuplicateFolderName(FolderData folder) throws RollerException { 415 boolean isNewFolder = (folder.getId() == null); 417 FolderData parent = 418 isNewFolder ? (FolderData)folder.getNewParent() : folder.getParent(); 419 420 if (null != parent) { 421 List sameNames; 422 try { 423 Session session = ((HibernatePersistenceStrategy) strategy).getSession(); 424 Criteria criteria = session.createCriteria(FolderAssoc.class); 425 criteria.createAlias("folder", "f"); 426 criteria.add(Expression.eq("f.name", folder.getName())); 427 criteria.add(Expression.eq("ancestorFolder", parent)); 428 criteria.add(Expression.eq("relation", Assoc.PARENT)); 429 sameNames = criteria.list(); 430 } catch (HibernateException e) { 431 throw new RollerException(e); 432 } 433 if (sameNames.size() > 0) { 435 if (isNewFolder) return true; 437 if (!(sameNames.size() == 1 && folder.getId().equals(((FolderAssoc)sameNames.get(0)).getFolder().getId()))) 439 return true; 440 } 441 } 442 return false; 443 } 444 445 449 public Assoc getFolderParentAssoc(FolderData folder) throws RollerException { 450 try { 451 Session session = ((HibernatePersistenceStrategy)strategy).getSession(); 452 Criteria criteria = session.createCriteria(FolderAssoc.class); 453 criteria.add(Expression.eq("folder", folder)); 454 criteria.add(Expression.eq("relation", Assoc.PARENT)); 455 List parents = criteria.list(); 456 if (parents.size() > 1) { 457 throw new RollerException("ERROR: more than one parent"); 458 } else if (parents.size() == 1) { 459 return (Assoc) parents.get(0); 460 } else { 461 return null; 462 } 463 } catch (HibernateException e) { 464 throw new RollerException(e); 465 } 466 } 467 468 472 public List getFolderChildAssocs(FolderData folder) throws RollerException { 473 try { 474 Session session = ((HibernatePersistenceStrategy)strategy).getSession(); 475 Criteria criteria = session.createCriteria(FolderAssoc.class); 476 criteria.add(Expression.eq("ancestorFolder", folder)); 477 criteria.add(Expression.eq("relation", Assoc.PARENT)); 478 return criteria.list(); 479 } catch (HibernateException e) { 480 throw new RollerException(e); 481 } 482 } 483 484 488 public List getAllFolderDecscendentAssocs(FolderData folder) throws RollerException { 489 try { 490 Session session = ((HibernatePersistenceStrategy)strategy).getSession(); 491 Criteria criteria = session.createCriteria(FolderAssoc.class); 492 criteria.add(Expression.eq("ancestorFolder", folder)); 493 return criteria.list(); 494 } catch (HibernateException e) { 495 throw new RollerException(e); 496 } 497 } 498 499 503 public List getFolderAncestorAssocs(FolderData folder) throws RollerException { 504 try { 505 Session session = ((HibernatePersistenceStrategy)strategy).getSession(); 506 Criteria criteria = session.createCriteria(FolderAssoc.class); 507 criteria.add(Expression.eq("folder", folder)); 508 return criteria.list(); 509 } catch (HibernateException e) { 510 throw new RollerException(e); 511 } 512 } 513 514 517 public boolean isFolderInUse(FolderData folder) throws RollerException { 518 try { 519 522 528 Session session = ((HibernatePersistenceStrategy)strategy).getSession(); 529 Criteria criteria = session.createCriteria(BookmarkData.class); 530 criteria.add(Expression.eq("folder", folder)); 531 criteria.setMaxResults(1); 532 int entryCount = criteria.list().size(); 533 534 return (entryCount > 0 || folder.getFolders().size() > 0); 536 } catch (HibernateException e) { 537 throw new RollerException(e); 538 } 539 } 540 541 public boolean isDescendentOf(FolderData child, FolderData ancestor) 542 throws RollerException { 543 boolean ret = false; 544 try { 545 Session session = ((HibernatePersistenceStrategy)strategy).getSession(); 546 Criteria criteria = session.createCriteria(FolderAssoc.class); 547 criteria.add(Expression.eq("folder", child)); 548 criteria.add(Expression.eq("ancestorFolder", ancestor)); 549 ret = criteria.list().size() > 0; 550 } catch (HibernateException e) { 551 throw new RollerException(e); 552 } 553 return ret; 554 } 555 } 556 | Popular Tags |