]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5052 internal WS /api/components/suggestions
authorSimon Brandhof <simon.brandhof@gmail.com>
Tue, 11 Feb 2014 09:30:31 +0000 (10:30 +0100)
committerSimon Brandhof <simon.brandhof@gmail.com>
Tue, 11 Feb 2014 09:30:31 +0000 (10:30 +0100)
sonar-server/src/main/webapp/WEB-INF/app/controllers/api/components_controller.rb [new file with mode: 0644]

diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/api/components_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/api/components_controller.rb
new file mode 100644 (file)
index 0000000..c53a3bb
--- /dev/null
@@ -0,0 +1,97 @@
+#
+# 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 Api::ComponentsController < Api::ApiController
+
+  # Do not exceed 1000 because of the Oracle limitation on IN statements
+  MAX_RESULTS = 6
+
+  # Internal WS for the top-right search engine
+  def suggestions
+    search = params[:s]
+    bad_request("Minimum search is #{ResourceIndex::MIN_SEARCH_SIZE} characters") if search.empty? || search.to_s.size<ResourceIndex::MIN_SEARCH_SIZE
+
+    key = escape_like(search).downcase
+    results = ResourceIndex.all(:select => 'distinct(resource_id),root_project_id,qualifier,name_size', # optimization to not load unused columns like 'kee'
+                                :conditions => ['kee like ?', key + '%'],
+                                :order => 'name_size')
+
+    results = select_authorized(:user, results)
+
+    resource_ids=[]
+    resource_indexes_by_qualifier={}
+    results.each do |resource_index|
+      qualifier = fix_qualifier(resource_index.qualifier)
+      resource_indexes_by_qualifier[qualifier] ||= []
+      array = resource_indexes_by_qualifier[qualifier]
+      if array.size < MAX_RESULTS
+        resource_ids << resource_index.resource_id
+        array << resource_index
+      end
+    end
+
+    resources_by_id = {}
+    unless resource_ids.empty?
+      Project.find(:all, :conditions => ['id in (?)', resource_ids]).each do |resource|
+        resources_by_id[resource.id]=resource
+      end
+    end
+
+    json = {'total' => results.size}
+    json_results = []
+    java_facade.getResourceTypes().each do |resource_type|
+      qualifier_results={}
+      qualifier=resource_type.getQualifier()
+      qualifier_results['q']=qualifier
+      qualifier_results['icon']=resource_type.getIconPath()
+      qualifier_results['name']=Api::Utils.message("qualifiers.#{qualifier}")
+      resource_indexes=resource_indexes_by_qualifier[qualifier]||[]
+      qualifier_results['total']=resource_indexes.size
+      qualifier_results['items']=resource_indexes.map do |resource_index|
+        resource=resources_by_id[resource_index.resource_id]
+        {
+          'id' => resource.id,
+          'name' => resource.name(true)
+        }
+      end
+      json_results<<qualifier_results
+    end
+    json['results']=json_results
+
+    respond_to do |format|
+      format.json { render :json => jsonp(json) }
+      format.xml { render :xml => xml_not_supported }
+      format.text { render :text => text_not_supported }
+    end
+  end
+
+  private
+
+  def fix_qualifier(q)
+    case q
+      when 'CLA' then
+        'FIL'
+      when 'PAC' then
+        'DIR'
+      else
+        q
+    end
+  end
+
+end