/*
 * 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.ant;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.taskdefs.Property;

/**
 * Task to do simple char to char replacement on strings.
 */
public class PropertyByReplaceTask extends Property {

    private String mInput;
    private char mInputChar;
    private char mWithChar;

    public void setInput(String input) {
        mInput = input;
    }

    public void setReplace(char inputChar) {
        mInputChar = inputChar;
    }

    public void setWith(char withChar) {
        mWithChar = withChar;
    }

    @Override
    public void execute() throws BuildException {
        setValue(mInput.replace(mInputChar, mWithChar));
        super.execute();
    }
}
