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}