diff --git a/app/controllers/exceptionhandler_controller.rb b/app/controllers/exceptionhandler_controller.rb index f3976c2..a326517 100644 --- a/app/controllers/exceptionhandler_controller.rb +++ b/app/controllers/exceptionhandler_controller.rb @@ -1,7 +1,7 @@ -# exceptionhandler_controller.rb +# exceptionhandler_helper.rb # @date Feb. 15, 2012 # @author ricky barrette -# @author twenty codes +# @authro twenty codes # # Copyright 2012 Rick Barrette # @@ -17,38 +17,145 @@ # See the License for the specific language governing permissions and # limitations under the License. -# This controller class will handler incomming http requests containing new exception reports. -# When a new exception report is recieved, it will be compared to existing bug issues. -# If there is a match, the existing issue will be updated -# if not a new bug issue will be generated. -class ExceptionhandlerController < ApplicationController - unloadable - - helper :exceptionhandler - include ExceptionhandlerHelper - - def index - if params.size < 8 - @output = " not enough args " - elsif Project.find_by_name(params[:app]) == nil - @output = "No Project Found" - else - issue_id = check_for_existing_report - if issue_id > 0 - update_report(issue_id) - @output = "Updated report" - else - issue = create_new_report - if issue.valid? - issue.save - @output = "New report filed" - else - @output = issue.errors.full_messages +module ExceptionhandlerHelper + + # Checks the database for exisiting reports + # @return id report is existing else 0 + def check_for_existing_report + bug_id = tracker.id + issues = Project.find_by_name(params[:app]).issues + issues.each do |issue| + if issue.tracker_id == bug_id + id = check_issue(issue) + if id > 0 + return id end end end - rescue RuntimeError - @output = "ERROR" + return 0; + end + + # checks a specific issue agains params + # @return id of report if matching, else 0 + def check_issue(issue) + if issue.subject == params[:msg] + if check_issue_custom_values(issue) + return issue.id + else + return 0 + end + else + return 0 + end + end + + #checks if this issue is a match for params based on it's custom values' + # @return true if matching + def check_issue_custom_values (issue) + count = 0 + custom_fields = CustomField + issue.custom_field_values.each do |value| + case custom_fields.find_by_id(value.custom_field_id).name + when "Version" + if value.value == params[:version] + count += 1 + end + when "StackTrace" + if value.value == params[:stackTrace] + count += 1 + end + when "Package" + if value.value == params[:package] + count += 1 + end + when "Cause" + if value.value == params[:cause] + count += 1 + end + end + end + if count == 4 + return true + else + return false + end + end + + # files a new exception report in redmine + # @return true if new report was filed + def create_new_report + issue = Issue.new + issue.tracker = tracker + issue.subject = params[:msg] + issue.description = params[:description] + issue.project = Project.find_by_name(params[:app]) + issue.start_date = Time.now.localtime.strftime("%Y-%m-%d %T") + issue.priority = IssuePriority.find_by_name("Normal") + issue.author = User.anonymous + issue.status = IssueStatus.find_by_name("New") + + issue.custom_values = [ + create_custom_value(CustomField.find_by_name("StackTrace").id, params[:stackTrace]), + create_custom_value(CustomField.find_by_name("Cause").id, params[:cause]), + create_custom_value(CustomField.find_by_name("Count").id, "1"), + create_custom_value(CustomField.find_by_name("Device").id, params[:device]), + create_custom_value(CustomField.find_by_name("Version").id, value = params[:version]), + create_custom_value(CustomField.find_by_name("Package").id, value = params[:package]), + create_custom_value(CustomField.find_by_name("Date").id, value = params[:date]) + ] + return issue + end + + # returns a new custom value + def create_custom_value(field_id, value) + custom_value = CustomValue.new + custom_value.custom_field_id = field_id + custom_value.value = value + custom_value.customized_type = "Issue" + return custom_value + end + + # retrives an issue by it's id and updates it + # @returns updated issue + def update_report(issue_id) + issue = Issue.find_by_id(issue_id) + if params[:description].length > 0 + description = issue.description + description += "\n\n--- New Description --- \n" + description += params[:description] + issue.description = description + end + + custom_fields = CustomField + issue.custom_field_values.each do |value| + case custom_fields.find_by_id(value.custom_field_id).name + when "Device" + value.value = value.value += "\n" + value.value = value.value += params[:device] + when "Date" + value.value = value.value += "\n" + value.value = value.value += params[:date] + when "Count" + value.value = (value.value.to_i + 1).to_s + end + value.save + end + issue.init_journal(User.anonymous, "Issue updated") + issue.save + end + + # gets the prodived tracker + # if it doesnt exist, defualt to Bug + def tracker + if(params[:tracker]!= nil) + if params[:tracker].length > 0 + t = Tracker.find_by_name(params[:tracker]) + if(t != nil) + return t + end + end + end + return Tracker.find_by_name("Bug") end end #EOF