blob: c6b167f339256a84fa9f7e46b3a72899701f4991 [file] [log] [blame]
/*
* 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.tools.ant.types.resources;
import org.apache.tools.ant.types.Reference;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.util.FileNameMapper;
/**
* A decorator around a different resource that uses a mapper to
* dynamically remap the resource's name.
*
* <p>Strips the FileProvider interface from decorated resources since
* it may be used to circumvent name mapping.</p>
*
* @since Ant 1.8.0
*/
public class MappedResource extends ResourceDecorator {
private final FileNameMapper mapper;
/**
* Wraps an existing resource.
* @param r Resource to wrap
* @param m FileNameMapper that handles mapping
*/
public MappedResource(Resource r, FileNameMapper m) {
super(r);
mapper = m;
}
/**
* Maps the name.
*/
@Override
public String getName() {
String name = getResource().getName();
if (isReference()) {
return name;
}
String[] mapped = mapper.mapFileName(name);
return mapped != null && mapped.length > 0 ? mapped[0] : null;
}
/**
* Not really supported since mapper is never null.
* @param r reference to set
*/
@Override
public void setRefid(Reference r) {
if (mapper != null) {
throw noChildrenAllowed();
}
super.setRefid(r);
}
/**
* Suppress FileProvider
* @param clazz the type to implement
*/
@Override
public <T> T as(Class<T> clazz) {
return FileProvider.class.isAssignableFrom(clazz)
? null : getResource().as(clazz);
}
/**
* Get the hash code for this Resource.
* @since Ant 1.8.1
*/
@Override
public int hashCode() {
String n = getName();
return n == null ? super.hashCode() : n.hashCode();
}
/**
* Equality check based on the resource's name in addition to the
* resource itself.
* @since Ant 1.8.1
*/
@Override
public boolean equals(Object other) {
if (other == null || other.getClass() != getClass()) {
return false;
}
MappedResource m = (MappedResource) other;
String myName = getName();
String otherName = m.getName();
return (myName == null ? otherName == null : myName.equals(otherName))
&& getResource().equals(m.getResource());
}
@Override
public String toString() {
if (isReference()) {
return getRef().toString();
}
return getName();
}
}