buildscript {
  repositories {
    mavenLocal()
    jcenter()
    mavenCentral()
  }
}

apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'signing'

group = 'net.named-data.jndn-extra'
version = '0.0.3'
sourceCompatibility = JavaVersion.VERSION_1_8

repositories {
  jcenter()
  mavenCentral()
}

dependencies {
  compile 'com.google.guava:guava:29.0-android'
  testCompile 'junit:junit:4.12'
}

task javadocJar(type: Jar) {
  classifier = 'javadoc'
  from javadoc
}

task sourcesJar(type: Jar) {
  classifier = 'sources'
  from sourceSets.main.allSource
}

artifacts {
  archives javadocJar, sourcesJar
}

signing {
  required { gradle.taskGraph.hasTask("uploadArchives") }
  sign configurations.archives
}

uploadArchives {
  repositories {
    mavenDeployer {
      beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

      repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
        try {
          authentication(userName: ossrhUsername, password: ossrhPassword)
        }
        catch (Exception e) {
        }
      }

      snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") {
        try {
          authentication(userName: ossrhUsername, password: ossrhPassword)
        }
        catch (Exception e) {
        }
      }

      pom.project {
        name 'jndn-xx utilities'
        packaging 'jar'
        description 'A set of utility components useful for Named Data Networking (NDN) applications'
        url 'https://github.com/cawka/jndn-xx-util'

        scm {
          connection 'scm:git:https://github.com/cawka/jndn-xx-util'
          developerConnection 'scm:git:https://github.com/cawka/jndn-xx-util'
          url 'https://github.com/cawka/jndn-xx-util'
        }

        licenses {
          license {
            name 'GNU Lesser General Public License, Version 3.0+'
            url 'http://www.gnu.org/licenses/lgpl.html'
          }
        }

        developers {
          developer {
            id 'cawka'
            name 'Alexander Afanasyev'
            email 'alexander.afanasyev@ucla.edu'
          }
        }
      }
    }
  }
}
