# 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 #:nodoc:
  module IntellijIdea
    def self.new_document(value)
      REXML::Document.new(value, :attribute_quote => :quote)
    end

    # Abstract base class for IdeaModule and IdeaProject
    class IdeaFile
      DEFAULT_PREFIX = ''
      DEFAULT_SUFFIX = ''
      DEFAULT_LOCAL_REPOSITORY_ENV_OVERRIDE = 'MAVEN_REPOSITORY'

      attr_reader :buildr_project
      attr_writer :prefix
      attr_writer :suffix
      attr_writer :id
      attr_accessor :template
      attr_accessor :local_repository_env_override

      def initialize
        @local_repository_env_override = DEFAULT_LOCAL_REPOSITORY_ENV_OVERRIDE
      end

      def prefix
        @prefix ||= DEFAULT_PREFIX
      end

      def suffix
        @suffix ||= DEFAULT_SUFFIX
      end

      def filename
        buildr_project.path_to("#{name}.#{extension}")
      end

      def id
        @id ||= buildr_project.name.split(':').last
      end

      def add_component(name, attrs = {}, &xml)
        self.components << create_component(name, attrs, &xml)
      end

      def add_component_from_file(filename)
        self.components << lambda do
          raise "Unable to locate file #{filename} adding component to idea file" unless File.exist?(filename)
          Buildr::IntellijIdea.new_document(IO.read(filename)).root
        end
      end

      def add_component_from_artifact(artifact)
        self.components << lambda do
          a = Buildr.artifact(artifact)
          a.invoke
          Buildr::IntellijIdea.new_document(IO.read(a.to_s)).root
        end
      end

      # IDEA can not handle text content with indents so need to removing indenting
      # Can not pass true as third argument as the ruby library seems broken
      def write(f)
        document.write(f, -1, false, true)
      end

      def name
        "#{prefix}#{self.id}#{suffix}"
      end

      protected

      def relative(path)
        ::Buildr::Util.relative_path(File.expand_path(path.to_s), self.base_directory)
      end

      def base_directory
        buildr_project.path_to
      end

      def resolve_path_from_base(path, base_variable)
        m2repo = Buildr::Repositories.instance.local
        if path.to_s.index(m2repo) == 0 && !self.local_repository_env_override.nil?
          return path.sub(m2repo, "$#{self.local_repository_env_override}$")
        else
          begin
            return "#{base_variable}/#{relative(path)}"
          rescue ArgumentError
            # ArgumentError happens on windows when self.base_directory and path are on different drives
            return path
          end
        end
      end

      def file_path(path)
        "file://#{resolve_path(path)}"
      end

      def create_component(name, attrs = {})
        target = StringIO.new
        Builder::XmlMarkup.new(:target => target, :indent => 2).component({:name => name}.merge(attrs)) do |xml|
          yield xml if block_given?
        end
        Buildr::IntellijIdea.new_document(target.string).root
      end

      def components
        @components ||= []
      end

      def create_composite_component(name, attrs, components)
        return nil if components.empty?
        component = self.create_component(name, attrs)
        components.each do |element|
          element = element.call if element.is_a?(Proc)
          component.add_element element
        end
        component
      end

      def add_to_composite_component(components)
        components << lambda do
          target = StringIO.new
          yield Builder::XmlMarkup.new(:target => target, :indent => 2)
          Buildr::IntellijIdea.new_document(target.string).root
        end
      end

      def load_document(filename)
        Buildr::IntellijIdea.new_document(File.read(filename))
      end

      def document
        if File.exist?(self.filename)
          doc = load_document(self.filename)
        else
          doc = base_document
          inject_components(doc, self.initial_components)
        end
        if self.template
          template_doc = load_document(self.template)
          REXML::XPath.each(template_doc, '//component') do |element|
            inject_component(doc, element)
          end
        end
        inject_components(doc, self.default_components.compact + self.components)

        # Sort the components in the same order the idea sorts them
        sorted = doc.root.get_elements('//component').sort { |s1, s2| s1.attribute('name').value <=> s2.attribute('name').value }
        doc = base_document
        sorted.each do |element|
          doc.root.add_element element
        end

        doc
      end

      def inject_components(doc, components)
        components.each do |component|
          # execute deferred components
          component = component.call if Proc === component
          inject_component(doc, component) if component
        end
      end

      # replace overridden component (if any) with specified component
      def inject_component(doc, component)
        doc.root.delete_element("//component[@name='#{component.attributes['name']}']")
        doc.root.add_element component
      end
    end

    # IdeaModule represents an .iml file
    class IdeaModule < IdeaFile
      DEFAULT_TYPE = 'JAVA_MODULE'

      attr_accessor :type
      attr_accessor :group
      attr_reader :facets
      attr_writer :jdk_version

      def initialize
        super()
        @type = DEFAULT_TYPE
      end

      def buildr_project=(buildr_project)
        @id = nil
        @facets = []
        @skip_content = false
        @buildr_project = buildr_project
      end

      def jdk_version
        @jdk_version || buildr_project.compile.options.source || '1.7'
      end

      def extension
        'iml'
      end

      def annotation_paths
        @annotation_paths ||= [buildr_project._(:source, :main, :annotations)].select {|p| File.exist?(p)}
      end

      def main_source_directories
        @main_source_directories ||= [buildr_project.compile.sources].flatten.compact
      end

      def main_resource_directories
        @main_resource_directories ||= [buildr_project.resources.sources].flatten.compact
      end

      def main_generated_source_directories
        @main_generated_source_directories ||= []
      end

      def main_generated_resource_directories
        @main_generated_resource_directories ||= []
      end

      def test_source_directories
        @test_source_directories ||= [buildr_project.test.compile.sources].flatten.compact
      end

      def test_resource_directories
        @test_resource_directories ||= [buildr_project.test.resources.sources].flatten.compact
      end

      def test_generated_source_directories
        @test_generated_source_directories ||= []
      end

      def test_generated_resource_directories
        @test_generated_resource_directories ||= []
      end

      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

      attr_writer :main_output_dir

      def main_output_dir
        @main_output_dir ||= buildr_project._(:target, :main, :idea, :classes)
      end

      attr_writer :test_output_dir

      def test_output_dir
        @test_output_dir ||= buildr_project._(:target, :test, :idea, :classes)
      end

      def main_dependencies
        @main_dependencies ||= buildr_project.compile.dependencies.dup
      end

      def test_dependencies
        @test_dependencies ||= buildr_project.test.compile.dependencies.dup
      end

      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

      def skip_content?
        !!@skip_content
      end

      def skip_content!
        @skip_content = true
      end

      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

      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 = []
        %w(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

      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

      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

      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 = []
        %w(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

      protected

      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
          annotations_path = nil
          if d.is_a?(Buildr::Artifact)
            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
          if d.is_a?(Buildr::Artifact)
            annotations_spec = d.to_spec_hash.merge(:classifier => 'annotations')
            annotations_path = Buildr.artifact(annotations_spec).to_s
            annotations_path = nil unless File.exist?(annotations_path)
          end
          [dependency_path, export, source_path, annotations_path]
        end
      end

      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
          annotations_path = nil
          if d.is_a?(Buildr::Artifact)
            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
          if d.is_a?(Buildr::Artifact)
            annotations_spec = d.to_spec_hash.merge(:classifier => 'annotations')
            annotations_path = Buildr.artifact(annotations_spec).to_s
            annotations_path = nil unless File.exist?(annotations_path)
          end
          [dependency_path, export, source_path, annotations_path]
        end
      end

      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

      def initial_components
        []
      end

      def default_components
        [
          lambda { module_root_component },
          lambda { facet_component }
        ]
      end

      def facet_component
        create_composite_component('FacetManager', {}, self.facets)
      end

      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, annotations_path|
            next if export
            generate_lib(xml, dependency_path, export, source_path, annotations_path, project_dependencies)
          end

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

          xml.orderEntryProperties
        end
      end

      def generate_lib(xml, dependency_path, export, source_path, annotations_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), (annotations_path ? url_for_path(annotations_path) : nil), !export)
        end
      end

      def jar_path(path)
        "jar://#{resolve_path(path)}!/"
      end

      def url_for_path(path)
        if path =~ /jar$/i
          jar_path(path)
        else
          file_path(path)
        end
      end

      def resolve_path(path)
        resolve_path_from_base(path, '$MODULE_DIR$')
      end

      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')
        paths = self.annotation_paths
        unless paths.empty?
          xml.tag!('annotation-paths') do |xml|
            paths.each do |path|
              xml.root(:url=> file_path(path))
            end
          end
        end
      end

      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

      def relative_dir_inside_dir?(dir)
        !dir.include?('../')
      end

      def generate_initial_order_entries(xml)
        xml.orderEntry :type => 'sourceFolder', :forTests => 'false'
        xml.orderEntry :type => 'jdk', :jdkName => jdk_version, :jdkType => 'JavaSDK'
      end

      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

      def generate_module_lib(xml, path, export, source_path, annotations_path, test = false)
        attribs = {:type => 'module-library'}
        attribs[:exported] = '' if export
        attribs[:scope] = 'TEST' if test
        xml.orderEntry attribs do
          xml.library do
            xml.ANNOTATIONS do
              xml.root :url => annotations_path
            end if annotations_path
            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

      # Don't exclude things that are subdirectories of other excluded things
      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
    end

    # IdeaModule represents an .ipr file
    class IdeaProject < IdeaFile
      attr_accessor :extra_modules
      attr_accessor :artifacts
      attr_accessor :data_sources
      attr_accessor :configurations
      attr_writer :jdk_version
      attr_writer :version

      def initialize(buildr_project)
        super()
        @buildr_project = buildr_project
        @extra_modules = []
        @artifacts = []
        @data_sources = []
        @configurations = []
      end

      def version
        @version || '13'
      end

      def jdk_version
        @jdk_version ||= buildr_project.compile.options.source || '1.7'
      end

      def add_artifact(name, type, build_on_make = false)
        add_to_composite_component(self.artifacts) do |xml|
          xml.artifact(:name => name, :type => type, 'build-on-make' => build_on_make) do |xml|
            yield xml if block_given?
          end
        end
      end

      def add_configuration(name, type, factory_name, default = false, options = {})
        add_to_composite_component(self.configurations) do |xml|
          params = options.dup
          params[:type] = type
          params[:factoryName] = factory_name
          params[:name] = name unless default
          params[:default] = !!default
          xml.configuration(params) do
            yield xml if block_given?
          end
        end
      end

      def add_default_configuration(type, factory_name)
        add_configuration(nil, type, factory_name, true) do |xml|
          yield xml if block_given?
        end
      end

      def mssql_dialect_mapping
        sql_dialect_mappings(buildr_project.base_dir => 'TSQL')
      end

      def postgres_dialect_mapping
        sql_dialect_mappings(buildr_project.base_dir => 'PostgreSQL')
      end

      def sql_dialect_mappings(mappings)
        add_component('SqlDialectMappings') do |component|
          mappings.each_pair do |path, dialect|
            file_path = file_path(path).gsub(/\/.$/, '')
            component.file :url => file_path, :dialect => dialect
          end
        end
      end

      def add_postgres_data_source(name, options = {})
        if options[:url].nil? && options[:database]
         default_url = "jdbc:postgresql://#{(options[:host] || '127.0.0.1')}:#{(options[:port] || '5432')}/#{options[:database]}"
        end

        params = {
          :driver => 'org.postgresql.Driver',
          :url => default_url,
          :username => ENV['USER'],
          :dialect => 'PostgreSQL',
          :classpath => ['org.postgresql:postgresql:jar:9.2-1003-jdbc4']
        }.merge(options)
        add_data_source(name, params)
      end

      def add_sql_server_data_source(name, options = {})
        default_url = nil
        if options[:url].nil? && options[:database]
          default_url = "jdbc:jtds:sqlserver://#{(options[:host] || '127.0.0.1')}:#{(options[:port] || '1433')}/#{options[:database]}"
        end

        params = {
          :driver => 'net.sourceforge.jtds.jdbc.Driver',
          :url => default_url,
          :username => ENV['USER'],
          :dialect => 'TSQL',
          :classpath => ['net.sourceforge.jtds:jtds:jar:1.2.7']
        }.merge(options)

        if params[:url]
          if /jdbc\:jtds\:sqlserver\:\/\/[^:\\]+(\:\d+)?\/([^;]*)(\;.*)?/ =~ params[:url]
            database_name = $2
            params[:schema_pattern] = "#{database_name}.*"
            params[:default_schemas] = "#{database_name}.*"
          end
        end

        add_data_source(name, params)
      end

      def add_data_source(name, options = {})
        add_to_composite_component(self.data_sources) do |xml|
          data_source_options = {
            :source => 'LOCAL',
            :name => name,
            :uuid => Buildr::Util.uuid
          }
          classpath = options[:classpath] || []
          xml.tag!('data-source', data_source_options) do |xml|
            xml.tag!('synchronize', (options[:synchronize]||'true'))
            xml.tag!('jdbc-driver', options[:driver]) if options[:driver]
            xml.tag!('jdbc-url', options[:url]) if options[:url]
            xml.tag!('user-name', options[:username]) if options[:username]
            xml.tag!('user-password', encrypt(options[:password])) if options[:password]
            xml.tag!('schema-pattern', options[:schema_pattern]) if options[:schema_pattern]
            xml.tag!('default-schemas', options[:default_schemas]) if options[:default_schemas]
            xml.tag!('table-pattern', options[:table_pattern]) if options[:table_pattern]
            xml.tag!('default-dialect', options[:dialect]) if options[:dialect]

            xml.libraries do |xml|
              classpath.each do |classpath_element|
                a = Buildr.artifact(classpath_element)
                a.invoke
                xml.library do |xml|
                  xml.tag!('url', resolve_path(a.to_s))
                end
              end
            end if classpath.size > 0
          end
        end
      end

      def add_exploded_war_artifact(project, options = {})
        artifact_name = to_artifact_name(project, options)
        artifacts = options[:artifacts] || []

        add_artifact(artifact_name, 'exploded-war', build_on_make(options)) do |xml|
          dependencies = (options[:dependencies] || ([project] + project.compile.dependencies)).flatten
          libraries, projects = partition_dependencies(dependencies)

          emit_output_path(xml, artifact_name, options)
          xml.root :id => 'root' do
            xml.element :id => 'directory', :name => 'WEB-INF' do
              xml.element :id => 'directory', :name => 'classes' do
                artifact_content(xml, project, projects, options)
              end
              xml.element :id => 'directory', :name => 'lib' do
                emit_libraries(xml, libraries)
                emit_jar_artifacts(xml, artifacts)
              end
            end

            if options[:enable_war].nil? || options[:enable_war] || (options[:war_module_names] && options[:war_module_names].size > 0)
              module_names = options[:war_module_names] || [project.iml.name]
              module_names.each do |module_name|
                facet_name = options[:war_facet_name] || 'Web'
                xml.element :id => 'javaee-facet-resources', :facet => "#{module_name}/web/#{facet_name}"
              end
            end

            if options[:enable_gwt] || (options[:gwt_module_names] && options[:gwt_module_names].size > 0)
              module_names = options[:gwt_module_names] || [project.iml.name]
              module_names.each do |module_name|
                facet_name = options[:gwt_facet_name] || 'GWT'
                xml.element :id => 'gwt-compiler-output', :facet => "#{module_name}/gwt/#{facet_name}"
              end
            end
          end
        end
      end

      def add_exploded_ear_artifact(project, options ={})
        artifact_name = to_artifact_name(project, options)

        add_artifact(artifact_name, 'exploded-ear', build_on_make(options)) do |xml|
          dependencies = (options[:dependencies] || ([project] + project.compile.dependencies)).flatten
          libraries, projects = partition_dependencies(dependencies)

          emit_output_path(xml, artifact_name, options)
          xml.root :id => 'root' do
            emit_module_output(xml, projects)
            xml.element :id => 'directory', :name => 'lib' do
              emit_libraries(xml, libraries)
            end
          end
        end
      end

      def add_jar_artifact(project, options = {})
        artifact_name = to_artifact_name(project, options)

        dependencies = (options[:dependencies] || [project]).flatten
        libraries, projects = partition_dependencies(dependencies)
        raise "Unable to add non-project dependencies (#{libraries.inspect}) to jar artifact" if libraries.size > 0

        jar_name = "#{artifact_name}.jar"
        add_artifact(jar_name, 'jar', build_on_make(options)) do |xml|
          emit_output_path(xml, artifact_name, options)
          xml.root(:id => 'archive', :name => jar_name) do
            artifact_content(xml, project, projects, options)
          end
        end
      end

      def add_exploded_ejb_artifact(project, options = {})
        artifact_name = to_artifact_name(project, options)

        add_artifact(artifact_name, 'exploded-ejb', build_on_make(options)) do |xml|
          dependencies = (options[:dependencies] || [project]).flatten
          libraries, projects = partition_dependencies(dependencies)
          raise "Unable to add non-project dependencies (#{libraries.inspect}) to ejb artifact" if libraries.size > 0

          emit_output_path(xml, artifact_name, options)
          xml.root :id => 'root' do
            artifact_content(xml, project, projects, options)
          end
        end
      end

      def add_java_configuration(project, classname, options = {})
        args = options[:args] || ''
        dir = options[:dir] || 'file://$PROJECT_DIR$/'
        debug_port = options[:debug_port] || 2599
        module_name = options[:module_name] || project.iml.name
        jvm_args = options[:jvm_args] || ''
        name = options[:name] || classname

        add_to_composite_component(self.configurations) do |xml|
          xml.configuration(:name => name, :type => 'Application', :factoryName => 'Application', :default => !!options[:default]) do |xml|
            xml.extension(:name => 'coverage', :enabled => 'false', :merge => 'false', :sample_coverage => 'true', :runner => 'idea')
            xml.option(:name => 'MAIN_CLASS_NAME', :value => classname)
            xml.option(:name => 'VM_PARAMETERS', :value => jvm_args)
            xml.option(:name => 'PROGRAM_PARAMETERS', :value => args)
            xml.option(:name => 'WORKING_DIRECTORY', :value => dir)
            xml.option(:name => 'ALTERNATIVE_JRE_PATH_ENABLED', :value => 'false')
            xml.option(:name => 'ALTERNATIVE_JRE_PATH', :value => '')
            xml.option(:name => 'ENABLE_SWING_INSPECTOR', :value => 'false')
            xml.option(:name => 'ENV_VARIABLES')
            xml.option(:name => 'PASS_PARENT_ENVS', :value => 'true')
            xml.module(:name => module_name)
            xml.envs
            xml.RunnerSettings(:RunnerId => 'Debug') do |xml|
              xml.option(:name => 'DEBUG_PORT', :value => debug_port.to_s)
              xml.option(:name => 'TRANSPORT', :value => '0')
              xml.option(:name => 'LOCAL', :value => 'true')
            end
            xml.RunnerSettings(:RunnerId => 'Run')
            xml.ConfigurationWrapper(:RunnerId => 'Debug')
            xml.ConfigurationWrapper(:RunnerId => 'Run')
            xml.method
          end
        end
      end

      def add_ruby_script_configuration(project, script, options = {})
        args = options[:args] || ''
        path = ::Buildr::Util.relative_path(File.expand_path(script), project.base_dir)
        name = options[:name] || File.basename(script)
        dir = options[:dir] || "$MODULE_DIR$/#{path}"
        sdk = options[:sdk] || 'rbenv: ' + (IO.read(File.dirname(__FILE__) + '/../.ruby-version').trim rescue "jruby-#{RUBY_VERSION}")

        add_to_composite_component(self.configurations) do |xml|
          xml.configuration(:name => name, :type => 'RubyRunConfigurationType', :factoryName => 'Ruby', :default => !!options[:default]) do |xml|

            xml.module(:name => project.iml.name)
            xml.RUBY_RUN_CONFIG(:NAME => 'RUBY_ARGS', :VALUE => '-e STDOUT.sync=true;STDERR.sync=true;load($0=ARGV.shift)')
            xml.RUBY_RUN_CONFIG(:NAME => 'WORK DIR', :VALUE => dir)
            xml.RUBY_RUN_CONFIG(:NAME => 'SHOULD_USE_SDK', :VALUE => 'true')
            xml.RUBY_RUN_CONFIG(:NAME => 'ALTERN_SDK_NAME', :VALUE => sdk)
            xml.RUBY_RUN_CONFIG(:NAME => 'myPassParentEnvs', :VALUE => 'true')

            xml.envs
            xml.EXTENSION(:ID => 'BundlerRunConfigurationExtension', :bundleExecEnabled => 'false')
            xml.EXTENSION(:ID => 'JRubyRunConfigurationExtension')

            xml.RUBY_RUN_CONFIG(:NAME => 'SCRIPT_PATH', :VALUE => script)
            xml.RUBY_RUN_CONFIG(:NAME => 'SCRIPT_ARGS', :VALUE => args)
            xml.RunnerSettings(:RunnerId => 'RubyDebugRunner')
            xml.ConfigurationWrapper(:RunnerId => 'RubyDebugRunner')
          end
        end
      end

      def add_gwt_configuration(project, options = {})
        launch_page = options[:launch_page]
        name = options[:name] || (launch_page ? "Run #{launch_page}" : "Run #{project.name} DevMode")
        shell_parameters = options[:shell_parameters]
        vm_parameters = options[:vm_parameters] || '-Xmx512m'
        singleton = options[:singleton].nil? ? true : !!options[:singleton]
        super_dev = options[:super_dev].nil? ? true : !!options[:super_dev]
        gwt_module = options[:gwt_module]

        start_javascript_debugger = options[:start_javascript_debugger].nil? ? true : !!options[:start_javascript_debugger]

        add_configuration(name, 'GWT.ConfigurationType', 'GWT Configuration', false, :singleton => singleton) do |xml|
          xml.module(:name => options[:iml_name] || project.iml.name)

          xml.option(:name => 'VM_PARAMETERS', :value => vm_parameters)
          xml.option(:name => 'RUN_PAGE', :value => launch_page) if launch_page
          xml.option(:name => 'GWT_MODULE', :value => gwt_module) if gwt_module

          # noinspection RubySimplifyBooleanInspection
          xml.option(:name => 'OPEN_IN_BROWSER', :value => false) if options[:open_in_browser] == false
          xml.option(:name => 'START_JAVASCRIPT_DEBUGGER', :value => start_javascript_debugger)
          xml.option(:name => 'USE_SUPER_DEV_MODE', :value => super_dev)
          xml.option(:name => 'SHELL_PARAMETERS', :value => shell_parameters) if shell_parameters

          xml.RunnerSettings(:RunnerId => 'Debug') do
            xml.option(:name => 'DEBUG_PORT', :value => '')
            xml.option(:name => 'TRANSPORT', :value => 0)
            xml.option(:name => 'LOCAL', :value => true)
          end

          xml.RunnerSettings(:RunnerId => 'Run')
          xml.ConfigurationWrapper(:RunnerId => 'Run')
          xml.ConfigurationWrapper(:RunnerId => 'Debug')
          xml.method
        end
      end

      def add_glassfish_configuration(project, options = {})
        artifact_name = options[:name] || project.iml.id
        version = options[:version] || '4.1.0'
        server_name = options[:server_name] || "GlassFish #{version}"
        configuration_name = options[:configuration_name] || server_name
        domain_name = options[:domain] || project.iml.id
        domain_port = options[:port] || '9009'
        packaged = options[:packaged] || {}
        exploded = options[:exploded] || []

        add_to_composite_component(self.configurations) do |xml|
          xml.configuration(:name => configuration_name, :type => 'GlassfishConfiguration', :factoryName => 'Local', :default => false, :APPLICATION_SERVER_NAME => server_name) do |xml|
            xml.option(:name => 'OPEN_IN_BROWSER', :value => 'false')
            xml.option(:name => 'UPDATING_POLICY', :value => 'restart-server')

            xml.deployment do |deployment|
              packaged.each do |name, deployable|
                artifact = Buildr.artifact(deployable)
                artifact.invoke
                deployment.file(:path => resolve_path(artifact.to_s)) do |file|
                  file.settings do |settings|
                    settings.option(:name => 'contextRoot', :value => "/#{name}")
                    settings.option(:name => 'defaultContextRoot', :value => 'false')
                  end
                end
              end
              exploded.each do |deployable_name|
                deployment.artifact(:name => deployable_name) do |artifact|
                  artifact.settings
                end
              end
            end

            xml.tag! 'server-settings' do |server_settings|
              server_settings.option(:name => 'VIRTUAL_SERVER')
              server_settings.option(:name => 'DOMAIN', :value => domain_name.to_s)
              server_settings.option(:name => 'PRESERVE', :value => 'false')
              server_settings.option(:name => 'USERNAME', :value => 'admin')
              server_settings.option(:name => 'PASSWORD', :value => '')
            end

            xml.predefined_log_file(:id => 'GlassFish', :enabled => 'true')

            xml.extension(:name => 'coverage', :enabled => 'false', :merge => 'false', :sample_coverage => 'true', :runner => 'idea')

            xml.RunnerSettings(:RunnerId => 'Cover')

            add_glassfish_runner_settings(xml, 'Cover')
            add_glassfish_configuration_wrapper(xml, 'Cover')

            add_glassfish_runner_settings(xml, 'Debug', {
              :DEBUG_PORT => domain_port.to_s,
              :TRANSPORT => '0',
              :LOCAL => 'true',
            })
            add_glassfish_configuration_wrapper(xml, 'Debug')

            add_glassfish_runner_settings(xml, 'Run')
            add_glassfish_configuration_wrapper(xml, 'Run')

            xml.method do |method|
              method.option(:name => 'BuildArtifacts', :enabled => 'true') do |option|
                option.artifact(:name => artifact_name)
              end
            end
          end
        end
      end

      def add_glassfish_remote_configuration(project, options = {})
        artifact_name = options[:name] || project.iml.id
        version = options[:version] || '4.1.0'
        server_name = options[:server_name] || "GlassFish #{version}"
        configuration_name = options[:configuration_name] || "Remote #{server_name}"
        domain_port = options[:port] || '9009'
        packaged = options[:packaged] || {}
        exploded = options[:exploded] || []

        add_to_composite_component(self.configurations) do |xml|
          xml.configuration(:name => configuration_name, :type => 'GlassfishConfiguration', :factoryName => 'Remote', :default => false, :APPLICATION_SERVER_NAME => server_name) do |xml|
            xml.option(:name => 'LOCAL', :value => 'false')
            xml.option(:name => 'OPEN_IN_BROWSER', :value => 'false')
            xml.option(:name => 'UPDATING_POLICY', :value => 'hot-swap-classes')

            xml.deployment do |deployment|
              packaged.each do |name, deployable|
                artifact = Buildr.artifact(deployable)
                artifact.invoke
                deployment.file(:path => resolve_path(artifact.to_s)) do |file|
                  file.settings do |settings|
                    settings.option(:name => 'contextRoot', :value => "/#{name}")
                    settings.option(:name => 'defaultContextRoot', :value => 'false')
                  end
                end
              end
              exploded.each do |deployable_name|
                deployment.artifact(:name => deployable_name) do |artifact|
                  artifact.settings
                end
              end
            end

            xml.tag! 'server-settings' do |server_settings|
              server_settings.option(:name => 'VIRTUAL_SERVER')
              server_settings.data do |data|
                data.option(:name => 'adminServerHost', :value => '')
                data.option(:name => 'clusterName', :value => '')
                data.option(:name => 'stagingRemotePath', :value => '')
                data.option(:name => 'transportHostId')
                data.option(:name => 'transportStagingTarget') do |option|
                  option.TransportTarget do |tt|
                    tt.option(:name => 'id', :value => 'X')
                  end
                end
              end
            end

            xml.predefined_log_file(:id => 'GlassFish', :enabled => 'true')

            add_glassfish_runner_settings(xml, 'Debug', {
                                               :DEBUG_PORT => domain_port.to_s,
                                               :TRANSPORT => '0',
                                               :LOCAL => 'false',
                                             })
            add_glassfish_configuration_wrapper(xml, 'Debug')

            add_glassfish_runner_settings(xml, 'Run')
            add_glassfish_configuration_wrapper(xml, 'Run')

            xml.method do |method|
              method.option(:name => 'BuildArtifacts', :enabled => 'true') do |option|
                option.artifact(:name => artifact_name)
              end
            end
          end
        end
      end

      def add_default_testng_configuration(options = {})
        jvm_args = options[:jvm_args] || '-ea'
        dir = options[:dir] || '$PROJECT_DIR$'

        add_default_configuration('TestNG', 'TestNG') do |xml|
          xml.extension(:name => 'coverage', :enabled => 'false', :merge => 'false', :sample_coverage => 'true', :runner => 'idea')
          xml.module(:name => '')
          xml.option(:name => 'ALTERNATIVE_JRE_PATH_ENABLED', :value => 'false')
          xml.option(:name => 'ALTERNATIVE_JRE_PATH')
          xml.option(:name => 'SUITE_NAME')
          xml.option(:name => 'PACKAGE_NAME')
          xml.option(:name => 'MAIN_CLASS_NAME')
          xml.option(:name => 'METHOD_NAME')
          xml.option(:name => 'GROUP_NAME')
          xml.option(:name => 'TEST_OBJECT', :value => 'CLASS')
          xml.option(:name => 'VM_PARAMETERS', :value => jvm_args)
          xml.option(:name => 'PARAMETERS')
          xml.option(:name => 'WORKING_DIRECTORY', :value => dir)
          xml.option(:name => 'OUTPUT_DIRECTORY')
          xml.option(:name => 'ANNOTATION_TYPE')
          xml.option(:name => 'ENV_VARIABLES')
          xml.option(:name => 'PASS_PARENT_ENVS', :value => 'true')
          xml.option(:name => 'TEST_SEARCH_SCOPE') do |opt|
            opt.value(:defaultName => 'moduleWithDependencies')
          end
          xml.option(:name => 'USE_DEFAULT_REPORTERS', :value => 'false')
          xml.option(:name => 'PROPERTIES_FILE')
          xml.envs
          xml.properties
          xml.listeners
          xml.method
        end
      end

      protected

      def add_glassfish_runner_settings(xml, name, options = {})
        xml.RunnerSettings(:RunnerId => name.to_s) do |runner_settings|
          options.each do |key, value|
            runner_settings.option(:name => key.to_s, :value => value.to_s)
          end
        end
      end

      def add_glassfish_configuration_wrapper(xml, name)
        xml.ConfigurationWrapper(:VM_VAR => 'JAVA_OPTS', :RunnerId => name.to_s) do |configuration_wrapper|
          configuration_wrapper.option(:name => 'USE_ENV_VARIABLES', :value => 'true')
          configuration_wrapper.STARTUP do |startup|
            startup.option(:name => 'USE_DEFAULT', :value => 'true')
            startup.option(:name => 'SCRIPT', :value => '')
            startup.option(:name => 'VM_PARAMETERS', :value => '')
            startup.option(:name => 'PROGRAM_PARAMETERS', :value => '')
          end
          configuration_wrapper.SHUTDOWN do |shutdown|
            shutdown.option(:name => 'USE_DEFAULT', :value => 'true')
            shutdown.option(:name => 'SCRIPT', :value => '')
            shutdown.option(:name => 'VM_PARAMETERS', :value => '')
            shutdown.option(:name => 'PROGRAM_PARAMETERS', :value => '')
          end
        end
      end

      def artifact_content(xml, project, projects, options)
        emit_module_output(xml, projects)
        emit_jpa_descriptors(xml, project, options)
        emit_ejb_descriptors(xml, project, options)
      end

      def extension
        'ipr'
      end

      def base_document
        target = StringIO.new
        Builder::XmlMarkup.new(:target => target).project(:version => '4')
        Buildr::IntellijIdea.new_document(target.string)
      end

      def default_components
        [
          lambda { modules_component },
          vcs_component,
          artifacts_component,
          lambda { data_sources_component },
          configurations_component,
          lambda { framework_detection_exclusion_component }
        ]
      end

      def framework_detection_exclusion_component
        create_component('FrameworkDetectionExcludesConfiguration') do |xml|
          xml.file :url => file_path(buildr_project._(:artifacts))
        end
      end

      def initial_components
        [
          lambda { project_root_manager_component },
          lambda { project_details_component }
        ]
      end

      def project_root_manager_component
        attribs = {}
        attribs['version'] = '2'
        attribs['languageLevel'] = "JDK_#{self.jdk_version.gsub('.', '_')}"
        attribs['assert-keyword'] = 'true'
        attribs['jdk-15'] = (jdk_version >= '1.5').to_s
        attribs['project-jdk-name'] = self.jdk_version
        attribs['project-jdk-type'] = 'JavaSDK'
        create_component('ProjectRootManager', attribs) do |xml|
          xml.output('url' => file_path(buildr_project._(:target, :idea, :project_out)))
        end
      end

      def project_details_component
        create_component('ProjectDetails') do |xml|
          xml.option('name' => 'projectName', 'value' => self.name)
        end
      end

      def modules_component
        create_component('ProjectModuleManager') do |xml|
          xml.modules do
            buildr_project.projects.select { |subp| subp.iml? }.each do |subproject|
              module_path = subproject.base_dir.gsub(/^#{buildr_project.base_dir}\//, '')
              path = "#{module_path}/#{subproject.iml.name}.iml"
              attribs = {:fileurl => "file://$PROJECT_DIR$/#{path}", :filepath => "$PROJECT_DIR$/#{path}"}
              if subproject.iml.group == true
                attribs[:group] = subproject.parent.name.gsub(':', '/')
              elsif !subproject.iml.group.nil?
                attribs[:group] = subproject.iml.group.to_s
              end
              xml.module attribs
            end
            self.extra_modules.each do |iml_file|
              xml.module :fileurl => "file://$PROJECT_DIR$/#{iml_file}",
                         :filepath => "$PROJECT_DIR$/#{iml_file}"
            end
            if buildr_project.iml?
              xml.module :fileurl => "file://$PROJECT_DIR$/#{buildr_project.iml.name}.iml",
                         :filepath => "$PROJECT_DIR$/#{buildr_project.iml.name}.iml"
            end
          end
        end
      end

      def vcs_component
        project_directories = buildr_project.projects.select { |p| p.iml? }.collect { |p| p.base_dir }
        project_directories << buildr_project.base_dir
        # Guess the iml file is in the same dir as base dir
        project_directories += self.extra_modules.collect { |p| File.dirname(p) }

        project_directories = project_directories.sort.uniq

        mappings = {}

        project_directories.each do |dir|
          if File.directory?("#{dir}/.git")
            mappings[dir] = 'Git'
          elsif File.directory?("#{dir}/.svn")
            mappings[dir] = 'svn'
          end
        end

        return nil if 0 == mappings.size

        create_component('VcsDirectoryMappings') do |xml|
          mappings.each_pair do |dir, vcs_type|
            resolved_dir = resolve_path(dir)
            mapped_dir = resolved_dir == '$PROJECT_DIR$/.' ? buildr_project.base_dir : resolved_dir
            xml.mapping :directory => mapped_dir, :vcs => vcs_type
          end
        end
      end

      def data_sources_component
        create_composite_component('DataSourceManagerImpl', {:format => 'xml', :hash => '3208837817'}, self.data_sources)
      end

      def artifacts_component
        create_composite_component('ArtifactManager', {}, self.artifacts)
      end

      def configurations_component
        create_composite_component('ProjectRunConfigurationManager', {}, self.configurations)
      end

      def resolve_path(path)
        resolve_path_from_base(path, '$PROJECT_DIR$')
      end

    private

      def to_artifact_name(project, options)
        options[:name] || project.iml.id
      end

      def build_on_make(options)
        options[:build_on_make].nil? ? false : options[:build_on_make]
      end

      def emit_jar_artifacts(xml, artifacts)
        artifacts.each do |p|
          xml.element :id => 'artifact', 'artifact-name' => "#{p}.jar"
        end
      end

      def emit_libraries(xml, libraries)
        libraries.each(&:invoke).map(&:to_s).each do |dependency_path|
          xml.element :id => 'file-copy', :path => resolve_path(dependency_path)
        end
      end

      def emit_module_output(xml, projects)
        projects.each do |p|
          xml.element :id => 'module-output', :name => p.iml.name
        end
      end

      def emit_output_path(xml, artifact_name, options)
        ## The content here can not be indented
        output_dir = options[:output_dir] || buildr_project._(:artifacts, artifact_name)
        xml.tag!('output-path', resolve_path(output_dir))
      end

      def emit_ejb_descriptors(xml, project, options)
        if options[:enable_ejb] || (options[:ejb_module_names] && options[:ejb_module_names].size > 0)
          module_names = options[:ejb_module_names] || [project.iml.name]
          module_names.each do |module_name|
            facet_name = options[:ejb_facet_name] || 'EJB'
            xml.element :id => 'javaee-facet-resources', :facet => "#{module_name}/ejb/#{facet_name}"
          end
        end
      end

      def emit_jpa_descriptors(xml, project, options)
        if options[:enable_jpa] || (options[:jpa_module_names] && options[:jpa_module_names].size > 0)
          module_names = options[:jpa_module_names] || [project.iml.name]
          module_names.each do |module_name|
            facet_name = options[:jpa_facet_name] || 'JPA'
            xml.element :id => 'jpa-descriptors', :facet => "#{module_name}/jpa/#{facet_name}"
          end
        end
      end

      def encrypt(password)
        password.bytes.inject('') { |x, y| x + (y ^ 0xdfaa).to_s(16) }
      end

      def partition_dependencies(dependencies)
        libraries = []
        projects = []

        dependencies.each do |dependency|
          artifacts = Buildr.artifacts(dependency)
          artifacts_as_strings = artifacts.map(&:to_s)
          all_projects = Buildr::Project.instance_variable_get('@projects').keys
          project = Buildr.projects(all_projects).detect do |project|
            [project.packages, project.compile.target, project.resources.target, project.test.compile.target, project.test.resources.target].flatten.
              detect { |component| artifacts_as_strings.include?(component.to_s) }
          end
          if project
            projects << project
          else
            libraries += artifacts
          end
        end
        return libraries.uniq, projects.uniq
      end
    end

    module ProjectExtension
      include Extension

      first_time do
        desc 'Generate Intellij IDEA artifacts for all projects'
        Project.local_task 'idea' => 'artifacts'

        desc 'Delete the generated Intellij IDEA artifacts'
        Project.local_task 'idea:clean'
      end

      before_define do |project|
        project.recursive_task('idea')
        project.recursive_task('idea:clean')
      end

      after_define do |project|
        idea = project.task('idea')

        files = [
          (project.iml if project.iml?),
          (project.ipr if project.ipr?)
        ].compact

        files.each do |ideafile|
          module_dir =  File.dirname(ideafile.filename)
          idea.enhance do |task|
            mkdir_p module_dir
            info "Writing #{ideafile.filename}"
            t = Tempfile.open('buildr-idea')
            temp_filename = t.path
            t.close!
            File.open(temp_filename, 'w') do |f|
              ideafile.write f
            end
            mv temp_filename, ideafile.filename
          end
          if project.ipr?
            filename = project._("#{project.ipr.name}.ids")
            rm_rf filename if File.exists?(filename)
          end
        end

        project.task('idea:clean') do
          files.each do |f|
            info "Removing #{f.filename}" if File.exist?(f.filename)
            rm_rf f.filename
          end
        end
      end

      def ipr
        if ipr?
          @ipr ||= IdeaProject.new(self)
        else
          raise 'Only the root project has an IPR'
        end
      end

      def ipr?
        !@no_ipr && self.parent.nil?
      end

      def iml
        if iml?
          unless @iml
            inheritable_iml_source = self.parent
            while inheritable_iml_source && !inheritable_iml_source.iml?
              inheritable_iml_source = inheritable_iml_source.parent;
            end
            @iml = inheritable_iml_source ? inheritable_iml_source.iml.clone : IdeaModule.new
            @iml.buildr_project = self
          end
          return @iml
        else
          raise "IML generation is disabled for #{self.name}"
        end
      end

      def no_ipr
        @no_ipr = true
      end

      def no_iml
        @has_iml = false
      end

      def iml?
        @has_iml = @has_iml.nil? ? true : @has_iml
      end
    end
  end
end

class Buildr::Project
  include Buildr::IntellijIdea::ProjectExtension
end
