class Buildr::IntellijIdea::IdeaModule

IdeaModule represents an .iml file

Constants

DEFAULT_TYPE

Attributes

facets[R]
group[RW]
jdk_version[W]
main_output_dir[W]
test_output_dir[W]
type[RW]

Public Class Methods

new() click to toggle source
Calls superclass method Buildr::IntellijIdea::IdeaFile.new
# File lib/buildr/ide/idea.rb, line 195
def initialize
  super()
  @type = DEFAULT_TYPE
end

Public Instance Methods

add_ejb_facet(options = {}) click to toggle source
# File lib/buildr/ide/idea.rb, line 442
def add_ejb_facet(options = {})
  name = options[:name] || 'EJB'

  default_ejb_roots = [buildr_project.iml.main_source_directories, buildr_project.compile.sources, buildr_project.resources.sources].flatten.compact
  ejb_roots = options[:ejb_roots] || default_ejb_roots

  default_deployment_descriptors = []
  ['ejb-jar.xml', 'glassfish-ejb-jar.xml', 'ibm-ejb-jar-bnd.xml', 'ibm-ejb-jar-ext-pme.xml', 'ibm-ejb-jar-ext.xml',
   'jboss.xml', 'jbosscmp-jdbc.xml', 'openejb-jar.xml', 'sun-cmp-mapping.xml', 'sun-ejb-jar.xml',
   'weblogic-cmp-rdbms-jar.xml', 'weblogic-ejb-jar.xml'].
    each do |descriptor|
    ejb_roots.each do |path|
      d = "#{path}/WEB-INF/#{descriptor}"
      default_deployment_descriptors << d if File.exist?(d)
      d = "#{path}/META-INF/#{descriptor}"
      default_deployment_descriptors << d if File.exist?(d)
    end
  end
  deployment_descriptors = options[:deployment_descriptors] || default_deployment_descriptors

  add_facet(name, 'ejb') do |facet|
    facet.configuration do |c|
      c.descriptors do |d|
        deployment_descriptors.each do |deployment_descriptor|
          d.deploymentDescriptor :name => File.basename(deployment_descriptor), :url => file_path(deployment_descriptor)
        end
      end
      c.ejbRoots do |e|
        ejb_roots.each do |ejb_root|
          e.root :url => file_path(ejb_root)
        end
      end
    end
  end
end
add_facet(name, type) { |xml| ... } click to toggle source
# File lib/buildr/ide/idea.rb, line 277
def add_facet(name, type)
  add_to_composite_component(self.facets) do |xml|
    xml.facet(:name => name, :type => type) do |xml|
      yield xml if block_given?
    end
  end
end
add_gwt_facet(modules = {}, options = {}) click to toggle source
# File lib/buildr/ide/idea.rb, line 293
def add_gwt_facet(modules = {}, options = {})
  name = options[:name] || 'GWT'
  detected_gwt_version = nil
  if options[:gwt_dev_artifact]
    a = Buildr.artifact(options[:gwt_dev_artifact])
    a.invoke
    detected_gwt_version = a.to_s
  end

  settings =
    {
      :webFacet => 'Web',
      :compilerMaxHeapSize => '512',
      :compilerParameters => '-draftCompile -localWorkers 2 -strict',
      :gwtScriptOutputStyle => 'PRETTY'
    }.merge(options[:settings] || {})

  buildr_project.compile.dependencies.each do |d|
    if d.to_s =~ /\/com\/google\/gwt\/gwt-dev\/(.*)\//
      detected_gwt_version = d.to_s
      break
    end
  end unless detected_gwt_version

  if detected_gwt_version
    settings[:gwtSdkUrl] = resolve_path(File.dirname(detected_gwt_version))
    settings[:gwtSdkType] = 'maven'
  else
    settings[:gwtSdkUrl] = 'file://$GWT_TOOLS$'
  end

  add_facet(name, 'gwt') do |f|
    f.configuration do |c|
      settings.each_pair do |k, v|
        c.setting :name => k.to_s, :value => v.to_s
      end
      c.packaging do |d|
        modules.each_pair do |k, v|
          d.module :name => k, :enabled => v
        end
      end
    end
  end
