/*
 * 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.
 */
import org.gradle.plugins.ide.eclipse.model.Container

apply plugin: 'idea'
apply plugin: 'eclipse'

eclipse {
  classpath {
    defaultOutputDir = file('build-eclipse')
    downloadSources = true
    file {
      whenMerged { classpath ->
        // Remove the gradle output directories from the eclipse classpath.
        // Unfortunately, using minusConfigurations does not work here, because
        // it removes the entire geode-core project.
        classpath.entries.removeAll { entry ->
          (entry.path.contains('geode-core/build') ||
            entry.path.contains('geode-web/build') ||
            entry.path.contains('geode-assembly/build') ||
            entry.path.contains('geode-dependencies.jar')) &&
            !entry.path.contains('generated-resources') &&
            !entry.path.contains('generated-src')
        }

        //By default, gradle adds the java 1.8 *execution environment*, which has access restrictions on
        //things like Unsafe. Change it to a direct dependency on the workspace JDK
        classpath.entries = classpath.entries.collect { entry ->
          entry.path.contains('org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE') ?
            new Container('org.eclipse.jdt.launching.JRE_CONTAINER') :
            entry
        }
      }
    }
  }
  // Several files have UTF-8 encoding and Eclipse running on Windows
  // will have trouble unless we tell it to use UTF-8 encoding.
  // This setting needs to go into the core.resources.prefs file,
  // which the JDT script isn't set up to configure
  eclipseJdt {
    doLast {
      File f = file('.settings/org.eclipse.core.resources.prefs')
      f.write('eclipse.preferences.version=1\n')
      f.append('encoding/<project>=utf-8')
    }
  }
}

cleanEclipse {
  doLast {
    delete '.settings/org.eclipse.core.resources.prefs'
  }
}

tasks.eclipse.dependsOn(cleanEclipse)

idea {
  module {
    inheritOutputDirs = true
    downloadSources = true
  }
}
