/* * 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 * * 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.apache.tools.ant.util; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.apache.tools.ant.types.Mapper; /** * A FileNameMapper that contains * other FileNameMappers. * @see FileNameMapper */ public abstract class ContainerMapper implements FileNameMapper { private List mappers = new ArrayList(); /** * Add a Mapper. * @param mapper the Mapper to add. */ public void addConfiguredMapper(Mapper mapper) { add(mapper.getImplementation()); } /** * An add configured version of the add method. * This class used to contain an add method and an * addConfiguredMapper method. Dur to ordering, * the add method was always called first. This * addConfigured method has been added to allow * chaining to work correctly. * @param fileNameMapper a FileNameMapper. */ public void addConfigured(FileNameMapper fileNameMapper) { add(fileNameMapper); } /** * Add a FileNameMapper. * @param fileNameMapper a FileNameMapper. * @throws IllegalArgumentException if attempting to add this * ContainerMapper to itself, or if the specified * FileNameMapper is itself a ContainerMapper * that contains this ContainerMapper. */ public synchronized void add(FileNameMapper fileNameMapper) { if (this == fileNameMapper || (fileNameMapper instanceof ContainerMapper && ((ContainerMapper) fileNameMapper).contains(this))) { throw new IllegalArgumentException( "Circular mapper containment condition detected"); } else { mappers.add(fileNameMapper); } } /** * Return true if this ContainerMapper or any of * its sub-elements contains the specified FileNameMapper. * @param fileNameMapper the FileNameMapper to search for. * @return boolean. */ protected synchronized boolean contains(FileNameMapper fileNameMapper) { boolean foundit = false; for (Iterator iter = mappers.iterator(); iter.hasNext() && !foundit;) { FileNameMapper next = (FileNameMapper) (iter.next()); foundit = (next == fileNameMapper || (next instanceof ContainerMapper && ((ContainerMapper) next).contains(fileNameMapper))); } return foundit; } /** * Get the List of FileNameMappers. * @return List. */ public synchronized List getMappers() { return Collections.unmodifiableList(mappers); } /** * Empty implementation. * @param ignore ignored. */ public void setFrom(String ignore) { //Empty } /** * Empty implementation. * @param ignore ignored. */ public void setTo(String ignore) { //Empty } }