/*
 * 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
allprojects {
  apply plugin: 'idea'
  apply plugin: 'eclipse'
}

subprojects {
  eclipse {
    classpath {
      defaultOutputDir = file('build-eclipse')
      downloadSources = true
      plusConfigurations += [ configurations.provided ]
      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')
            }

            //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
            }
        }
      }
    }
    project {
      name = sanitizedName()
    }
    // 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 << {
      File f = file('.settings/org.eclipse.core.resources.prefs')
      f.write('eclipse.preferences.version=1\n')
      f.append('encoding/<project>=utf-8')
    }
  }

  cleanEclipse << {
    delete '.settings/org.eclipse.core.resources.prefs'
  }
  
  tasks.eclipse.dependsOn(cleanEclipse)
  
  idea {
    module {
      downloadSources = true
      scopes.PROVIDED.plus += [ configurations.provided ]
    }
  }
}
  