end
add_jpa_facet(options = {}) click to toggle source
# File lib/buildr/ide/idea.rb, line 395
def add_jpa_facet(options = {})
  name = options[:name] || 'JPA'

  source_roots = [buildr_project.iml.main_source_directories, buildr_project.compile.sources, buildr_project.resources.sources].flatten.compact
  default_deployment_descriptors = []
  ['orm.xml', 'persistence.xml'].
    each do |descriptor|
    source_roots.each do |path|
      d = "#{path}/META-INF/#{descriptor}"
      default_deployment_descriptors << d if File.exist?(d)
    end
  end
  deployment_descriptors = options[:deployment_descriptors] || default_deployment_descriptors

  factory_entry = options[:factory_entry] || buildr_project.name.to_s
  validation_enabled = options[:validation_enabled].nil? ? true : options[:validation_enabled]
  if options[:provider_enabled]
    provider = options[:provider_enabled]
  else
    provider = nil
    {'org.hibernate.ejb.HibernatePersistence' => 'Hibernate',
     'org.eclipse.persistence.jpa.PersistenceProvider' => 'EclipseLink'}.
      each_pair do |match, candidate_provider|
      deployment_descriptors.each do |descriptor|
        if File.exist?(descriptor) && /#{Regexp.escape(match)}/ =~ IO.read(descriptor)
          provider = candidate_provider
        end
      end
    end
  end

  add_facet(name, 'jpa') do |f|
    f.configuration do |c|
      if provider
        c.setting :name => 'validation-enabled', :value => validation_enabled
        c.setting :name => 'provider-name', :value => provider
      end
      c.tag!('datasource-mapping') do |ds|
        ds.tag!('factory-entry', :name => factory_entry)
      end
      deployment_descriptors.each do |descriptor|
        c.deploymentDescriptor :name => File.basename(descriptor), :url => file_path(descriptor)
      end
    end
  end
end
add_jruby_facet(options = {}) click to toggle source
# File lib/buildr/ide/idea.rb, line 380
def add_jruby_facet(options = {})
  name = options[:name] || 'JRuby'

  ruby_version_file = buildr_project._('.ruby-version')
  default_jruby_version = File.exist?(ruby_version_file) ? "rbenv: #{IO.read(ruby_version_file).strip}" : 'jruby-1.6.7.2'
  jruby_version = options[:jruby_version] || default_jruby_version
  add_facet(name, 'JRUBY') do |f|
    f.configuration do |c|
      c.JRUBY_FACET_CONFIG_ID :NAME => 'JRUBY_SDK_NAME', :VALUE => jruby_version
      c.LOAD_PATH :number => '0'
      c.I18N_FOLDERS :number => '0'
    end
  end
end
add_web_facet(options = {}) click to toggle source
# File lib/buildr/ide/idea.rb, line 338
def add_web_facet(options = {})
  name = options[:name] || 'Web'
  default_webroots = {}
  default_webroots[buildr_project._(:source, :main, :webapp)] = '/' if File.exist?(buildr_project._(:source, :main, :webapp))
  buildr_project.assets.paths.each {|p| default_webroots[p] = '/' }
  webroots = options[:webroots] || default_webroots
  default_deployment_descriptors = []
  ['web.xml', 'sun-web.xml', 'glassfish-web.xml', 'jetty-web.xml', 'geronimo-web.xml',
   'context.xml', 'weblogic.xml',
   'jboss-deployment-structure.xml', 'jboss-web.xml',
   'ibm-web-bnd.xml', 'ibm-web-ext.xml', 'ibm-web-ext-pme.xml'].
    each do |descriptor|
    webroots.each_pair do |path, relative_url|
      next unless relative_url == '/'
      d = "#{path}/WEB-INF/#{descriptor}"
      default_deployment_descriptors << d if File.exist?(d)
    end
  end
  deployment_descriptors = options[:deployment_descriptors] || default_deployment_descriptors

  add_facet(name, 'web') do |f|
    f.configuration do |c|
      c.descriptors do |d|
        deployment_descriptors.each do |deployment_descriptor|
          d.deploymentDescriptor :name => File.basename(deployment_descriptor), :url => file_path(deployment_descriptor)
        end
      end
      c.webroots do |w|
        webroots.each_pair do |webroot, relative_url|
          w.root :url => file_path(webroot), :relative => relative_url
        end
      end
    end
    default_enable_jsf = webroots.keys.any?{|webroot| File.exist?("#{webroot}/WEB-INF/faces-config.xml")}
    enable_jsf = options[:enable_jsf].nil? ? default_enable_jsf : options[:enable_jsf]
    enable_jsf = false if buildr_project.root_project.ipr? && buildr_project.root_project.ipr.version >= '13'
    f.facet(:type => 'jsf', :name => 'JSF') do |jsf|
      jsf.configuration
    end if enable_jsf
  end
