/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You 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
 *
 *      https://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.apache.ivy.ant;

import org.apache.ivy.core.retrieve.FileNameMapper;
import org.apache.tools.ant.types.Mapper;

class MapperAdapter implements FileNameMapper {

    private static final String[] EMPTY = new String[0];

    private Mapper mapper;

    MapperAdapter(Mapper mapper) {
        this.mapper = mapper;
    }

    public String[] mapFileName(String fileName) {
        String[] result = mapper.getImplementation().mapFileName(fileName);
        if (result == null) {
            result = EMPTY;
        }

        return result;
    }

}
