| /* |
| * 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.selectors; |
| |
| import org.apache.tools.ant.AntTypeDefinition; |
| import org.apache.tools.ant.BuildException; |
| import org.apache.tools.ant.ComponentHelper; |
| import org.apache.tools.ant.Project; |
| import org.apache.tools.ant.ProjectHelper; |
| import org.apache.tools.ant.types.Resource; |
| |
| /** |
| * InstanceOf ResourceSelector. |
| * @since Ant 1.7 |
| */ |
| public class InstanceOf implements ResourceSelector { |
| private static final String ONE_ONLY = "Exactly one of class|type must be set."; |
| |
| private Project project; |
| private Class<?> clazz; |
| private String type; |
| private String uri; |
| |
| /** |
| * Set the Project instance for this InstanceOf selector. |
| * @param p the Project instance used for type comparisons. |
| */ |
| public void setProject(Project p) { |
| project = p; |
| } |
| |
| /** |
| * Set the class to compare against. |
| * @param c the class. |
| */ |
| public void setClass(Class<?> c) { |
| if (clazz != null) { |
| throw new BuildException("The class attribute has already been set."); |
| } |
| clazz = c; |
| } |
| |
| /** |
| * Set the Ant type to compare against. |
| * @param s the type name. |
| */ |
| public void setType(String s) { |
| type = s; |
| } |
| |
| /** |
| * Set the URI in which the Ant type, if specified, should be defined. |
| * @param u the URI. |
| */ |
| public void setURI(String u) { |
| uri = u; |
| } |
| |
| /** |
| * Get the comparison class. |
| * @return the Class object. |
| */ |
| public Class<?> getCheckClass() { |
| return clazz; |
| } |
| |
| /** |
| * Get the comparison type. |
| * @return the String typename. |
| */ |
| public String getType() { |
| return type; |
| } |
| |
| /** |
| * Get the type's URI. |
| * @return the String URI. |
| */ |
| public String getURI() { |
| return uri; |
| } |
| |
| /** |
| * Return true if this Resource is selected. |
| * @param r the Resource to check. |
| * @return whether the Resource was selected. |
| * @throws BuildException if an error occurs. |
| */ |
| public boolean isSelected(Resource r) { |
| if ((clazz == null) == (type == null)) { |
| throw new BuildException(ONE_ONLY); |
| } |
| Class<?> c = clazz; |
| if (type != null) { |
| if (project == null) { |
| throw new BuildException( |
| "No project set for InstanceOf ResourceSelector; the type attribute is invalid."); |
| } |
| AntTypeDefinition d = ComponentHelper.getComponentHelper( |
| project).getDefinition(ProjectHelper.genComponentName(uri, type)); |
| if (d == null) { |
| throw new BuildException("type %s not found.",type); |
| } |
| try { |
| c = d.innerGetTypeClass(); |
| } catch (ClassNotFoundException e) { |
| throw new BuildException(e); |
| } |
| } |
| return c.isAssignableFrom(r.getClass()); |
| } |
| |
| } |