aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-server/src/main/webapp/WEB-INF/app/controllers/dependencies_controller.rb
blob: c6f292e2fc503770e9a6217169662454eb7dc12e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#
# SonarQube, open source software quality management tool.
# Copyright (C) 2008-2013 SonarSource
# mailto:contact AT sonarsource DOT com
#
# SonarQube is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 3 of the License, or (at your option) any later version.
#
# SonarQube is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
#
class DependenciesController < ApplicationController

  SECTION=Navigation::SECTION_HOME

  SEARCH_MINIMUM_SIZE=3
  QUALIFIERS=['TRK', 'BRC', 'LIB']

  def index  
    @search=params[:search] || ''
    @version=params[:version]  
    @resources=nil
    @resource=nil
    @versions=nil

    if @search.size>0 && @search.size<SEARCH_MINIMUM_SIZE
      flash[:notice]="Minimum search is #{SEARCH_MINIMUM_SIZE} characters."
      redirect_to :action => 'index'
      return
    end

    if @search.size>=SEARCH_MINIMUM_SIZE

      #
      # load all the resources (first column)
      #
      @resources=Project.find(:all,
        :conditions => ["scope=? AND qualifier IN (?) AND enabled=? AND (UPPER(name) like ? OR kee like ?)", 'PRJ', QUALIFIERS, true, "%#{@search.upcase}%", "%#{@search}%"])
      Api::Utils.insensitive_sort!(@resources){|r| r.name}

      if params[:resource]
        @resource=@resources.select{|r| r.kee==params[:resource]}.first
      elsif @resources.size==1
        @resource=@resources.first
      end

    end

    if @resource

      #
      # load all the snapshots and versions of the selected resource (second column)
      #
      snapshots=Snapshot.find(:all, :select => 'id,version', :conditions => ['project_id=? AND version IS NOT NULL AND status=?', @resource.id, 'P'])
      @versions=snapshots.map{|s| s.version}.compact.uniq.sort.reverse
      @version=@versions.first if @version.blank? && @versions.size==1


      #
      # load all the dependencies to the selected resource
      #
      conditions=["dependencies.from_scope='PRJ' AND snapshots.status='P' AND snapshots.project_id=:rid"]
      values={:rid => @resource.id}
      if !@version.blank?
        conditions<<'snapshots.version=:version'
        values[:version]=@version
      else
        conditions<<'snapshots.version IS NOT NULL'
      end
      deps=Dependency.find(:all,
        :include => 'to_snapshot',
        :select => 'dependencies.project_snapshot_id',
        :conditions => [conditions.join(' AND '), values])



      #
      # load all the projects defining the dependencies (third column)
      #
      project_sids=deps.map{|dep| dep.project_snapshot_id}.compact.uniq[0..950]  # oracle issue with more than 1000 IN elements. Not annoying to truncate hundreds of results...
      if project_sids.size>0
        @project_snapshots=Snapshot.find(:all, :include => 'project', :conditions => ['id IN (?) AND islast=? AND status=?', project_sids, true, 'P'])
        Api::Utils.insensitive_sort!(@project_snapshots) {|s| s.project.name}
      else
        @project_snapshots=[]
      end

    end
    
  end

  private
  
end