/*
 * 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.
 */

apply plugin: 'java-library'

description = 'Solr Server'

configurations {
  api {
    exclude group: "org.slf4j"
  }
  startJar
  libExt
  webapp
  packaging
}

dependencies {
  api('org.eclipse.jetty:jetty-alpn-java-server', {
    exclude group: "org.eclipse.jetty.alpn", module: "alpn-api"
  })

  api('io.dropwizard.metrics:metrics-core', {
    exclude group: "com.rabbitmq", module: "amqp-client"
  })
  api('io.dropwizard.metrics:metrics-graphite', {
    exclude group: "com.rabbitmq", module: "amqp-client"
  })
  api 'io.dropwizard.metrics:metrics-jetty9'
  api 'io.dropwizard.metrics:metrics-jvm'
  api 'io.dropwizard.metrics:metrics-jmx'

  api 'org.eclipse.jetty:jetty-continuation'
  api 'org.eclipse.jetty:jetty-deploy'
  api 'org.eclipse.jetty:jetty-http'
  api 'org.eclipse.jetty:jetty-io'
  api 'org.eclipse.jetty:jetty-jmx'
  api 'org.eclipse.jetty:jetty-rewrite'
  api 'org.eclipse.jetty:jetty-security'
  api 'org.eclipse.jetty:jetty-server'
  api 'org.eclipse.jetty:jetty-servlet'
  api 'org.eclipse.jetty:jetty-servlets'
  api 'org.eclipse.jetty:jetty-util'
  api 'org.eclipse.jetty:jetty-webapp'
  api 'org.eclipse.jetty:jetty-xml'
  api 'org.eclipse.jetty:jetty-alpn-server'

  api 'org.eclipse.jetty.http2:http2-server'
  api 'org.eclipse.jetty.http2:http2-common'
  api 'org.eclipse.jetty.http2:http2-hpack'

  api 'javax.servlet:javax.servlet-api'

  libExt 'com.lmax:disruptor'
  libExt 'org.slf4j:jcl-over-slf4j'
  libExt 'org.slf4j:jul-to-slf4j'
  libExt 'org.slf4j:slf4j-api'
  libExt 'org.apache.logging.log4j:log4j-1.2-api'
  libExt 'org.apache.logging.log4j:log4j-api'
  libExt 'org.apache.logging.log4j:log4j-core'
  libExt 'org.apache.logging.log4j:log4j-slf4j-impl'
  libExt 'org.apache.logging.log4j:log4j-web'

  webapp project(path: ":solr:webapp", configuration: "war")

  startJar('org.eclipse.jetty:jetty-start::shaded', {
    transitive false
  })
}

// Add the following non-standard configurations to JAR validation.
afterEvaluate {
  configurations {
    jarValidation.extendsFrom startJar
    jarValidation.extendsFrom libExt
  }
}

ext {
  packagingDir = file("${buildDir}/packaging")
}

task assemblePackaging(type: Sync) {
  from(projectDir, {
    include "contexts/**"
    include "etc/**"
    include "modules/**"
    include "resources/**"
    include "scripts/**"
    include "solr/**"
    include "README.md"
  })

  from(configurations.compileClasspath, {
    into "lib/"
  })

  from(configurations.libExt, {
    into "lib/ext"
  })

  from { project.configurations.startJar.singleFile } {
    rename { file -> 'start.jar' }
  }

  dependsOn configurations.webapp
  from( { zipTree(configurations.webapp.asPath) }, {
    into "solr-webapp/webapp"
  })

  into packagingDir
}

artifacts {
  packaging packagingDir, {
    builtBy assemblePackaging
  }
}

assemble.dependsOn assemblePackaging
