/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.store.dao; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.enonic.cms.core.content.contenttype.ContentTypeEntity; import com.enonic.cms.core.resource.ResourceKey; import com.enonic.cms.core.resource.ResourceReferencer; import com.enonic.cms.core.resource.ResourceReferencerType; import com.enonic.cms.core.structure.SiteEntity; import com.enonic.cms.core.structure.page.template.PageTemplateEntity; import com.enonic.cms.core.structure.portlet.PortletEntity; @Repository("resourceUsageDao") public final class ResourceUsageDaoImpl implements ResourceUsageDao { @Autowired private PageTemplateDao pageTemplateDao; @Autowired private PortletDao contentObjectDao; @Autowired private SiteDao siteDao; @Autowired private ContentTypeEntityDao contentTypeDao; public HashMap<ResourceKey, Long> getUsageCountMap() { List<Object[]> allUsageCounts = getAllUsageCounts(); HashMap<ResourceKey, Long> usageCountMap = new HashMap<ResourceKey, Long>(); for ( Object[] obj : allUsageCounts ) { ResourceKey resourceKey = (ResourceKey) obj[0]; Long count = (Long) obj[1]; if ( usageCountMap.containsKey( resourceKey ) ) { count += usageCountMap.get( resourceKey ); } usageCountMap.put( resourceKey, count ); } return usageCountMap; } private List<Object[]> getAllUsageCounts() { List<Object[]> allUsageCounts = new ArrayList<Object[]>(); allUsageCounts.addAll( contentObjectDao.getResourceUsageCountStyle() ); allUsageCounts.addAll( contentObjectDao.getResourceUsageCountBorder() ); allUsageCounts.addAll( contentTypeDao.getResourceUsageCountCSS() ); allUsageCounts.addAll( pageTemplateDao.getResourceUsageCountStyle() ); allUsageCounts.addAll( pageTemplateDao.getResourceUsageCountCSS() ); allUsageCounts.addAll( getAllUsedBySites() ); return allUsageCounts; } private Multimap<ResourceKey, ResourceReferencer> getUsedBySites( final ResourceKey resourceKey ) { Multimap<ResourceKey, ResourceReferencer> usedBy = HashMultimap.create(); final List<SiteEntity> sites = siteDao.findAll(); for ( SiteEntity site : sites ) { ResourceKey defaultCssKey = site.getDefaultCssKey(); if ( defaultCssKey != null && defaultCssKey.equals( resourceKey ) ) { usedBy.put( resourceKey, new ResourceReferencer( site, ResourceReferencerType.SITE_DEFAULT_CSS ) ); } ResourceKey defaultLocalizationResource = site.getDefaultLocalizationResource(); if ( defaultLocalizationResource != null && defaultLocalizationResource.equals( resourceKey ) ) { usedBy.put( resourceKey, new ResourceReferencer( site, ResourceReferencerType.SITE_DEFAULT_LOCALIZATION_RESOURCE ) ); } ResourceKey deviceClassResolver = site.getDeviceClassResolver(); if ( deviceClassResolver != null && deviceClassResolver.equals( resourceKey ) ) { usedBy.put( resourceKey, new ResourceReferencer( site, ResourceReferencerType.SITE_DEVICE_CLASS_RESOLVER ) ); } ResourceKey localeResolver = site.getLocaleResolver(); if ( localeResolver != null && localeResolver.equals( resourceKey ) ) { usedBy.put( resourceKey, new ResourceReferencer( site, ResourceReferencerType.SITE_LOCALE_RESOLVER ) ); } } return usedBy; } private List<Object[]> getAllUsedBySites() { List<Object[]> list = new ArrayList<Object[]>(); final List<SiteEntity> sites = siteDao.findAll(); for ( SiteEntity site : sites ) { ResourceKey defaultCssKey = site.getDefaultCssKey(); if ( defaultCssKey != null ) { list.add( new Object[]{defaultCssKey, 1L} ); } ResourceKey defaultLocalizationResource = site.getDefaultLocalizationResource(); if ( defaultLocalizationResource != null ) { list.add( new Object[]{defaultLocalizationResource, 1L} ); } ResourceKey deviceClassResolver = site.getDeviceClassResolver(); if ( deviceClassResolver != null ) { list.add( new Object[]{deviceClassResolver, 1L} ); } ResourceKey localeResolver = site.getLocaleResolver(); if ( localeResolver != null ) { list.add( new Object[]{localeResolver, 1L} ); } } return list; } public Multimap<ResourceKey, ResourceReferencer> getUsedBy( ResourceKey resourceKey ) { Multimap<ResourceKey, ResourceReferencer> usedBy = HashMultimap.create(); for ( PortletEntity obj : contentObjectDao.findByStyle( resourceKey ) ) { usedBy.put( resourceKey, new ResourceReferencer( obj, ResourceReferencerType.CONTENT_OBJECT_STYLE ) ); } for ( PortletEntity obj : contentObjectDao.findByBorder( resourceKey ) ) { usedBy.put( resourceKey, new ResourceReferencer( obj, ResourceReferencerType.CONTENT_OBJECT_BORDER ) ); } for ( ContentTypeEntity obj : contentTypeDao.findByCSS( resourceKey ) ) { usedBy.put( resourceKey, new ResourceReferencer( obj, ResourceReferencerType.CONTENT_TYPE_CSS ) ); } for ( PageTemplateEntity obj : pageTemplateDao.findByStyle( resourceKey ) ) { usedBy.put( resourceKey, new ResourceReferencer( obj, ResourceReferencerType.PAGE_TEMPLATE_STYLE ) ); } for ( PageTemplateEntity obj : pageTemplateDao.findByCSS( resourceKey ) ) { usedBy.put( resourceKey, new ResourceReferencer( obj, ResourceReferencerType.PAGE_TEMPLATE_CSS ) ); } usedBy.putAll( getUsedBySites( resourceKey ) ); return usedBy; } public void updateResourceReference( ResourceKey oldResourceKey, ResourceKey newResourceKey ) { contentObjectDao.updateResourceStyleReference( oldResourceKey, newResourceKey ); contentObjectDao.updateResourceBorderReference( oldResourceKey, newResourceKey ); contentTypeDao.updateResourceCSSReference( oldResourceKey, newResourceKey ); pageTemplateDao.updateResourceStyleReference( oldResourceKey, newResourceKey ); pageTemplateDao.updateResourceCSSReference( oldResourceKey, newResourceKey ); siteDao.updateResourceCSSReference( oldResourceKey, newResourceKey ); } public void updateResourceReferencePrefix( String oldPrefix, String newPrefix ) { contentObjectDao.updateResourceStyleReferencePrefix( oldPrefix, newPrefix ); contentObjectDao.updateResourceBorderReferencePrefix( oldPrefix, newPrefix ); contentTypeDao.updateResourceCSSReferencePrefix( oldPrefix, newPrefix ); pageTemplateDao.updateResourceStyleReferencePrefix( oldPrefix, newPrefix ); pageTemplateDao.updateResourceCSSReferencePrefix( oldPrefix, newPrefix ); siteDao.updateResourceCSSReferencePrefix( oldPrefix, newPrefix ); } }