Path: | lib/generated/examples/find_incoming_dependency_graph.txt |
Last Update: | Sat May 30 00:44:04 +0200 2015 |
Example usage of dependency graph: Invert the graph and see incoming dependencies of a module. After getting all classes of a module, use previously generated dependency graph to iterate all incoming edges. Then either report all incoming edges as CSV or find all private/inner classes of the module. Works with an existing dependency graph, e.g. created by chart module dependencies example.
Author: | Peter Kofler |
Copyright: | Copyright (c) 2012, Peter Kofler. |
License: | BSD License |
require 'javaclass/dsl/mixin' require 'javaclass/classpath/tracking_classpath' require 'javaclass/dependencies/edge' require 'javaclass/dependencies/yaml_serializer'
1) create a classpath of the main model plugin
Plugin_name = 'org.codecop.model' cp = classpath(File.join(location, Plugin_name, 'bin')) classes = cp.names puts "#{classes.count} classes found in main plugin" cp.reset_access
2) load a dependency Graph containing the model
plugins = JavaClass::Dependencies::YamlSerializer.new.load('plugin_dependencies')
used to strip beginning of full qualified names
def strip(name) name.sub(/^org\.codecop\./, '*.') end
3) mark all accessed classes in model plugin using the dependency graph
plugins.each_node do |plugin| next if plugin.name == Plugin_name plugin.each_edge do |dep, edge| next unless dep.name == Plugin_name cp.mark_accessed(edge.target) end end plugins.each_node do |plugin| plugin.each_dependency_provider do |dep, dependencies| plugin.dependencies[dep] = dependencies.map { |edge| # replace class edges by package edges # JavaClass::Dependencies::Edge.new(edge.source.to_javaname.package, edge.target.to_javaname.package) # replace class edges with source plugin, target package # JavaClass::Dependencies::Edge.new(plugin.name, edge.target.to_javaname.package) # replace source edges with source plugin JavaClass::Dependencies::Edge.new(plugin.name, edge.target) }.uniq.sort end end
4) report all incoming dependencies (edges) for further Excel analysis
plugins.each_node do |plugin| next if plugin.name == Plugin_name plugin.each_edge do |dep, edge| next unless dep.name == Plugin_name puts "#{strip(edge.target)};#{strip(plugin.name)};#{strip(edge.source)}" end end
5) report unused classes in model from outside
unused_classes = classes. find_all { |clazz| cp.accessed(clazz) == 0 }. reject { |clazz| clazz =~ /\$.*$/ } report = unused_classes.map { |clazz| "#{clazz.to_classname}" }.uniq puts "#{report.size} private classes found:" report.each do |clazz| puts "#{strip(clazz)};(internal);NA" end