/**
 * Copyright 2007 Google Inc.
 *
 * 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.tonicsystems.jarjar;

import com.tonicsystems.jarjar.util.*;
import java.io.File;
import java.io.IOException;
import java.util.*;
import org.apache.tools.ant.BuildException;

public class JarJarTask extends AntJarProcessor
{
    private List<PatternElement> patterns = new ArrayList<PatternElement>();

    public void addConfiguredRule(Rule rule) {
        if (rule.getPattern() == null || rule.getResult() == null)
            throw new IllegalArgumentException("The <rule> element requires both \"pattern\" and \"result\" attributes.");
        patterns.add(rule);
    }

    public void addConfiguredZap(Zap zap) {
        if (zap.getPattern() == null)
            throw new IllegalArgumentException("The <zap> element requires a \"pattern\" attribute.");
        patterns.add(zap);
    }

    public void addConfiguredKeep(Keep keep) {
        if (keep.getPattern() == null)
            throw new IllegalArgumentException("The <keep> element requires a \"pattern\" attribute.");
        patterns.add(keep);
    }

    public void execute() throws BuildException {
        MainProcessor proc = new MainProcessor(patterns, verbose, false);
        execute(proc);
        try {
            proc.strip(getDestFile());
        } catch (IOException e) {
            throw new BuildException(e);
        }
    }

    protected void cleanHelper() {
        super.cleanHelper();
        patterns.clear();
    }
}
