/*
 * Copyright 2003-2009 the original author or authors.
 *
 * 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 org.eclipse.ajdt.core.ant;

import org.apache.tools.ant.util.FileNameMapper;

/**
 * 
 * @author Andrew Eisenberg
 * @created Apr 15, 2010
 */
public class AJFileNameMapper implements FileNameMapper {

    public String[] mapFileName(String sourceFileName) {
        if (sourceFileName != null) {
            if (sourceFileName.endsWith(".aj")) {
                return new String[] {
                        extractVariablePart(sourceFileName, ".aj".length())
                        + ".class" };
            }
        }
        return null;
    }
    
    private String extractVariablePart(String name, int postfixLength) {
        return name.substring(0,
                name.length() - postfixLength);
    }


    public void setFrom(String from) {
        // noop
    }

    public void setTo(String to) {
        // noop
    }

}