end
buildr_project=(buildr_project) click to toggle source
# File lib/buildr/ide/idea.rb, line 200
def buildr_project=(buildr_project)
  @id = nil
  @facets = []
  @skip_content = false
  @buildr_project = buildr_project
end
excluded_directories() click to toggle source
# File lib/buildr/ide/idea.rb, line 247
def excluded_directories
  @excluded_directories ||= [
    buildr_project.resources.target,
    buildr_project.test.resources.target,
    buildr_project.path_to(:target, :main),
    buildr_project.path_to(:target, :test),
    buildr_project.path_to(:reports)
  ].flatten.compact
end
extension() click to toggle source
# File lib/buildr/ide/idea.rb, line 211
def extension
  'iml'
end
jdk_version() click to toggle source
# File lib/buildr/ide/idea.rb, line 207
def jdk_version
  @jdk_version || buildr_project.compile.options.source || '1.7'
end
main_dependencies() click to toggle source
# File lib/buildr/ide/idea.rb, line 269
def main_dependencies
  @main_dependencies ||= buildr_project.compile.dependencies.dup
end
main_generated_resource_directories() click to toggle source
# File lib/buildr/ide/idea.rb, line 227
def main_generated_resource_directories
  @main_generated_resource_directories ||= []
end
main_generated_source_directories() click to toggle source
# File lib/buildr/ide/idea.rb, line 223
def main_generated_source_directories
  @main_generated_source_directories ||= []
end
main_output_dir() click to toggle source
# File lib/buildr/ide/idea.rb, line 259
def main_output_dir
  @main_output_dir ||= buildr_project._(:target, :main, :idea, :classes)
end
main_resource_directories() click to toggle source
# File lib/buildr/ide/idea.rb, line 219
def main_resource_directories
  @main_resource_directories ||= [buildr_project.resources.sources].flatten.compact
end
main_source_directories() click to toggle source
# File lib/buildr/ide/idea.rb, line 215
def main_source_directories
  @main_source_directories ||= [buildr_project.compile.sources].flatten.compact
end
skip_content!() click to toggle source
# File lib/buildr/ide/idea.rb, line 289
def skip_content!
  @skip_content = true
end
skip_content?() click to toggle source
# File lib/buildr/ide/idea.rb, line 285
def skip_content?
  !!@skip_content
end
test_dependencies() click to toggle source
# File lib/buildr/ide/idea.rb, line 273
def test_dependencies
  @test_dependencies ||= buildr_project.test.compile.dependencies.dup
end
test_generated_resource_directories() click to toggle source
# File lib/buildr/ide/idea.rb, line 243
def test_generated_resource_directories
  @test_generated_resource_directories ||= []
end
test_generated_source_directories() click to toggle source
# File lib/buildr/ide/idea.rb, line 239
def test_generated_source_directories
  @test_generated_source_directories ||= []
end
test_output_dir() click to toggle source
# File lib/buildr/ide/idea.rb, line 265
def test_output_dir
  @test_output_dir ||= buildr_project._(:target, :test, :idea, :classes)
end
test_resource_directories() click to toggle source
# File lib/buildr/ide/idea.rb, line 235
def test_resource_directories
  @test_resource_directories ||= [buildr_project.test.resources.sources].flatten.compact
end
test_source_directories() click to toggle source
# File lib/buildr/ide/idea.rb, line 231
def test_source_directories
  @test_source_directories ||= [buildr_project.test.compile.sources].flatten.compact
end

Protected Instance Methods

base_document() click to toggle source
# File lib/buildr/ide/idea.rb, line 511
def base_document
  target = StringIO.new
  Builder::XmlMarkup.new(:target => target).module(:version => '4', :relativePaths => 'true', :type => self.type)
  Buildr::IntellijIdea.new_document(target.string)
end
default_components() click to toggle source
# File lib/buildr/ide/idea.rb, line 521
def default_components
  [
    lambda { module_root_component },
    lambda { facet_component }
  ]
