1 31 package org.blojsom.upgrade; 32 33 import org.apache.commons.io.FileUtils; 34 import org.apache.commons.logging.Log; 35 import org.apache.commons.logging.LogFactory; 36 import org.blojsom.blog.Blog; 37 import org.blojsom.blog.*; 38 import org.blojsom.blog.database.*; 39 import org.blojsom.fetcher.Fetcher; 40 import org.blojsom.fetcher.FetcherException; 41 import org.blojsom.plugin.common.ResponseConstants; 42 import org.blojsom.util.BlojsomConstants; 43 import org.blojsom.util.BlojsomMetaDataConstants; 44 import org.blojsom2.BlojsomException; 45 import org.blojsom2.blog.*; 46 import org.blojsom2.blog.Pingback; 47 import org.blojsom2.blog.Trackback; 48 import org.blojsom2.fetcher.BlojsomFetcher; 49 import org.blojsom2.fetcher.BlojsomFetcherException; 50 import org.blojsom2.util.BlojsomProperties; 51 import org.blojsom2.util.BlojsomUtils; 52 import org.springframework.beans.FatalBeanException; 53 import org.springframework.beans.InvalidPropertyException; 54 55 import javax.servlet.ServletConfig ; 56 import javax.servlet.ServletException ; 57 import java.io.File ; 58 import java.io.FileInputStream ; 59 import java.io.IOException ; 60 import java.io.InputStream ; 61 import java.util.*; 62 63 70 public class Blojsom2ToBlojsom3Utility { 71 72 private static Log _logger = LogFactory.getLog(Blojsom2ToBlojsom3Utility.class); 73 74 private ServletConfig _servletConfig; 75 private Fetcher _fetcher; 76 77 private BlojsomFetcher _blojsom2Fetcher; 78 private BlojsomConfiguration _blojsomConfiguration; 79 80 private String _blojsom2Path; 81 private String _blojsom3Path; 82 83 86 public Blojsom2ToBlojsom3Utility() { 87 } 88 89 94 public void setBlojsom2Path(String blojsom2Path) { 95 _blojsom2Path = blojsom2Path; 96 } 97 98 103 public void setBlojsom3Path(String blojsom3Path) { 104 _blojsom3Path = blojsom3Path; 105 } 106 107 112 public void setFetcher(Fetcher fetcher) { 113 _fetcher = fetcher; 114 } 115 116 121 public void setServletConfig(ServletConfig servletConfig) { 122 _servletConfig = servletConfig; 123 } 124 125 133 protected void configureFetcher(ServletConfig servletConfig, BlojsomConfiguration blojsomConfiguration) throws ServletException { 134 String fetcherClassName = blojsomConfiguration.getFetcherClass(); 135 try { 136 Class fetcherClass = Class.forName(fetcherClassName); 137 _blojsom2Fetcher = (BlojsomFetcher) fetcherClass.newInstance(); 138 _blojsom2Fetcher.init(servletConfig, blojsomConfiguration); 139 _logger.info("Added blojsom fetcher: " + fetcherClassName); 140 } catch (ClassNotFoundException e) { 141 _logger.error(e); 142 throw new ServletException (e); 143 } catch (InstantiationException e) { 144 _logger.error(e); 145 throw new ServletException (e); 146 } catch (IllegalAccessException e) { 147 _logger.error(e); 148 throw new ServletException (e); 149 } catch (BlojsomFetcherException e) { 150 _logger.error(e); 151 throw new ServletException (e); 152 } 153 } 154 155 158 private void loadBlojsom2Configuration() { 159 String blojsomPropertiesPath = _blojsom2Path + "/" + BlojsomConstants.DEFAULT_CONFIGURATION_BASE_DIRECTORY + "/blojsom.properties"; 160 BlojsomProperties _blojsomProperties; 161 try { 162 _blojsomProperties = new BlojsomProperties(); 163 _blojsomProperties.load(new FileInputStream (blojsomPropertiesPath)); 164 } catch (IOException e) { 165 if (_logger.isErrorEnabled()) { 166 _logger.error(e); 167 } 168 169 _blojsomProperties = null; 170 } 171 172 if (_blojsomProperties == null) { 173 throw new FatalBeanException("Unable to load blojsom properties file: " + blojsomPropertiesPath); 174 } 175 176 try { 177 _blojsomConfiguration = new BlojsomConfiguration(_servletConfig, org.blojsom.util.BlojsomUtils.propertiesToMap(_blojsomProperties)); 178 } catch (BlojsomConfigurationException e) { 179 if (_logger.isErrorEnabled()) { 180 _logger.error(e); 181 } 182 } 183 184 if (_blojsomConfiguration == null) { 185 throw new FatalBeanException("Unable to construct blojsom configuration object"); 186 } 187 188 try { 189 configureFetcher(_servletConfig, _blojsomConfiguration); 190 } catch (ServletException e) { 191 if (_logger.isErrorEnabled()) { 192 _logger.error(e); 193 } 194 195 throw new FatalBeanException("Unable to construct blojsom 2 fetcher object", e); 196 } 197 } 198 199 202 public void upgrade() { 203 if (org.blojsom.util.BlojsomUtils.checkNullOrBlank(_blojsom2Path)) { 204 throw new InvalidPropertyException(Blojsom2ToBlojsom3Utility.class, "blojsom2Path", "blojsom2Path property was null or blank"); 205 } 206 207 if (org.blojsom.util.BlojsomUtils.checkNullOrBlank(_blojsom3Path)) { 208 throw new InvalidPropertyException(Blojsom2ToBlojsom3Utility.class, "blojsom3Path", "blojsom3Path property was null or blank"); 209 } 210 211 if (_logger.isDebugEnabled()) { 212 _logger.debug("blojsom 2 path: " + _blojsom2Path); 213 _logger.debug("blojsom 3 path: " + _blojsom3Path); 214 } 215 216 loadBlojsom2Configuration(); 217 218 String [] blojsom2IDs = _blojsomConfiguration.getBlojsomUsers(); 220 for (int i = 0; i < blojsom2IDs.length; i++) { 221 String blojsom2ID = blojsom2IDs[i]; 222 Blog blog; 223 224 try { 226 blog = _fetcher.loadBlog(blojsom2ID); 227 228 if (_logger.isDebugEnabled()) { 229 _logger.debug("Updating existing blog: " + blojsom2ID); 230 } 231 } catch (FetcherException e) { 232 if (_logger.isDebugEnabled()) { 233 _logger.debug("Creating new blog: " + blojsom2ID); 234 } 235 236 blog = new DatabaseBlog(); 237 blog.setBlogId(blojsom2ID); 238 } 239 240 BlogUser blogUser; 241 try { 242 blogUser = _blojsomConfiguration.loadBlog(blojsom2ID); 243 } catch (BlojsomException e) { 244 if (_logger.isErrorEnabled()) { 245 _logger.error("Unable to load blojsom 2 blog ID: " + blojsom2ID); 246 _logger.error(e); 247 } 248 249 continue; 250 } 251 252 Map blojsom2BlogProperties = blogUser.getBlog().getBlogProperties(); 254 Properties blogProperties = org.blojsom2.util.BlojsomUtils.mapToProperties(blojsom2BlogProperties); 255 blogProperties.remove("blog-home"); 257 blogProperties.remove("blog-directory-depth"); 258 blogProperties.remove("blog-file-extensions"); 259 blogProperties.remove("blog-entry-meta-data-extension"); 260 blogProperties.remove("blog-properties-extensions"); 261 blogProperties.remove("blog-default-category-mapping"); 262 blogProperties.remove("blog-comments-directory"); 263 blogProperties.remove("blog-trackbacks-directory"); 264 blogProperties.remove("blog-pingbacks-directory"); 265 blogProperties.remove("blog-xmlrpc-entry-extension"); 266 blogProperties.remove("blog-directory-filter"); 267 blogProperties.remove("blog-blacklist-file"); 268 blog.setProperties(org.blojsom.util.BlojsomUtils.propertiesToMap(blogProperties)); 269 String url = blog.getBlogURL(); 271 url = org.blojsom.util.BlojsomUtils.removeTrailingSlash(url); 272 blog.setBlogURL(url); 273 274 url = blog.getBlogBaseURL(); 275 url = org.blojsom.util.BlojsomUtils.removeTrailingSlash(url); 276 blog.setBlogBaseURL(url); 277 278 blog.setBlogBaseAdminURL(url); 279 280 url = blog.getBlogAdminURL(); 281 url = org.blojsom.util.BlojsomUtils.removeTrailingSlash(url); 282 blog.setBlogAdminURL(url); 283 284 Map blojsom2PluginChains = blogUser.getPluginChain(); 286 Map blojsom3PluginChains = new HashMap(); 287 Iterator pluginIterator = blojsom2PluginChains.keySet().iterator(); 288 while (pluginIterator.hasNext()) { 289 String pluginChainForFlavor = (String ) pluginIterator.next(); 290 String [] flavorForPluginChain = pluginChainForFlavor.split("\\."); 291 if (flavorForPluginChain.length == 2) { 292 blojsom3PluginChains.put(flavorForPluginChain[0], blojsom2PluginChains.get(pluginChainForFlavor)); 293 } else { 294 blojsom3PluginChains.put("default", blojsom2PluginChains.get(pluginChainForFlavor)); 295 } 296 } 297 blog.setPlugins(blojsom3PluginChains); 298 299 Map blojsom2BlogFlavors = blogUser.getFlavors(); 301 Map blojsom3FlavorToTemplate = new HashMap(); 302 Iterator flavorIterator = blojsom2BlogFlavors.keySet().iterator(); 303 while (flavorIterator.hasNext()) { 304 String flavor = (String ) flavorIterator.next(); 305 blojsom3FlavorToTemplate.put(flavor, blogUser.getFlavorToTemplate().get(flavor).toString() + ", " + blogUser.getFlavorToContentType().get(flavor).toString()); 306 } 307 blog.setTemplates(blojsom3FlavorToTemplate); 308 309 try { 311 _fetcher.saveBlog(blog); 312 blog = _fetcher.loadBlog(blog.getBlogId()); 313 } catch (FetcherException e) { 314 if (_logger.isErrorEnabled()) { 315 _logger.error(e); 316 } 317 318 continue; 319 } 320 321 String blogPermissionsPath = _blojsom2Path + "/" + BlojsomConstants.DEFAULT_CONFIGURATION_BASE_DIRECTORY + "/" + blogUser.getId() + "/permissions.properties"; 323 Map blojsom2PermissionsForBlog = new HashMap(); 324 try { 325 InputStream is = new FileInputStream (blogPermissionsPath); 326 BlojsomProperties permissions = new BlojsomProperties(true); 327 permissions.load(is); 328 is.close(); 329 330 blojsom2PermissionsForBlog = org.blojsom2.util.BlojsomUtils.propertiesToMap(permissions); 331 332 if (_logger.isDebugEnabled()) { 333 _logger.debug("Loaded permissions for blojsom 2 blog: " + blogUser.getId()); 334 } 335 } catch (IOException e) { 336 if (_logger.isErrorEnabled()) { 337 _logger.error(e); 338 } 339 } 340 341 Map authorizationMap = blogUser.getBlog().getAuthorization(); 342 Iterator blojsom2UserIterator = authorizationMap.keySet().iterator(); 343 while (blojsom2UserIterator.hasNext()) { 344 String userID = (String ) blojsom2UserIterator.next(); 345 if (_logger.isDebugEnabled()) { 346 _logger.debug("Migrating blojsom 2 user: " + userID); 347 } 348 349 User blojsom3User = new DatabaseUser(); 350 351 blojsom3User.setBlogId(blog.getId()); 352 blojsom3User.setUserLogin(userID); 353 blojsom3User.setUserName(userID); 354 blojsom3User.setUserRegistered(new Date()); 355 blojsom3User.setUserStatus("new"); 356 String [] parsedPasswordAndEmail = BlojsomUtils.parseLastComma((String ) authorizationMap.get(userID)); 357 blojsom3User.setUserPassword(parsedPasswordAndEmail[0]); 358 if (parsedPasswordAndEmail.length == 2) { 359 blojsom3User.setUserEmail(parsedPasswordAndEmail[1]); 360 } else { 361 blojsom3User.setUserEmail(blogUser.getBlog().getBlogOwnerEmail()); 362 } 363 364 Map blojsom3UserMetadata = new HashMap(); 365 366 if (blojsom2PermissionsForBlog.containsKey(userID)) { 367 Object permissionsForUser = blojsom2PermissionsForBlog.get(userID); 368 369 if (permissionsForUser instanceof List) { 371 List permissions = (List) permissionsForUser; 372 for (int j = 0; j < permissions.size(); j++) { 373 String permission = (String ) permissions.get(j); 374 String updatedPermission; 375 376 if ("*".equals(permission)) { 377 updatedPermission = "all_permissions_permission"; 378 } else { 379 updatedPermission = permission.replaceAll("-", "_"); 380 } 381 382 blojsom3UserMetadata.put(updatedPermission, "true"); 383 } 384 } else { 386 if ("*".equals(permissionsForUser)) { 387 blojsom3UserMetadata.put("all_permissions_permission", "true"); 388 } else { 389 blojsom3UserMetadata.put(permissionsForUser.toString().replaceAll("-", "_"), "true"); 390 } 391 } 392 } 393 394 blojsom3User.setMetaData(blojsom3UserMetadata); 395 396 try { 397 _fetcher.saveUser(blog, blojsom3User); 398 } catch (FetcherException e) { 399 if (_logger.isErrorEnabled()) { 400 _logger.error(e); 401 } 402 } 403 } 404 405 Map blojsom2CategoriesMap = new HashMap(); 407 Map blojsom3CategoriesMap = new HashMap(); 408 try { 409 BlogCategory[] blojsom2Categories = _blojsom2Fetcher.fetchCategories(null, blogUser); 410 for (int j = 0; j < blojsom2Categories.length; j++) { 411 BlogCategory blojsom2Category = blojsom2Categories[j]; 412 Category blojsom3Category = new DatabaseCategory(); 413 blojsom3Category.setBlogId(blog.getId()); 414 if (org.blojsom.util.BlojsomUtils.checkNullOrBlank(blojsom2Category.getDescription())) { 415 blojsom3Category.setDescription(blojsom2Category.getEncodedCategory().replaceAll("/", " ")); 416 } else { 417 blojsom3Category.setDescription(blojsom2Category.getDescription()); 418 } 419 blojsom3Category.setName(blojsom2Category.getEncodedCategory()); 420 blojsom3Category.setParentCategoryId(null); 421 blojsom3Category.setMetaData(blojsom2Category.getMetaData()); 422 423 try { 424 _fetcher.saveCategory(blog, blojsom3Category); 425 if (_logger.isDebugEnabled()) { 426 _logger.debug("Created blojsom 3 category: " + blojsom3Category.getName()); 427 } 428 429 blojsom3Category = _fetcher.loadCategory(blog, blojsom3Category.getName()); 430 blojsom2CategoriesMap.put(blojsom2Category.getEncodedCategory(), blojsom2Category); 431 blojsom3CategoriesMap.put(blojsom2Category.getEncodedCategory(), blojsom3Category); 432 } catch (FetcherException e) { 433 if (_logger.isErrorEnabled()) { 434 _logger.error(e); 435 } 436 } 437 } 438 } catch (BlojsomFetcherException e) { 439 if (_logger.isErrorEnabled()) { 440 _logger.error(e); 441 } 442 443 continue; 444 } 445 446 Iterator blojsom2CategoriesIterator = blojsom2CategoriesMap.keySet().iterator(); 448 while (blojsom2CategoriesIterator.hasNext()) { 449 String categoryName = (String ) blojsom2CategoriesIterator.next(); 450 BlogCategory blogCategory = (BlogCategory) blojsom2CategoriesMap.get(categoryName); 451 452 Map fetchParameters = new HashMap(); 453 fetchParameters.put(BlojsomFetcher.FETCHER_CATEGORY, blogCategory); 454 fetchParameters.put(BlojsomFetcher.FETCHER_NUM_POSTS_INTEGER, new Integer (-1)); 455 try { 456 BlogEntry[] entries = _blojsom2Fetcher.fetchEntries(fetchParameters, blogUser); 457 458 if (_logger.isDebugEnabled()) { 459 _logger.debug("Migrating " + entries.length + " entries from blojsom 2 category: " + blogCategory.getEncodedCategory()); 460 } 461 462 for (int j = 0; j < entries.length; j++) { 463 BlogEntry entry = entries[j]; 464 Entry blojsom3Entry = new DatabaseEntry(); 465 blojsom3Entry.setBlogId(blog.getId()); 466 467 Category category = (Category) blojsom3CategoriesMap.get(blogCategory.getEncodedCategory()); 468 blojsom3Entry.setBlogCategoryId(category.getId()); 469 if (entry.getMetaData().get("blog-entry-author") != null) { 470 blojsom3Entry.setAuthor(entry.getMetaData().get("blog-entry-author").toString()); 471 } 472 473 if (entry.supportsComments()) { 474 blojsom3Entry.setAllowComments(new Integer (1)); 475 } else { 476 blojsom3Entry.setAllowComments(new Integer (0)); 477 } 478 479 blojsom3Entry.setDate(entry.getDate()); 480 blojsom3Entry.setDescription(entry.getDescription()); 481 blojsom3Entry.setMetaData(entry.getMetaData()); 482 blojsom3Entry.setModifiedDate(entry.getDate()); 483 484 if (entry.supportsPingbacks()) { 485 blojsom3Entry.setAllowPingbacks(new Integer (1)); 486 } else { 487 blojsom3Entry.setAllowPingbacks(new Integer (0)); 488 } 489 490 blojsom3Entry.setPostSlug(entry.getPermalink()); 491 blojsom3Entry.setStatus(BlojsomMetaDataConstants.PUBLISHED_STATUS); 492 blojsom3Entry.setTitle(entry.getTitle()); 493 494 if (entry.supportsTrackbacks()) { 495 blojsom3Entry.setAllowTrackbacks(new Integer (1)); 496 } else { 497 blojsom3Entry.setAllowTrackbacks(new Integer (0)); 498 } 499 500 try { 501 _fetcher.saveEntry(blog, blojsom3Entry); 502 } catch (FetcherException e) { 503 if (_logger.isErrorEnabled()) { 504 _logger.error(e); 505 } 506 } 507 508 BlogComment[] comments = entry.getCommentsAsArray(); 510 for (int k = 0; k < comments.length; k++) { 511 BlogComment comment = comments[k]; 512 Comment blojsom3Comment = new DatabaseComment(); 513 514 blojsom3Comment.setAuthor(comment.getAuthor()); 515 blojsom3Comment.setAuthorEmail(comment.getAuthorEmail()); 516 blojsom3Comment.setAuthorURL(comment.getAuthorURL()); 517 blojsom3Comment.setBlogEntryId(blojsom3Entry.getId()); 518 blojsom3Comment.setBlogId(blog.getId()); 519 blojsom3Comment.setComment(comment.getComment()); 520 blojsom3Comment.setCommentDate(comment.getCommentDate()); 521 blojsom3Comment.setIp((String ) comment.getMetaData().get("BLOJSOM_COMMENT_PLUGIN_METADATA_IP")); 522 blojsom3Comment.setMetaData(comment.getMetaData()); 523 blojsom3Comment.setStatus(ResponseConstants.APPROVED_STATUS); 524 525 try { 526 _fetcher.saveComment(blog, blojsom3Comment); 527 } catch (FetcherException e) { 528 if (_logger.isErrorEnabled()) { 529 _logger.error(e); 530 } 531 } 532 } 533 534 Trackback[] trackbacks = entry.getTrackbacksAsArray(); 536 for (int k = 0; k < trackbacks.length; k++) { 537 Trackback trackback = trackbacks[k]; 538 DatabaseTrackback blojsom3Trackback = new DatabaseTrackback(); 539 540 blojsom3Trackback.setBlogName(trackback.getBlogName()); 541 blojsom3Trackback.setExcerpt(trackback.getExcerpt()); 542 blojsom3Trackback.setTitle(trackback.getTitle()); 543 blojsom3Trackback.setUrl(trackback.getUrl()); 544 blojsom3Trackback.setTrackbackDate(trackback.getTrackbackDate()); 545 blojsom3Trackback.setBlogEntryId(blojsom3Entry.getId()); 546 blojsom3Trackback.setBlogId(blog.getId()); 547 blojsom3Trackback.setIp((String ) trackback.getMetaData().get("BLOJSOM_TRACKBACK_PLUGIN_METADATA_IP")); 548 blojsom3Trackback.setMetaData(trackback.getMetaData()); 549 blojsom3Trackback.setStatus(ResponseConstants.APPROVED_STATUS); 550 551 try { 552 _fetcher.saveTrackback(blog, blojsom3Trackback); 553 } catch (FetcherException e) { 554 if (_logger.isErrorEnabled()) { 555 _logger.error(e); 556 } 557 } 558 } 559 560 Pingback[] pingbacks = entry.getPingbacksAsArray(); 562 for (int k = 0; k < pingbacks.length; k++) { 563 Pingback pingback = pingbacks[k]; 564 DatabasePingback blojsom3Pingback = new DatabasePingback(); 565 566 blojsom3Pingback.setBlogName(pingback.getBlogName()); 567 blojsom3Pingback.setExcerpt(pingback.getExcerpt()); 568 blojsom3Pingback.setTitle(pingback.getTitle()); 569 blojsom3Pingback.setUrl(pingback.getUrl()); 570 blojsom3Pingback.setTrackbackDate(pingback.getTrackbackDate()); 571 blojsom3Pingback.setBlogEntryId(blojsom3Entry.getId()); 572 blojsom3Pingback.setBlogId(blog.getId()); 573 blojsom3Pingback.setIp((String ) pingback.getMetaData().get("BLOJSOM_PINGBACK_PLUGIN_METADATA_IP")); 574 blojsom3Pingback.setMetaData(pingback.getMetaData()); 575 blojsom3Pingback.setStatus(ResponseConstants.APPROVED_STATUS); 576 blojsom3Pingback.setSourceURI(pingback.getUrl()); 577 blojsom3Pingback.setTargetURI(pingback.getTitle()); 578 579 try { 580 _fetcher.savePingback(blog, blojsom3Pingback); 581 } catch (FetcherException e) { 582 if (_logger.isErrorEnabled()) { 583 _logger.error(e); 584 } 585 } 586 } 587 } 588 } catch (BlojsomFetcherException e) { 589 if (_logger.isErrorEnabled()) { 590 _logger.error(e); 591 } 592 } 593 } 594 595 File blojsom2BlogResourcesPath = new File (_blojsom2Path + "/resources/" + blojsom2ID + "/"); 597 File blojsom3BlogResourcesPath = new File (_blojsom3Path + "/resources/" + blojsom2ID + "/"); 598 try { 599 FileUtils.copyDirectory(blojsom2BlogResourcesPath, blojsom3BlogResourcesPath); 600 if (_logger.isDebugEnabled()) { 601 _logger.debug("Copied blojsom 2 blog resources from: " + blojsom2BlogResourcesPath.toString() + " to: " + 602 blojsom3BlogResourcesPath.toString()); 603 } 604 } catch (IOException e) { 605 if (_logger.isErrorEnabled()) { 606 _logger.error(e); 607 } 608 } 609 610 File blojsom2BlogPath = new File (_blojsom2Path + BlojsomConstants.DEFAULT_CONFIGURATION_BASE_DIRECTORY + "/" + blojsom2ID + "/"); 611 File blojsom3BlogPath = new File (_blojsom2Path + BlojsomConstants.DEFAULT_CONFIGURATION_BASE_DIRECTORY + "/blogs/" + blojsom2ID + "/"); 612 try { 613 FileUtils.copyDirectory(blojsom2BlogPath, blojsom3BlogPath); 614 if (_logger.isDebugEnabled()) { 615 _logger.debug("Copied blojsom 2 blog data from: " + blojsom2BlogPath.toString() + " to: " + 616 blojsom3BlogPath.toString()); 617 } 618 } catch (IOException e) { 619 if (_logger.isErrorEnabled()) { 620 _logger.error(e); 621 } 622 } 623 } 624 625 if (_logger.isDebugEnabled()) { 626 _logger.debug("Finished upgrading blojsom 2 instance to blojsom 3!"); 627 } 628 } 629 } 630 | Popular Tags |