/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed 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'

configurations {
    micro
    nano
    lite
}

sourceSets {

    micro {
        java {
            srcDirs = ['javamicro/src/main/java/']
            include("com/google/protobuf/micro/*")
        }
    }

    lite {
        java {
            srcDirs = ['java/core/src/main/java/']
            include 'com/google/protobuf/AbstractMessageLite.java'
            include 'com/google/protobuf/AbstractParser.java'
            include 'com/google/protobuf/AbstractProtobufList.java'
            include 'com/google/protobuf/ByteOutput.java'
            include 'com/google/protobuf/ByteString.java'
            include 'com/google/protobuf/BooleanArrayList.java'
            include 'com/google/protobuf/CodedInputStream.java'
            include 'com/google/protobuf/CodedOutputStream.java'
            include 'com/google/protobuf/DoubleArrayList.java'
            include 'com/google/protobuf/ExperimentalApi.java'
            include 'com/google/protobuf/ExtensionLite.java'
            include 'com/google/protobuf/ExtensionRegistryLite.java'
            include 'com/google/protobuf/FieldSet.java'
            include 'com/google/protobuf/FloatArrayList.java'
            include 'com/google/protobuf/GeneratedMessageLite.java'
            include 'com/google/protobuf/IntArrayList.java'
            include 'com/google/protobuf/Internal.java'
            include 'com/google/protobuf/InvalidProtocolBufferException.java'
            include 'com/google/protobuf/LazyField.java'
            include 'com/google/protobuf/LazyFieldLite.java'
            include 'com/google/protobuf/LazyStringArrayList.java'
            include 'com/google/protobuf/LazyStringList.java'
            include 'com/google/protobuf/LongArrayList.java'
            include 'com/google/protobuf/MapFieldLite.java'
            include 'com/google/protobuf/MessageLite.java'
            include 'com/google/protobuf/MessageLiteToString.java'
            include 'com/google/protobuf/MessageLiteOrBuilder.java'
            include 'com/google/protobuf/MutabilityOracle.java'
            include 'com/google/protobuf/Parser.java'
            include 'com/google/protobuf/ProtobufArrayList.java'
            include 'com/google/protobuf/ProtocolStringList.java'
            include 'com/google/protobuf/RopeByteString.java'
            include 'com/google/protobuf/SmallSortedMap.java'
            include 'com/google/protobuf/TextFormatEscaper.java'
            include 'com/google/protobuf/UninitializedMessageException.java'
            include 'com/google/protobuf/UnknownFieldSetLite.java'
            include 'com/google/protobuf/UnmodifiableLazyStringList.java'
            include 'com/google/protobuf/Utf8.java'
            include 'com/google/protobuf/WireFormat.java'
        }
    }

    nano {
        java {
            srcDirs = [
                    'javanano/src/main/java/',
                    'javanano/src/device/main/java/'
            ]
            include("com/google/protobuf/nano/**")
        }
    }
}

if (project == rootProject) {
    ext.getAndroidPrebuilt = { apiLevel ->
        files("$rootDir/../../prebuilts/sdk/$apiLevel/android.jar")
    }
}

dependencies {
    compile getAndroidPrebuilt('8')
    nanoCompile getAndroidPrebuilt('8')
}

jar {
    from sourceSets.nano.output, sourceSets.micro.output
    baseName "libprotobuf"
    appendix "java"
    version "3.0"
    classifier "micronano"
}

task nanoJar(type: Jar) {
    from sourceSets.nano.output
    dependsOn nanoClasses
    baseName "libprotobuf"
    appendix "java"
    version "3.0"
    classifier "nano"
}

task microJar(type: Jar) {
    from sourceSets.micro.output
    dependsOn microClasses
    baseName "libprotobuf"
    appendix "java"
    version "3.0"
    classifier "micro"
}

task liteJar(type: Jar) {
    from sourceSets.lite.output
    dependsOn liteClasses
    baseName "libprotobuf"
    appendix "java"
    version "3.0"
    classifier "lite"
}

artifacts {
    micro microJar
    nano nanoJar
    lite liteJar
}

