/*
 * Copyright (C) 2012 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.
 */

package com.android.build.gradle.internal.dsl

import com.android.builder.DexOptions
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional

public class DexOptionsImpl implements DexOptions {

    @Input
    private boolean coreLibraryFlag

    @Input
    private boolean isIncrementalFlag = true

    @Input
    @Optional
    private String javaMaxHeapSize

    public void setCoreLibrary(boolean coreLibrary) {
        coreLibraryFlag = coreLibrary
    }

    @Override
    boolean isCoreLibrary() {
        return coreLibraryFlag
    }

    public void setIncremental(boolean isIncremental) {
        isIncrementalFlag = isIncremental
    }

    @Override
    boolean getIncremental() {
        return isIncrementalFlag
    }

    public void setJavaMaxHeapSize(String theJavaMaxHeapSize) {
        if (theJavaMaxHeapSize.matches("\\d+[kKmMgGtT]?")) {
            javaMaxHeapSize = theJavaMaxHeapSize
        } else {
            throw new IllegalArgumentException(
                    "Invalid max heap size DexOption. See `man java` for valid -Xmx arguments.")
        }
    }

    @Override
    public String getJavaMaxHeapSize() {
        return javaMaxHeapSize
    }
}
