001/* 002 * Sonar, open source software quality management tool. 003 * Copyright (C) 2008-2012 SonarSource 004 * mailto:contact AT sonarsource DOT com 005 * 006 * Sonar is free software; you can redistribute it and/or 007 * modify it under the terms of the GNU Lesser General Public 008 * License as published by the Free Software Foundation; either 009 * version 3 of the License, or (at your option) any later version. 010 * 011 * Sonar is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 014 * Lesser General Public License for more details. 015 * 016 * You should have received a copy of the GNU Lesser General Public 017 * License along with Sonar; if not, write to the Free Software 018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 019 */ 020package org.sonar.server.startup; 021 022import com.google.common.collect.ImmutableList; 023import org.slf4j.Logger; 024import org.slf4j.LoggerFactory; 025import org.sonar.api.utils.TimeProfiler; 026import org.sonar.api.web.Criterion; 027import org.sonar.api.web.Filter; 028import org.sonar.api.web.FilterColumn; 029import org.sonar.api.web.FilterTemplate; 030import org.sonar.core.filter.CriterionDto; 031import org.sonar.core.filter.FilterColumnDto; 032import org.sonar.core.filter.FilterDao; 033import org.sonar.core.filter.FilterDto; 034import org.sonar.core.template.LoadedTemplateDao; 035import org.sonar.core.template.LoadedTemplateDto; 036 037import java.util.List; 038 039/** 040 * @since 3.1 041 */ 042public final class RegisterNewFilters { 043 private static final Logger LOG = LoggerFactory.getLogger(RegisterNewFilters.class); 044 045 private final List<FilterTemplate> filterTemplates; 046 private final FilterDao filterDao; 047 private final LoadedTemplateDao loadedTemplateDao; 048 049 public RegisterNewFilters(FilterTemplate[] filterTemplates, FilterDao filterDao, LoadedTemplateDao loadedTemplateDao) { 050 this.filterTemplates = ImmutableList.copyOf(filterTemplates); 051 this.filterDao = filterDao; 052 this.loadedTemplateDao = loadedTemplateDao; 053 } 054 055 public void start() { 056 TimeProfiler profiler = new TimeProfiler().start("Register filters"); 057 058 for (FilterTemplate template : filterTemplates) { 059 if (shouldRegister(template.getName())) { 060 Filter filter = template.createFilter(); 061 register(template.getName(), filter); 062 } 063 } 064 065 profiler.stop(); 066 } 067 068 private boolean shouldRegister(String filterName) { 069 return loadedTemplateDao.countByTypeAndKey(LoadedTemplateDto.FILTER_TYPE, filterName) == 0; 070 } 071 072 protected FilterDto register(String name, Filter filter) { 073 FilterDto dto = null; 074 if (filterDao.findFilter(name) == null) { 075 dto = createDtoFromExtension(name, filter); 076 filterDao.insert(dto); 077 LOG.info("New filter '" + dto.getName() + "' registered"); 078 } 079 // and save the fact that is has now already been loaded 080 loadedTemplateDao.insert(new LoadedTemplateDto(name, LoadedTemplateDto.FILTER_TYPE)); 081 return dto; 082 } 083 084 protected FilterDto createDtoFromExtension(String name, Filter filter) { 085 FilterDto filterDto = new FilterDto() 086 .setName(name) 087 .setKey(name) 088 .setPageSize(0 == filter.getPageSize() ? null : (long) filter.getPageSize()) 089 .setShared(true) 090 .setFavourites(filter.isFavouritesOnly()) 091 .setDefaultView(filter.getDisplayAs()); 092 093 for (Criterion criterion : filter.getCriteria()) { 094 filterDto.add(new CriterionDto() 095 .setFamily(criterion.getFamily()) 096 .setKey(criterion.getKey()) 097 .setOperator(criterion.getOperator()) 098 .setTextValue(criterion.getTextValue()) 099 .setValue(criterion.getValue()) 100 .setVariation(criterion.isVariation())); 101 } 102 103 long orderIndex = 1L; 104 for (FilterColumn column : filter.getColumns()) { 105 filterDto.add(new FilterColumnDto() 106 .setFamily(column.getFamily()) 107 .setKey(column.getKey()) 108 .setOrderIndex(orderIndex++) 109 .setSortDirection(column.getSortDirection()) 110 .setVariation(column.isVariation())); 111 } 112 113 return filterDto; 114 } 115}