/*
 * Licensed to Elasticsearch under one or more contributor
 * license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright
 * ownership. Elasticsearch 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 com.carrotsearch.gradle.junit4.RandomizedTestingTask
import org.elasticsearch.gradle.BuildPlugin

apply plugin: 'elasticsearch.build'
apply plugin: 'com.bmuschko.nexus'
apply plugin: 'nebula.optional-base'

archivesBaseName = 'elasticsearch'

dependencies {

  // lucene
  compile "org.apache.lucene:lucene-core:${versions.lucene}"
  compile "org.apache.lucene:lucene-analyzers-common:${versions.lucene}"
  compile "org.apache.lucene:lucene-backward-codecs:${versions.lucene}"
  compile "org.apache.lucene:lucene-grouping:${versions.lucene}"
  compile "org.apache.lucene:lucene-highlighter:${versions.lucene}"
  compile "org.apache.lucene:lucene-join:${versions.lucene}"
  compile "org.apache.lucene:lucene-memory:${versions.lucene}"
  compile "org.apache.lucene:lucene-misc:${versions.lucene}"
  compile "org.apache.lucene:lucene-queries:${versions.lucene}"
  compile "org.apache.lucene:lucene-queryparser:${versions.lucene}"
  compile "org.apache.lucene:lucene-sandbox:${versions.lucene}"
  compile "org.apache.lucene:lucene-spatial:${versions.lucene}"
  compile "org.apache.lucene:lucene-spatial3d:${versions.lucene}"
  compile "org.apache.lucene:lucene-suggest:${versions.lucene}"

  compile 'org.elasticsearch:securesm:1.0'

  // utilities
  compile 'commons-cli:commons-cli:1.3.1'
  compile 'com.carrotsearch:hppc:0.7.1'

  // time handling, remove with java 8 time
  compile 'joda-time:joda-time:2.8.2'
  // joda 2.0 moved to using volatile fields for datetime
  // When updating to a new version, make sure to update our copy of BaseDateTime
  compile 'org.joda:joda-convert:1.2'

  // json and yaml
  compile "com.fasterxml.jackson.core:jackson-core:${versions.jackson}"
  compile "com.fasterxml.jackson.dataformat:jackson-dataformat-smile:${versions.jackson}"
  compile "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:${versions.jackson}"
  compile "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:${versions.jackson}"

  // network stack
  compile 'io.netty:netty:3.10.5.Final'
  // percentiles aggregation
  compile 'com.tdunning:t-digest:3.0'
  // precentil ranks aggregation
  compile 'org.hdrhistogram:HdrHistogram:2.1.6'

  // lucene spatial
  compile "com.spatial4j:spatial4j:${versions.spatial4j}", optional
  compile "com.vividsolutions:jts:${versions.jts}", optional

  // logging
  compile "log4j:log4j:${versions.log4j}", optional
  compile "log4j:apache-log4j-extras:${versions.log4j}", optional

  compile "net.java.dev.jna:jna:${versions.jna}", optional

  if (isEclipse == false || project.path == ":core-tests") {
    testCompile("org.elasticsearch.test:framework:${version}") {
      // tests use the locally compiled version of core
      exclude group: 'org.elasticsearch', module: 'elasticsearch'
    }
  }
}

if (isEclipse) {
  // in eclipse the project is under a fake root, we need to change around the source sets
  sourceSets {
    if (project.path == ":core") {
      main.java.srcDirs = ['java']
      main.resources.srcDirs = ['resources']
    } else {
      test.java.srcDirs = ['java']
      test.resources.srcDirs = ['resources']
    }
  }
}

compileJava.options.compilerArgs << "-Xlint:-cast,-deprecation,-rawtypes,-try,-unchecked"
compileTestJava.options.compilerArgs << "-Xlint:-cast,-deprecation,-rawtypes,-try,-unchecked"

forbiddenPatterns {
  exclude '**/*.json'
  exclude '**/*.jmx'
  exclude '**/org/elasticsearch/cluster/routing/shard_routes.txt'
}