end
facet_component() click to toggle source
# File lib/buildr/ide/idea.rb, line 528
def facet_component
  create_composite_component('FacetManager', {}, self.facets)
end
generate_compile_output(xml) click to toggle source
# File lib/buildr/ide/idea.rb, line 601
def generate_compile_output(xml)
  xml.output(:url => file_path(self.main_output_dir.to_s))
  xml.tag!('output-test', :url => file_path(self.test_output_dir.to_s))
  xml.tag!('exclude-output')
end
generate_content(xml) click to toggle source
# File lib/buildr/ide/idea.rb, line 607
def generate_content(xml)
  xml.content(:url => 'file://$MODULE_DIR$') do
    # Source folders
    [
      {:dirs => (self.main_source_directories.dup - self.main_generated_source_directories)},
      {:dirs => self.main_generated_source_directories, :generated => true},
      {:type => 'resource', :dirs => (self.main_resource_directories.dup - self.main_generated_resource_directories)},
      {:type => 'resource', :dirs => self.main_generated_resource_directories, :generated => true},
      {:test => true, :dirs => (self.test_source_directories - self.test_generated_source_directories)},
      {:test => true, :dirs => self.test_generated_source_directories, :generated => true},
      {:test => true, :type => 'resource', :dirs => (self.test_resource_directories - self.test_generated_resource_directories)},
      {:test => true, :type => 'resource', :dirs => self.test_generated_resource_directories, :generated => true},
    ].each do |content|
      content[:dirs].map { |dir| dir.to_s }.compact.sort.uniq.each do |dir|
        options = {}
        options[:url] = file_path(dir)
        options[:isTestSource] = (content[:test] ? 'true' : 'false') if content[:type] != 'resource'
        options[:type] = 'java-resource' if content[:type] == 'resource' && !content[:test]
        options[:type] = 'java-test-resource' if content[:type] == 'resource' && content[:test]
        options[:generated] = 'true' if content[:generated]
        xml.sourceFolder options
      end
    end

    # Exclude target directories
    self.net_excluded_directories.
      collect { |dir| file_path(dir) }.
      select { |dir| relative_dir_inside_dir?(dir) }.
      sort.each do |dir|
      xml.excludeFolder :url => dir
    end
  end
end
generate_initial_order_entries(xml) click to toggle source
# File lib/buildr/ide/idea.rb, line 645
def generate_initial_order_entries(xml)
  xml.orderEntry :type => 'sourceFolder', :forTests => 'false'
  xml.orderEntry :type => 'jdk', :jdkName => jdk_version, :jdkType => 'JavaSDK'
end
generate_lib(xml, dependency_path, export, source_path, project_dependencies) click to toggle source
# File lib/buildr/ide/idea.rb, line 568
def generate_lib(xml, dependency_path, export, source_path, project_dependencies)
  project_for_dependency = Buildr.projects.detect do |project|
    [project.packages, project.compile.target, project.resources.target, project.test.compile.target, project.test.resources.target].flatten.
      detect { |artifact| artifact.to_s == dependency_path }
  end
  if project_for_dependency
    if project_for_dependency.iml? &&
      !project_dependencies.include?(project_for_dependency) &&
      project_for_dependency != self.buildr_project
      generate_project_dependency(xml, project_for_dependency.iml.name, export, !export)
    end
    project_dependencies << project_for_dependency
  else
    generate_module_lib(xml, url_for_path(dependency_path), export, (source_path ? url_for_path(source_path) : nil), !export)
  end
end
generate_module_lib(xml, path, export, source_path, test = false) click to toggle source
# File lib/buildr/ide/idea.rb, line 657
def generate_module_lib(xml, path, export, source_path, test = false)
  attribs = {:type => 'module-library'}
  attribs[:exported] = '' if export
  attribs[:scope] = 'TEST' if test
  xml.orderEntry attribs do
    xml.library do
      xml.CLASSES do
        xml.root :url => path
      end
      xml.JAVADOC
      xml.SOURCES do
        if source_path
          xml.root :url => source_path
        end
      end
    end
  end
end
generate_project_dependency(xml, other_project, export, test = false) click to toggle source
# File lib/buildr/ide/idea.rb, line 650
def generate_project_dependency(xml, other_project, export, test = false)
  attribs = {:type => 'module', 'module-name' => other_project}
  attribs[:exported] = '' if export
  attribs[:scope] = 'TEST' if test
  xml.orderEntry attribs
