001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018: package org.apache.tools.ant.types;
019:
020: import java.util.Vector;
021: import org.apache.tools.ant.BuildException;
022:
023: /**
024: * An AntFilterReader is a wrapper class that encloses the classname
025: * and configuration of a Configurable FilterReader.
026: */
027: public final class AntFilterReader extends DataType implements
028: Cloneable {
029:
030: private String className;
031:
032: private final Vector parameters = new Vector();
033:
034: private Path classpath;
035:
036: /**
037: * Set the className attribute.
038: *
039: * @param className a <code>String</code> value
040: */
041: public void setClassName(final String className) {
042: this .className = className;
043: }
044:
045: /**
046: * Get the className attribute.
047: *
048: * @return a <code>String</code> value
049: */
050: public String getClassName() {
051: return className;
052: }
053:
054: /**
055: * Add a Parameter.
056: *
057: * @param param a <code>Parameter</code> value
058: */
059: public void addParam(final Parameter param) {
060: parameters.addElement(param);
061: }
062:
063: /**
064: * Set the classpath to load the FilterReader through (attribute).
065: * @param classpath a classpath
066: */
067: public void setClasspath(Path classpath) {
068: if (isReference()) {
069: throw tooManyAttributes();
070: }
071: if (this .classpath == null) {
072: this .classpath = classpath;
073: } else {
074: this .classpath.append(classpath);
075: }
076: }
077:
078: /**
079: * Set the classpath to load the FilterReader through (nested element).
080: * @return a classpath to be configured
081: */
082: public Path createClasspath() {
083: if (isReference()) {
084: throw noChildrenAllowed();
085: }
086: if (this .classpath == null) {
087: this .classpath = new Path(getProject());
088: }
089: return this .classpath.createPath();
090: }
091:
092: /**
093: * Get the classpath.
094: * @return the classpath
095: */
096: public Path getClasspath() {
097: return classpath;
098: }
099:
100: /**
101: * Set the classpath to load the FilterReader through via
102: * reference (attribute).
103: * @param r a reference to a classpath
104: */
105: public void setClasspathRef(Reference r) {
106: if (isReference()) {
107: throw tooManyAttributes();
108: }
109: createClasspath().setRefid(r);
110: }
111:
112: /**
113: * The parameters for this filter.
114: *
115: * @return a <code>Parameter[]</code> value
116: */
117: public Parameter[] getParams() {
118: Parameter[] params = new Parameter[parameters.size()];
119: parameters.copyInto(params);
120: return params;
121: }
122:
123: /**
124: * Makes this instance in effect a reference to another AntFilterReader
125: * instance.
126: *
127: * <p>You must not set another attribute or nest elements inside
128: * this element if you make it a reference.</p>
129: *
130: * @param r the reference to which this instance is associated
131: * @exception BuildException if this instance already has been configured.
132: */
133: public void setRefid(Reference r) throws BuildException {
134: if (!parameters.isEmpty() || className != null
135: || classpath != null) {
136: throw tooManyAttributes();
137: }
138: // change this to get the objects from the other reference
139: Object o = r.getReferencedObject(getProject());
140: if (o instanceof AntFilterReader) {
141: AntFilterReader afr = (AntFilterReader) o;
142: setClassName(afr.getClassName());
143: setClasspath(afr.getClasspath());
144: Parameter[] p = afr.getParams();
145: if (p != null) {
146: for (int i = 0; i < p.length; i++) {
147: addParam(p[i]);
148: }
149: }
150: } else {
151: String msg = r.getRefId()
152: + " doesn\'t refer to a FilterReader";
153: throw new BuildException(msg);
154: }
155:
156: super.setRefid(r);
157: }
158: }
|