thirdPartyAudit.excludes = [
  // uses internal java api: sun.security.x509 (X509CertInfo, X509CertImpl, X500Name)
  'org.jboss.netty.handler.ssl.util.OpenJdkSelfSignedCertGenerator',

  // classes are missing!

  // from com.fasterxml.jackson.dataformat.yaml.YAMLMapper (jackson-dataformat-yaml)
  'com.fasterxml.jackson.databind.ObjectMapper', 

  // from org.jboss.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder (netty)
  'com.google.protobuf.CodedInputStream', 

  // from org.jboss.netty.handler.codec.protobuf.ProtobufVarint32LengthFieldPrepender (netty)
  'com.google.protobuf.CodedOutputStream', 

  // from org.jboss.netty.handler.codec.protobuf.ProtobufDecoder (netty)
  'com.google.protobuf.ExtensionRegistry', 
  'com.google.protobuf.MessageLite$Builder', 
  'com.google.protobuf.MessageLite', 
  'com.google.protobuf.Parser', 

  // from org.apache.log4j.receivers.net.JMSReceiver (log4j-extras)
  'javax.jms.Message', 
  'javax.jms.MessageListener', 
  'javax.jms.ObjectMessage', 
  'javax.jms.TopicConnection', 
  'javax.jms.TopicConnectionFactory', 
  'javax.jms.TopicPublisher', 
  'javax.jms.TopicSession', 
  'javax.jms.TopicSubscriber', 

   // from org.apache.log4j.net.SMTPAppender (log4j)
  'javax.mail.Authenticator', 
  'javax.mail.Message$RecipientType', 
  'javax.mail.Message', 
  'javax.mail.Multipart', 
  'javax.mail.PasswordAuthentication', 
  'javax.mail.Session', 
  'javax.mail.Transport', 
  'javax.mail.internet.InternetAddress', 
  'javax.mail.internet.InternetHeaders', 
  'javax.mail.internet.MimeBodyPart', 
  'javax.mail.internet.MimeMessage', 
  'javax.mail.internet.MimeMultipart', 
  'javax.mail.internet.MimeUtility', 

  // from org.jboss.netty.channel.socket.http.HttpTunnelingServlet (netty)
  'javax.servlet.ServletConfig', 
  'javax.servlet.ServletException', 
  'javax.servlet.ServletOutputStream', 
  'javax.servlet.http.HttpServlet', 
  'javax.servlet.http.HttpServletRequest', 
  'javax.servlet.http.HttpServletResponse', 

  // from org.jboss.netty.logging.CommonsLoggerFactory (netty)
  'org.apache.commons.logging.Log', 
  'org.apache.commons.logging.LogFactory',

  // from org.apache.lucene.sandbox.queries.regex.JakartaRegexpCapabilities$JakartaRegexMatcher (lucene-sandbox)
  'org.apache.regexp.CharacterIterator', 
  'org.apache.regexp.RE', 
  'org.apache.regexp.REProgram', 

  // from org.jboss.netty.handler.ssl.OpenSslEngine (netty)
  'org.apache.tomcat.jni.Buffer', 
  'org.apache.tomcat.jni.Library', 
  'org.apache.tomcat.jni.Pool', 
  'org.apache.tomcat.jni.SSL', 
  'org.apache.tomcat.jni.SSLContext', 
  
  // from org.jboss.netty.handler.ssl.util.BouncyCastleSelfSignedCertGenerator (netty)
  'org.bouncycastle.asn1.x500.X500Name', 
  'org.bouncycastle.cert.X509v3CertificateBuilder', 
  'org.bouncycastle.cert.jcajce.JcaX509CertificateConverter', 
  'org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder', 
  'org.bouncycastle.jce.provider.BouncyCastleProvider', 
  'org.bouncycastle.operator.jcajce.JcaContentSignerBuilder', 

  // from org.jboss.netty.handler.ssl.JettyNpnSslEngine (netty)
  'org.eclipse.jetty.npn.NextProtoNego$ClientProvider', 
  'org.eclipse.jetty.npn.NextProtoNego$ServerProvider', 
  'org.eclipse.jetty.npn.NextProtoNego', 

  // from org.jboss.netty.logging.JBossLoggerFactory (netty)
  'org.jboss.logging.Logger', 

  // from org.jboss.netty.handler.codec.marshalling.ChannelBufferByteInput (netty)
  'org.jboss.marshalling.ByteInput', 

  // from org.jboss.netty.handler.codec.marshalling.ChannelBufferByteOutput (netty)
  'org.jboss.marshalling.ByteOutput', 

  // from org.jboss.netty.handler.codec.marshalling.CompatibleMarshallingEncoder (netty)
  'org.jboss.marshalling.Marshaller', 

  // from org.jboss.netty.handler.codec.marshalling.ContextBoundUnmarshallerProvider (netty)
  'org.jboss.marshalling.MarshallerFactory', 
  'org.jboss.marshalling.MarshallingConfiguration', 
  'org.jboss.marshalling.Unmarshaller', 

  // from com.spatial4j.core.io.GeoJSONReader (spatial4j)
  'org.noggit.JSONParser', 

  // from org.jboss.netty.container.osgi.NettyBundleActivator (netty)
  'org.osgi.framework.BundleActivator', 
  'org.osgi.framework.BundleContext', 

  // from org.jboss.netty.logging.OsgiLoggerFactory$1 (netty)
  'org.osgi.framework.ServiceReference', 
  'org.osgi.service.log.LogService', 
  'org.osgi.util.tracker.ServiceTracker', 
  'org.osgi.util.tracker.ServiceTrackerCustomizer', 

  // from org.netty.util.internal.logging.InternalLoggerFactory (netty) - it's optional
  'org.slf4j.Logger',
  'org.slf4j.LoggerFactory',
]

// dependency license are currently checked in distribution
dependencyLicenses.enabled = false

if (isEclipse == false || project.path == ":core-tests") {
  task integTest(type: RandomizedTestingTask,
                 group: JavaBasePlugin.VERIFICATION_GROUP,
                 description: 'Multi-node tests',
                 dependsOn: test.dependsOn) {
    configure(BuildPlugin.commonTestConfig(project))
    classpath = project.test.classpath
    testClassesDir = project.test.testClassesDir
    include '**/*IT.class'
  }
  check.dependsOn integTest
  integTest.mustRunAfter test
}