end
initial_components() click to toggle source
# File lib/buildr/ide/idea.rb, line 517
def initial_components
  []
end
jar_path(path) click to toggle source
# File lib/buildr/ide/idea.rb, line 585
def jar_path(path)
  "jar://#{resolve_path(path)}!/"
end
main_dependency_details() click to toggle source
# File lib/buildr/ide/idea.rb, line 480
def main_dependency_details
  target_dir = buildr_project.compile.target.to_s
  main_dependencies.select { |d| d.to_s != target_dir }.collect do |d|
    dependency_path = d.to_s
    export = true
    source_path = nil
    if d.respond_to?(:to_spec_hash)
      source_spec = d.to_spec_hash.merge(:classifier => 'sources')
      source_path = Buildr.artifact(source_spec).to_s
      source_path = nil unless File.exist?(source_path)
    end
    [dependency_path, export, source_path]
  end
end
module_root_component() click to toggle source
# File lib/buildr/ide/idea.rb, line 532
def module_root_component
  options = { 'inherit-compiler-output' => 'false' }
  options['LANGUAGE_LEVEL'] = "JDK_#{jdk_version.gsub(/\./, '_')}" unless jdk_version == buildr_project.root_project.compile.options.source
  create_component('NewModuleRootManager', options) do |xml|
    generate_compile_output(xml)
    generate_content(xml) unless skip_content?
    generate_initial_order_entries(xml)
    project_dependencies = []

    # If a project dependency occurs as a main dependency then add it to the list
    # that are excluded from list of test modules
    self.main_dependency_details.each do |dependency_path, export, source_path|
      next unless export
      project_for_dependency = Buildr.projects.detect do |project|
        [project.packages, project.compile.target, project.resources.target, project.test.compile.target, project.test.resources.target].flatten.
          detect { |artifact| artifact.to_s == dependency_path }
      end
      project_dependencies << project_for_dependency if project_for_dependency
    end

    main_project_dependencies = project_dependencies.dup
    self.test_dependency_details.each do |dependency_path, export, source_path|
      next if export
      generate_lib(xml, dependency_path, export, source_path, project_dependencies)
    end

    test_project_dependencies = project_dependencies - main_project_dependencies
    self.main_dependency_details.each do |dependency_path, export, source_path|
      next unless export
      generate_lib(xml, dependency_path, export, source_path, test_project_dependencies)
    end

    xml.orderEntryProperties
  end
end
net_excluded_directories() click to toggle source

Don't exclude things that are subdirectories of other excluded things

# File lib/buildr/ide/idea.rb, line 677
def net_excluded_directories
  net = []
  all = self.excluded_directories.map { |dir| buildr_project._(dir.to_s) }.sort_by { |d| d.size }
  all.each_with_index do |dir, i|
    unless all[0 ... i].find { |other| dir =~ /^#{other}/ }
      net << dir
    end
  end
  net
end
relative_dir_inside_dir?(dir) click to toggle source
# File lib/buildr/ide/idea.rb, line 641
def relative_dir_inside_dir?(dir)
  !dir.include?('../')
end
resolve_path(path) click to toggle source
# File lib/buildr/ide/idea.rb, line 597
def resolve_path(path)
  resolve_path_from_base(path, '$MODULE_DIR$')
end
test_dependency_details() click to toggle source
# File lib/buildr/ide/idea.rb, line 495
def test_dependency_details
  main_dependencies_paths = main_dependencies.map(&:to_s)
  target_dir = buildr_project.compile.target.to_s
  test_dependencies.select { |d| d.to_s != target_dir }.collect do |d|
    dependency_path = d.to_s
    export = main_dependencies_paths.include?(dependency_path)
    source_path = nil
    if d.respond_to?(:to_spec_hash)
      source_spec = d.to_spec_hash.merge(:classifier => 'sources')
      source_path = Buildr.artifact(source_spec).to_s
      source_path = nil unless File.exist?(source_path)
    end
    [dependency_path, export, source_path]
  end
end
url_for_path(path) click to toggle source
# File lib/buildr/ide/idea.rb, line 589
def url_for_path(path)
  if path =~ /jar$/i
    jar_path(path)
  else
    file_path(path)
  end
end