1 | /*
|
---|
2 | * Copyright 2002-2004 The Apache Software Foundation
|
---|
3 | *
|
---|
4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
---|
5 | * you may not use this file except in compliance with the License.
|
---|
6 | * You may obtain a copy of the License at
|
---|
7 | *
|
---|
8 | * http://www.apache.org/licenses/LICENSE-2.0
|
---|
9 | *
|
---|
10 | * Unless required by applicable law or agreed to in writing, software
|
---|
11 | * distributed under the License is distributed on an "AS IS" BASIS,
|
---|
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
---|
13 | * See the License for the specific language governing permissions and
|
---|
14 | * limitations under the License.
|
---|
15 | *
|
---|
16 | */
|
---|
17 |
|
---|
18 | package org.apache.tools.ant.types.selectors;
|
---|
19 |
|
---|
20 | import java.io.File;
|
---|
21 | import java.util.Vector;
|
---|
22 |
|
---|
23 | import org.apache.tools.ant.Project;
|
---|
24 | import org.apache.tools.ant.AntClassLoader;
|
---|
25 | import org.apache.tools.ant.BuildException;
|
---|
26 | import org.apache.tools.ant.types.Parameter;
|
---|
27 | import org.apache.tools.ant.types.Path;
|
---|
28 | import org.apache.tools.ant.types.Reference;
|
---|
29 |
|
---|
30 | /**
|
---|
31 | * Selector that selects files by forwarding the request on to other classes.
|
---|
32 | *
|
---|
33 | * @since 1.5
|
---|
34 | */
|
---|
35 | public class ExtendSelector extends BaseSelector {
|
---|
36 |
|
---|
37 | private String classname = null;
|
---|
38 | private FileSelector dynselector = null;
|
---|
39 | private Vector paramVec = new Vector();
|
---|
40 | private Path classpath = null;
|
---|
41 |
|
---|
42 | /**
|
---|
43 | * Default constructor.
|
---|
44 | */
|
---|
45 | public ExtendSelector() {
|
---|
46 | }
|
---|
47 |
|
---|
48 | /**
|
---|
49 | * Sets the classname of the custom selector.
|
---|
50 | *
|
---|
51 | * @param classname is the class which implements this selector
|
---|
52 | */
|
---|
53 | public void setClassname(String classname) {
|
---|
54 | this.classname = classname;
|
---|
55 | }
|
---|
56 |
|
---|
57 | /**
|
---|
58 | * Instantiates the identified custom selector class.
|
---|
59 | */
|
---|
60 | public void selectorCreate() {
|
---|
61 | if (classname != null && classname.length() > 0) {
|
---|
62 | try {
|
---|
63 | Class c = null;
|
---|
64 | if (classpath == null) {
|
---|
65 | c = Class.forName(classname);
|
---|
66 | } else {
|
---|
67 | AntClassLoader al
|
---|
68 | = getProject().createClassLoader(classpath);
|
---|
69 | c = Class.forName(classname, true, al);
|
---|
70 | }
|
---|
71 | dynselector = (FileSelector) c.newInstance();
|
---|
72 | final Project project = getProject();
|
---|
73 | if (project != null) {
|
---|
74 | project.setProjectReference(dynselector);
|
---|
75 | }
|
---|
76 | } catch (ClassNotFoundException cnfexcept) {
|
---|
77 | setError("Selector " + classname
|
---|
78 | + " not initialized, no such class");
|
---|
79 | } catch (InstantiationException iexcept) {
|
---|
80 | setError("Selector " + classname
|
---|
81 | + " not initialized, could not create class");
|
---|
82 | } catch (IllegalAccessException iaexcept) {
|
---|
83 | setError("Selector " + classname
|
---|
84 | + " not initialized, class not accessible");
|
---|
85 | }
|
---|
86 | } else {
|
---|
87 | setError("There is no classname specified");
|
---|
88 | }
|
---|
89 | }
|
---|
90 |
|
---|
91 | /**
|
---|
92 | * Create new parameters to pass to custom selector.
|
---|
93 | *
|
---|
94 | * @param p The new Parameter object
|
---|
95 | */
|
---|
96 | public void addParam(Parameter p) {
|
---|
97 | paramVec.addElement(p);
|
---|
98 | }
|
---|
99 |
|
---|
100 |
|
---|
101 | /**
|
---|
102 | * Set the classpath to load the classname specified using an attribute.
|
---|
103 | * @param classpath the classpath to use
|
---|
104 | */
|
---|
105 | public final void setClasspath(Path classpath) {
|
---|
106 | if (isReference()) {
|
---|
107 | throw tooManyAttributes();
|
---|
108 | }
|
---|
109 | if (this.classpath == null) {
|
---|
110 | this.classpath = classpath;
|
---|
111 | } else {
|
---|
112 | this.classpath.append(classpath);
|
---|
113 | }
|
---|
114 | }
|
---|
115 |
|
---|
116 | /**
|
---|
117 | * Specify the classpath to use to load the Selector (nested element).
|
---|
118 | * @return a classpath to be configured
|
---|
119 | */
|
---|
120 | public final Path createClasspath() {
|
---|
121 | if (isReference()) {
|
---|
122 | throw noChildrenAllowed();
|
---|
123 | }
|
---|
124 | if (this.classpath == null) {
|
---|
125 | this.classpath = new Path(getProject());
|
---|
126 | }
|
---|
127 | return this.classpath.createPath();
|
---|
128 | }
|
---|
129 |
|
---|
130 | /**
|
---|
131 | * Get the classpath
|
---|
132 | * @return the classpath
|
---|
133 | */
|
---|
134 | public final Path getClasspath() {
|
---|
135 | return classpath;
|
---|
136 | }
|
---|
137 |
|
---|
138 | /**
|
---|
139 | * Set the classpath to use for loading a custom selector by using
|
---|
140 | * a reference.
|
---|
141 | * @param r a reference to the classpath
|
---|
142 | */
|
---|
143 | public void setClasspathref(Reference r) {
|
---|
144 | if (isReference()) {
|
---|
145 | throw tooManyAttributes();
|
---|
146 | }
|
---|
147 | createClasspath().setRefid(r);
|
---|
148 | }
|
---|
149 |
|
---|
150 | /**
|
---|
151 | * These are errors specific to ExtendSelector only. If there are
|
---|
152 | * errors in the custom selector, it should throw a BuildException
|
---|
153 | * when isSelected() is called.
|
---|
154 | */
|
---|
155 | public void verifySettings() {
|
---|
156 | // Creation is done here rather than in isSelected() because some
|
---|
157 | // containers may do a validation pass before running isSelected(),
|
---|
158 | // but we need to check for the existence of the created class.
|
---|
159 | if (dynselector == null) {
|
---|
160 | selectorCreate();
|
---|
161 | }
|
---|
162 | if (classname == null || classname.length() < 1) {
|
---|
163 | setError("The classname attribute is required");
|
---|
164 | } else if (dynselector == null) {
|
---|
165 | setError("Internal Error: The custom selector was not created");
|
---|
166 | } else if (!(dynselector instanceof ExtendFileSelector)
|
---|
167 | && (paramVec.size() > 0)) {
|
---|
168 | setError("Cannot set parameters on custom selector that does not "
|
---|
169 | + "implement ExtendFileSelector");
|
---|
170 | }
|
---|
171 | }
|
---|
172 |
|
---|
173 |
|
---|
174 | /**
|
---|
175 | * Allows the custom selector to choose whether to select a file. This
|
---|
176 | * is also where the Parameters are passed to the custom selector,
|
---|
177 | * since we know we must have them all by now. And since we must know
|
---|
178 | * both classpath and classname, creating the class is deferred to here
|
---|
179 | * as well.
|
---|
180 | *
|
---|
181 | * @exception BuildException if an error occurs
|
---|
182 | */
|
---|
183 | public boolean isSelected(File basedir, String filename, File file)
|
---|
184 | throws BuildException {
|
---|
185 | validate();
|
---|
186 | if (paramVec.size() > 0 && dynselector instanceof ExtendFileSelector) {
|
---|
187 | Parameter[] paramArray = new Parameter[paramVec.size()];
|
---|
188 | paramVec.copyInto(paramArray);
|
---|
189 | // We know that dynselector must be non-null if no error message
|
---|
190 | ((ExtendFileSelector) dynselector).setParameters(paramArray);
|
---|
191 | }
|
---|
192 | return dynselector.isSelected(basedir, filename, file);
|
---|
193 | }
|
---|
194 |
|
---|
195 | }
|
---|
196 |
|
---|