Advertisement
Guest User

Untitled

a guest
Nov 12th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Groovy 9.65 KB | None | 0 0
  1. import com.officedepot.cms.model.cms2.components.CMSSiteMenuComponentModel
  2. import com.officedepot.cms.model.cms2.components.CMSSiteMenuItemComponentModel
  3. import com.officedepot.multicountrycms.model.CMSSiteRestrictionModel
  4. import de.hybris.platform.basecommerce.model.site.BaseSiteModel
  5. import de.hybris.platform.cms2.model.contents.components.CMSImageComponentModel
  6. import de.hybris.platform.cms2.model.pages.AbstractPageModel
  7. import de.hybris.platform.cms2lib.model.components.AbstractBannerComponentModel
  8. import de.hybris.platform.core.Registry
  9. import de.hybris.platform.core.model.media.MediaModel
  10. import de.hybris.platform.servicelayer.i18n.CommonI18NService
  11. import de.hybris.platform.servicelayer.model.ModelService
  12. import de.hybris.platform.servicelayer.search.FlexibleSearchService
  13. import groovy.transform.Field
  14. import org.apache.commons.collections.CollectionUtils
  15.  
  16. import java.util.stream.Collectors
  17.  
  18. @Field def GET_PAGES_QUERY = "SELECT {p.pk}\n" +
  19.         "FROM {AbstractPage AS p\n" +
  20.         "JOIN CatalogVersion AS cv ON {p.catalogVersion} = {cv.pk}\n" +
  21.         "JOIN CmsPageStatus AS ps ON {p.pageStatus} = {ps.pk}}\n" +
  22.         "WHERE {cv.version} = 'Staged' AND {ps.code} = 'active'"
  23.  
  24. @Field def flexibleSearchService = Registry.getApplicationContext().getBean(FlexibleSearchService.class)
  25. @Field def commonI18NService = Registry.getApplicationContext().getBean(CommonI18NService.class)
  26. @Field def modelService = Registry.getApplicationContext().getBean(ModelService.class)
  27.  
  28. @Field Locale fallbackLocale = new Locale("en")
  29.  
  30. @Field def nlLocale = new Locale("nl")
  31. @Field def deDeLocale = new Locale("de", "DE")
  32. @Field def deAtLocale = new Locale("de", "AT")
  33. @Field def deLocale = new Locale("de")
  34.  
  35. @Field def localesToCheck = [nlLocale, deDeLocale, deAtLocale]
  36. @Field Map<Locale, Locale> localeToAllowedFallback = [:]
  37. localeToAllowedFallback.put(deDeLocale, deLocale)
  38. localeToAllowedFallback.put(deAtLocale, deLocale)
  39.  
  40.  
  41. interface PageToSiteClassificationRule
  42. {
  43.   void classify(List<AbstractPageModel> pages, Map<BaseSiteModel, List<AbstractPageModel>> siteToPagesMap)
  44. }
  45.  
  46. class RestrictionBasedClassificationRule implements PageToSiteClassificationRule
  47. {
  48.   @Override
  49.   void classify(List<AbstractPageModel> pages, Map<BaseSiteModel, List<AbstractPageModel>> siteToPagesMap)
  50.   {
  51.     List<AbstractPageModel> classifiedPages = []
  52.     for (def page : pages)
  53.     {page.approvalStatus
  54.       List<BaseSiteModel> restrictedSites = page.restrictions.stream()
  55.               .filter({ restriction -> CMSSiteRestrictionModel.isInstance(restriction) })
  56.               .map({ restriction -> CMSSiteRestrictionModel.cast(restriction) })
  57.               .flatMap({ siteRestriction -> siteRestriction.baseSites.stream() })
  58.               .collect(Collectors.toList())
  59.  
  60.  
  61.       if (CollectionUtils.isNotEmpty(restrictedSites))
  62.       {
  63.         classifiedPages.add(page)
  64.         restrictedSites.forEach({ site ->
  65.           siteToPagesMap.computeIfAbsent(site, { siteModel -> [] })
  66.           siteToPagesMap[site].add(page)
  67.         })
  68.       }
  69.     }
  70.     pages.removeAll(classifiedPages)
  71.   }
  72. }
  73.  
  74. class PageIdBasedClassificationRule implements PageToSiteClassificationRule
  75. {
  76.   def GET_ALL_SITES_QUERY = "SELECT {pk} FROM {CMSSite}"
  77.   def flexibleSearchService = Registry.getApplicationContext().getBean(FlexibleSearchService.class)
  78.   List<BaseSiteModel> sites = flexibleSearchService.<BaseSiteModel>search(GET_ALL_SITES_QUERY).result as List<BaseSiteModel>
  79.  
  80.   @Override
  81.   void classify(List<AbstractPageModel> pages, Map<BaseSiteModel, List<AbstractPageModel>> siteToPagesMap)
  82.   {
  83.     List<AbstractPageModel> classifiedPages = []
  84.     for (def page : pages)
  85.     {
  86.       for (def site : sites)
  87.       {
  88.         def isAssigned = false
  89.         if (page.uid.matches("(.*[^a-zA-Z]|)(" + site.uid.toUpperCase() + "|" + site.uid.toLowerCase() + ")([^a-zA-Z].*|)") ||
  90.             page.uid.matches(".*" + site.uid[0].toUpperCase() + site.uid.substring(1).toLowerCase() + "[A-Z].*"))
  91.         {
  92.           if (isAssigned)
  93.           {
  94.             println("WARN! Page " + page.uid + " is not resolvable by uid. Check it manually!")
  95.           }
  96.           classifiedPages.add(page)
  97.           siteToPagesMap.computeIfAbsent(site, { siteModel -> [] })
  98.           siteToPagesMap[site].add(page)
  99.           //noinspection GroovyUnusedAssignment
  100.           isAssigned = true
  101.         }
  102.       }
  103.     }
  104.     pages.removeAll(classifiedPages)
  105.   }
  106. }
  107.  
  108. @Field List<PageToSiteClassificationRule> pageToSiteFilterRules = [
  109.         new RestrictionBasedClassificationRule(),
  110.         new PageIdBasedClassificationRule()
  111. ]
  112.  
  113. interface ImageHolder
  114. {
  115.   MediaModel getMedia(Locale locale)
  116.   void setMedia(MediaModel media, Locale locale)
  117. }
  118.  
  119. class CMSImageComponentImageHolder implements ImageHolder
  120. {
  121.   private CMSImageComponentModel imageComponent
  122.  
  123.   CMSImageComponentImageHolder(CMSImageComponentModel imageComponent)
  124.   {
  125.     this.imageComponent = imageComponent
  126.   }
  127.  
  128.   @Override
  129.   MediaModel getMedia(Locale locale)
  130.   {
  131.     return imageComponent.getMedia(locale)
  132.   }
  133.  
  134.   @Override
  135.   void setMedia(MediaModel media, Locale locale)
  136.   {
  137.     imageComponent.setMedia(media, locale)
  138.   }
  139.  
  140.   @Override
  141.   String toString() {
  142.     return "CMSImageComponent - " + imageComponent.uid + ", property - media"
  143.   }
  144. }
  145.  
  146. class CMSSiteMenuItemImageHolder implements ImageHolder
  147. {
  148.   private CMSSiteMenuItemComponentModel siteMenuItem
  149.  
  150.   CMSSiteMenuItemImageHolder(CMSSiteMenuItemComponentModel siteMenuItem)
  151.   {
  152.     this.siteMenuItem = siteMenuItem
  153.   }
  154.  
  155.   @Override
  156.   MediaModel getMedia(Locale locale)
  157.   {
  158.     return siteMenuItem.getCountryFlag(locale)
  159.   }
  160.  
  161.   @Override
  162.   void setMedia(MediaModel media, Locale locale)
  163.   {
  164.     siteMenuItem.setCountryFlag(media, locale)
  165.   }
  166.  
  167.   @Override
  168.   String toString() {
  169.     return "CMSSiteMenuItemComponent - " + siteMenuItem.uid + ", property - countryFlag"
  170.   }
  171. }
  172.  
  173. class AbstractBannerImageHolder implements ImageHolder
  174. {
  175.   AbstractBannerComponentModel banner
  176.  
  177.   AbstractBannerImageHolder(AbstractBannerComponentModel banner)
  178.   {
  179.     this.banner = banner
  180.   }
  181.  
  182.   @Override
  183.   MediaModel getMedia(Locale locale)
  184.   {
  185.     return banner.getMedia(locale)
  186.   }
  187.  
  188.   @Override
  189.   void setMedia(MediaModel media, Locale locale)
  190.   {
  191.     banner.setMedia(media, locale)
  192.   }
  193.  
  194.   @Override
  195.   String toString() {
  196.     return "AbstractBannerComponentModel - " + banner.uid + ", property - media"
  197.   }
  198. }
  199.  
  200. List<ImageHolder> findAllImagesForPages(List<AbstractPageModel> pages, Locale requiredLocale)
  201. {
  202.   def cmsComponents = pages.stream()
  203.  
  204.           .flatMap({ page -> //noinspection GrDeprecatedAPIUsage
  205.               page.contentSlots.stream() })
  206.           .map({ slot -> slot.contentSlot })
  207.           .filter({contentSlot -> contentSlot != null})
  208.           .flatMap({ contentSlot -> contentSlot.cmsComponents.stream() })
  209.           .collect(Collectors.toList())
  210.  
  211.   // CMSImageComponentModel
  212.   List<ImageHolder> imageHolders = cmsComponents.stream()
  213.           .filter({ cmsComponent -> CMSImageComponentModel.isInstance(cmsComponent) })
  214.           .map({ cmsComponent -> CMSImageComponentModel.cast(cmsComponent) })
  215.           .map({ cmsImageComponent -> new CMSImageComponentImageHolder(cmsImageComponent) })
  216.           .collect(Collectors.toList())
  217.  
  218.   // CMSSiteMenuComponentModel
  219.   imageHolders.addAll(cmsComponents.stream()
  220.           .filter({ cmsComponent -> CMSSiteMenuComponentModel.isInstance(cmsComponent) })
  221.           .map({ cmsComponent -> CMSSiteMenuComponentModel.cast(cmsComponent) })
  222.           .flatMap({ siteMenuComponent -> siteMenuComponent.items.stream() })
  223.           .map({ siteMenuItem -> new CMSSiteMenuItemImageHolder(siteMenuItem) })
  224.           .collect(Collectors.toList()))
  225.  
  226.   // AbstractBannerComponentModel
  227.   imageHolders.addAll(cmsComponents.stream()
  228.           .filter({ cmsComponent -> AbstractBannerComponentModel.isInstance(cmsComponent) })
  229.           .map({ cmsComponent -> AbstractBannerComponentModel.cast(cmsComponent) })
  230.           .map({ banner -> new AbstractBannerImageHolder(banner) })
  231.           .collect(Collectors.toList()))
  232.  
  233.   // filter by locale
  234.   imageHolders = imageHolders.stream()
  235.           .filter({ image -> image.getMedia(requiredLocale) == null })
  236.           .filter({ image -> image.getMedia(fallbackLocale) != null })
  237.           .filter({ image -> localeToAllowedFallback.get(requiredLocale) == null || image.getMedia(localeToAllowedFallback.get(requiredLocale)) == null })
  238.           .collect(Collectors.toList())
  239.  
  240.   return imageHolders
  241. }
  242.  
  243. List<AbstractPageModel> pages = new ArrayList<>(flexibleSearchService.<AbstractPageModel> search(GET_PAGES_QUERY).result as Collection<? extends AbstractPageModel>)
  244.  
  245. Map<BaseSiteModel, List<AbstractPageModel>> siteToPagesMap = [:]
  246. for (def rule : pageToSiteFilterRules)
  247. {
  248.   rule.classify(pages, siteToPagesMap)
  249. }
  250.  
  251. println("//-------------------------CLASSIFIED CMS COMPONENTS TO UPDATE-----------------------")
  252.  
  253. siteToPagesMap.forEach({site, sitePages ->
  254.   def requiredLocale = commonI18NService.getLocaleForLanguage(site.defaultLanguage)
  255.   if (!localesToCheck.contains(requiredLocale))
  256.   {
  257.     return
  258.   }
  259.  
  260.   def imageHolders = findAllImagesForPages(sitePages, requiredLocale)
  261.   Locale targetLocale = localeToAllowedFallback.getOrDefault(requiredLocale, requiredLocale)
  262.  
  263.   println("\nUpdating image components (site - " + site.uid + ", language - " + site.defaultLanguage.isocode + "):")
  264.  
  265.   imageHolders.stream()
  266.           .forEach({ imageHolder -> println(imageHolder) })
  267.   imageHolders.stream()
  268.           .forEach({ imageHolder -> imageHolder.setMedia(imageHolder.getMedia(fallbackLocale), targetLocale) })
  269.  
  270.   modelService.saveAll()
  271.  
  272.   println("Count: " + imageHolders.size())
  273. })
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement