/*
 * Copyright (C) 2009 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.ant;

import com.android.xml.AndroidXPathFactory;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.Path;
import org.xml.sax.InputSource;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathExpressionException;

/**
 * Android specific XPath task.
 * The goal is to get the result of an XPath expression on Android XML files. The android namespace
 * (http://schemas.android.com/apk/res/android) must be associated to the "android" prefix.
 */
public class XPathTask extends Task {

    private Path mManifestFile;
    private String mProperty;
    private String mExpression;
    private String mDefault;

    public void setInput(Path manifestFile) {
        mManifestFile = manifestFile;
    }

    public void setOutput(String property) {
        mProperty = property;
    }

    public void setExpression(String expression) {
        mExpression = expression;
    }

    public void setDefault(String defaultValue) {
        mDefault = defaultValue;
    }

    @Override
    public void execute() throws BuildException {
        try {
            if (mManifestFile == null || mManifestFile.list().length == 0) {
                throw new BuildException("input attribute is missing!");
            }

            if (mProperty == null) {
                throw new BuildException("output attribute is missing!");
            }

            if (mExpression == null) {
                throw new BuildException("expression attribute is missing!");
            }

            XPath xpath = AndroidXPathFactory.newXPath();

            String file = mManifestFile.list()[0];
            String result = xpath.evaluate(mExpression, new InputSource(new FileInputStream(file)));
            if (result.length() == 0 && mDefault != null) {
                result = mDefault;
            }

            getProject().setProperty(mProperty, result);
        } catch (XPathExpressionException e) {
            throw new BuildException(e);
        } catch (FileNotFoundException e) {
            throw new BuildException(e);
        }
    }
}
