aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Mapper.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Mapper.java')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Mapper.java322
1 files changed, 322 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Mapper.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Mapper.java
new file mode 100644
index 00000000..941e8dd8
--- /dev/null
+++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Mapper.java
@@ -0,0 +1,322 @@
+/*
+ * 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.types;
+
+import java.util.Properties;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.util.CompositeMapper;
+import org.apache.tools.ant.util.ContainerMapper;
+import org.apache.tools.ant.util.FileNameMapper;
+
+/**
+ * Element to define a FileNameMapper.
+ *
+ */
+public class Mapper extends DataType implements Cloneable {
+ // CheckStyle:VisibilityModifier OFF - bc
+
+ protected MapperType type = null;
+ protected String classname = null;
+ protected Path classpath = null;
+ protected String from = null;
+ protected String to = null;
+
+ // CheckStyle:VisibilityModifier ON
+
+ private ContainerMapper container = null;
+
+ /**
+ * Construct a new <code>Mapper</code> element.
+ * @param p the owning Ant <code>Project</code>.
+ */
+ public Mapper(Project p) {
+ setProject(p);
+ }
+
+ /**
+ * Set the type of <code>FileNameMapper</code> to use.
+ * @param type the <code>MapperType</code> enumerated attribute.
+ */
+ public void setType(MapperType type) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.type = type;
+ }
+
+ /**
+ * Cannot mix add and addconfigured in same type, so
+ * provide this to override the add method.
+ * @param fileNameMapper the <code>FileNameMapper</code> to add.
+ */
+ public void addConfigured(FileNameMapper fileNameMapper) {
+ add(fileNameMapper);
+ }
+
+ /**
+ * Add a nested <code>FileNameMapper</code>.
+ * @param fileNameMapper the <code>FileNameMapper</code> to add.
+ */
+ public void add(FileNameMapper fileNameMapper) {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ if (container == null) {
+ if (type == null && classname == null) {
+ container = new CompositeMapper();
+ } else {
+ FileNameMapper m = getImplementation();
+ if (m instanceof ContainerMapper) {
+ container = (ContainerMapper) m;
+ } else {
+ throw new BuildException(String.valueOf(m)
+ + " mapper implementation does not support nested mappers!");
+ }
+ }
+ }
+ container.add(fileNameMapper);
+ setChecked(false);
+ }
+
+ /**
+ * Add a Mapper
+ * @param mapper the mapper to add
+ */
+ public void addConfiguredMapper(Mapper mapper) {
+ add(mapper.getImplementation());
+ }
+
+ /**
+ * Set the class name of the FileNameMapper to use.
+ * @param classname the name of the class
+ */
+ public void setClassname(String classname) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.classname = classname;
+ }
+
+ /**
+ * Set the classpath to load the FileNameMapper through (attribute).
+ * @param classpath the classpath
+ */
+ public void setClasspath(Path classpath) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ if (this.classpath == null) {
+ this.classpath = classpath;
+ } else {
+ this.classpath.append(classpath);
+ }
+ }
+
+ /**
+ * Set the classpath to load the FileNameMapper through (nested element).
+ * @return a path object to be configured
+ */
+ public Path createClasspath() {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ if (this.classpath == null) {
+ this.classpath = new Path(getProject());
+ }
+ setChecked(false);
+ return this.classpath.createPath();
+ }
+
+ /**
+ * Set the classpath to load the FileNameMapper through via
+ * reference (attribute).
+ * @param ref the reference to the FileNameMapper
+ */
+ public void setClasspathRef(Reference ref) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ createClasspath().setRefid(ref);
+ }
+
+ /**
+ * Set the argument to FileNameMapper.setFrom
+ * @param from the from attribute to pass to the FileNameMapper
+ */
+ public void setFrom(String from) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.from = from;
+ }
+
+ /**
+ * Set the argument to FileNameMapper.setTo
+ * @param to the to attribute to pass to the FileNameMapper
+ */
+ public void setTo(String to) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.to = to;
+ }
+
+ /**
+ * Make this Mapper instance a reference to another Mapper.
+ *
+ * <p>You must not set any other attribute if you make it a
+ * reference.</p>
+ * @param r the reference to another mapper
+ * @throws BuildException if other attributes are set
+ */
+ public void setRefid(Reference r) throws BuildException {
+ if (type != null || from != null || to != null) {
+ throw tooManyAttributes();
+ }
+ super.setRefid(r);
+ }
+
+ /**
+ * Returns a fully configured FileNameMapper implementation.
+ * @return a FileNameMapper object to be configured
+ * @throws BuildException on error
+ */
+ public FileNameMapper getImplementation() throws BuildException {
+ if (isReference()) {
+ dieOnCircularReference();
+ Reference r = getRefid();
+ Object o = r.getReferencedObject(getProject());
+ if (o instanceof FileNameMapper) {
+ return (FileNameMapper) o;
+ }
+ if (o instanceof Mapper) {
+ return ((Mapper) o).getImplementation();
+ }
+ String od = o == null ? "null" : o.getClass().getName();
+ throw new BuildException(od + " at reference '"
+ + r.getRefId() + "' is not a valid mapper reference.");
+ }
+
+ if (type == null && classname == null && container == null) {
+ throw new BuildException(
+ "nested mapper or "
+ + "one of the attributes type or classname is required");
+ }
+
+ if (container != null) {
+ return container;
+ }
+
+ if (type != null && classname != null) {
+ throw new BuildException(
+ "must not specify both type and classname attribute");
+ }
+
+ try {
+ FileNameMapper m = getImplementationClass().newInstance();
+ final Project p = getProject();
+ if (p != null) {
+ p.setProjectReference(m);
+ }
+ m.setFrom(from);
+ m.setTo(to);
+
+ return m;
+ } catch (BuildException be) {
+ throw be;
+ } catch (Throwable t) {
+ throw new BuildException(t);
+ }
+ }
+
+ /**
+ * Gets the Class object associated with the mapper implementation.
+ * @return <code>Class</code>.
+ * @throws ClassNotFoundException if the class cannot be found
+ */
+ protected Class<? extends FileNameMapper> getImplementationClass() throws ClassNotFoundException {
+
+ String cName = this.classname;
+ if (type != null) {
+ cName = type.getImplementation();
+ }
+
+ ClassLoader loader = (classpath == null)
+ ? getClass().getClassLoader()
+ // Memory leak in line below
+ : getProject().createClassLoader(classpath);
+
+ return Class.forName(cName, true, loader).asSubclass(FileNameMapper.class);
+ }
+
+ /**
+ * Performs the check for circular references and returns the
+ * referenced Mapper.
+ * @deprecated since Ant 1.7.1 because a mapper might ref a
+ * FileNameMapper implementation directly.
+ * @return the referenced Mapper
+ */
+ protected Mapper getRef() {
+ return getCheckedRef(Mapper.class, getDataTypeName());
+ }
+
+ /**
+ * Class as Argument to FileNameMapper.setType.
+ */
+ public static class MapperType extends EnumeratedAttribute {
+ private Properties implementations;
+
+ /** Constructor for the MapperType enumeration */
+ public MapperType() {
+ implementations = new Properties();
+ implementations.put("identity",
+ "org.apache.tools.ant.util.IdentityMapper");
+ implementations.put("flatten",
+ "org.apache.tools.ant.util.FlatFileNameMapper");
+ implementations.put("glob",
+ "org.apache.tools.ant.util.GlobPatternMapper");
+ implementations.put("merge",
+ "org.apache.tools.ant.util.MergingMapper");
+ implementations.put("regexp",
+ "org.apache.tools.ant.util.RegexpPatternMapper");
+ implementations.put("package",
+ "org.apache.tools.ant.util.PackageNameMapper");
+ implementations.put("unpackage",
+ "org.apache.tools.ant.util.UnPackageNameMapper");
+ }
+
+ /**
+ * @return the filenamemapper names
+ */
+ public String[] getValues() {
+ return new String[] {"identity", "flatten", "glob",
+ "merge", "regexp", "package", "unpackage"};
+ }
+
+ /**
+ * @return the classname for the filenamemapper name
+ */
+ public String getImplementation() {
+ return implementations.getProperty(getValue());
+ }
+ }
+
+}