blob: 1bf83adf20208c5b54a21088ef5a585ecdd9b4a3 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with this
# work for additional information regarding copyright ownership. The ASF
# licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
module Buildr
# Addes the <code>projectname:jdepend:swing</code>, <code>projectname:jdepend:text</code> and
# <code>projectname:jdepend:xml</code> tasks.
#
# Require explicitly using <code>require "buildr/jdepend"</code>.
module JDepend
class << self
# The specs for requirements
def dependencies
[
'jdepend:jdepend:jar:2.9.1'
]
end
def jdepend(output_file, target_paths, options = {})
dependencies = (options[:dependencies] || []) + self.dependencies
cp = Buildr.artifacts(dependencies).each(&:invoke).map(&:to_s)
args = []
if output_file
args << '-file'
args << output_file
end
target_paths.each do |target_path|
file(target_path).invoke
args << target_path.to_s if ::File.exist?(target_path.to_s)
end
# If no output file then we must be trying to run the swing app
command = output_file ? 'jdepend.xmlui.JDepend' : 'jdepend.swingui.JDepend'
begin
Java::Commands.java command, *(args + [{:classpath => cp, :properties => options[:properties], :java_args => options[:java_args]}])
rescue => e
raise e if options[:fail_on_error]
end
end
end
class Config
def enabled?
!!@enabled
end
attr_writer :enabled
def html_enabled?
File.exist?(self.style_file)
end
attr_writer :config_directory
def config_directory
@config_directory || project._(:source, :main, :etc, :jdepend)
end
attr_writer :report_dir
def report_dir
@report_dir || project._(:reports, :jdepend)
end
attr_writer :fail_on_error
def fail_on_error?
@fail_on_error.nil? ? false : @fail_on_error
end
attr_writer :xml_output_file
def xml_output_file
@xml_output_file || "#{self.report_dir}/jdepend.xml"
end
attr_writer :html_output_file
def html_output_file
@html_output_file || "#{self.report_dir}/jdepend.html"
end
attr_writer :style_file
def style_file
unless @style_file
project_xsl = "#{self.config_directory}/jdepend-report.xsl"
if File.exist?(project_xsl)
@style_file = project_xsl
else
@style_file = "#{File.dirname(__FILE__)}/jdepend-report.xsl"
end
end
@style_file
end
def target_paths
@target_paths ||= [self.project.compile.target, self.project.test.compile.target]
end
def to_options
{
:fail_on_error => project.jdepend.fail_on_error?,
# Set user home so that jdepend.properties will be loaded from there if present
:properties => { 'user.home' => project.jdepend.config_directory }
}
end
# An array of additional projects to scan for target_paths
attr_writer :additional_project_names
def additional_project_names
@additional_project_names ||= []
end
def complete_target_paths
deps = self.target_paths.dup
self.additional_project_names.each do |project_name|
p = self.project.project(project_name)
deps << [p.compile.target, p.test.compile.target].flatten.compact
end
deps = deps.flatten.compact
deps.each do |d|
d.invoke if d.respond_to?(:invoke)
end
deps
end
protected
def initialize(project)
@project = project
end
attr_reader :project
end
module ProjectExtension
include Extension
def jdepend
@jdepend ||= Buildr::JDepend::Config.new(project)
end
after_define do |project|
if project.jdepend.enabled?
desc 'Generate JDepend xml report.'
project.task('jdepend:xml') do
puts 'JDepend: Analyzing source code...'
mkdir_p File.dirname(project.jdepend.xml_output_file)
Buildr::JDepend.jdepend(project.jdepend.xml_output_file,
project.jdepend.complete_target_paths,
project.jdepend.to_options)
end
desc 'Run JDepend with Swing UI.'
project.task('jdepend:swing') do
puts 'JDepend: Analyzing source code...'
Buildr::JDepend.jdepend(nil,
project.jdepend.complete_target_paths,
project.jdepend.to_options)
end
if project.jdepend.html_enabled?
xml_task = project.task('jdepend:xml')
desc 'Generate JDepend html report.'
project.task("jdepend:html" => xml_task) do
puts 'JDepend: Generating report'
mkdir_p File.dirname(project.jdepend.html_output_file)
Buildr.ant 'jdepend' do |ant|
ant.xslt :in => project.jdepend.xml_output_file,
:out => project.jdepend.html_output_file,
:style => project.jdepend.style_file
end
end
end
end
end
end
end
end
class Buildr::Project
include Buildr::JDepend::ProjectExtension
end