source: other-projects/trunk/gs3-release-maker/apache-ant-1.6.5/src/main/org/apache/tools/ant/types/selectors/ExtendSelector.java@ 14627

Last change on this file since 14627 was 14627, checked in by oranfry, 17 years ago

initial import of the gs3-release-maker

File size: 6.5 KB
Line 
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
18package org.apache.tools.ant.types.selectors;
19
20import java.io.File;
21import java.util.Vector;
22
23import org.apache.tools.ant.Project;
24import org.apache.tools.ant.AntClassLoader;
25import org.apache.tools.ant.BuildException;
26import org.apache.tools.ant.types.Parameter;
27import org.apache.tools.ant.types.Path;
28import 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 */
35public 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
Note: See TracBrowser for help on using the repository browser.