aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/JarLibResolveTask.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/JarLibResolveTask.java')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/JarLibResolveTask.java268
1 files changed, 268 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/JarLibResolveTask.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/JarLibResolveTask.java
new file mode 100644
index 00000000..c13194fa
--- /dev/null
+++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/JarLibResolveTask.java
@@ -0,0 +1,268 @@
+/*
+ * 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.taskdefs.optional.extension;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.jar.Manifest;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.optional.extension.resolvers.AntResolver;
+import org.apache.tools.ant.taskdefs.optional.extension.resolvers.LocationResolver;
+import org.apache.tools.ant.taskdefs.optional.extension.resolvers.URLResolver;
+
+/**
+ * Tries to locate a JAR to satisfy an extension and place
+ * location of JAR into property.
+ *
+ * @ant.task name="jarlib-resolve"
+ */
+public class JarLibResolveTask extends Task {
+ /**
+ * The name of the property in which the location of
+ * library is stored.
+ */
+ private String propertyName;
+
+ /**
+ * The extension that is required.
+ */
+ private Extension requiredExtension;
+
+ /**
+ * The set of resolvers to use to attempt to locate library.
+ */
+ private final ArrayList resolvers = new ArrayList();
+
+ /**
+ * Flag to indicate that you should check that
+ * the librarys resolved actually contain
+ * extension and if they don't then raise
+ * an exception.
+ */
+ private boolean checkExtension = true;
+
+ /**
+ * Flag indicating whether or not you should
+ * throw a BuildException if you cannot resolve
+ * library.
+ */
+ private boolean failOnError = true;
+
+ /**
+ * The name of the property in which the location of
+ * library is stored.
+ *
+ * @param property The name of the property in which the location of
+ * library is stored.
+ */
+ public void setProperty(final String property) {
+ this.propertyName = property;
+ }
+
+ /**
+ * Check nested libraries for extensions
+ *
+ * @param checkExtension if true, libraries returned by nested
+ * resolvers should be checked to see if they supply extension.
+ */
+ public void setCheckExtension(final boolean checkExtension) {
+ this.checkExtension = checkExtension;
+ }
+
+ /**
+ * Set whether to fail if error.
+ *
+ * @param failOnError if true, failure to locate library should fail build.
+ */
+ public void setFailOnError(final boolean failOnError) {
+ this.failOnError = failOnError;
+ }
+
+ /**
+ * Adds location resolver to look for a library in a location
+ * relative to project directory.
+ *
+ * @param loc the resolver location to search.
+ */
+ public void addConfiguredLocation(final LocationResolver loc) {
+ resolvers.add(loc);
+ }
+
+ /**
+ * Adds a URL resolver to download a library from a URL
+ * to a local file.
+ *
+ * @param url the URL resolver from which to download the library
+ */
+ public void addConfiguredUrl(final URLResolver url) {
+ resolvers.add(url);
+ }
+
+ /**
+ * Adds Ant resolver to run an Ant build file to generate a library.
+ *
+ * @param ant the AntResolver to generate the library.
+ */
+ public void addConfiguredAnt(final AntResolver ant) {
+ resolvers.add(ant);
+ }
+
+ /**
+ * Set the Extension looking for.
+ *
+ * @param extension Set the Extension looking for.
+ */
+ public void addConfiguredExtension(final ExtensionAdapter extension) {
+ if (null != requiredExtension) {
+ final String message = "Can not specify extension to "
+ + "resolve multiple times.";
+ throw new BuildException(message);
+ }
+ requiredExtension = extension.toExtension();
+ }
+
+ /**
+ * Execute the task.
+ *
+ * @throws BuildException if the task fails.
+ */
+ public void execute() throws BuildException {
+ validate();
+
+ getProject().log("Resolving extension: " + requiredExtension, Project.MSG_VERBOSE);
+
+ String candidate = getProject().getProperty(propertyName);
+
+ if (null != candidate) {
+ final String message = "Property Already set to: " + candidate;
+ if (failOnError) {
+ throw new BuildException(message);
+ }
+ getProject().log(message, Project.MSG_ERR);
+ return;
+ }
+
+ final int size = resolvers.size();
+ for (int i = 0; i < size; i++) {
+ final ExtensionResolver resolver =
+ (ExtensionResolver) resolvers.get(i);
+
+ getProject().log("Searching for extension using Resolver:" + resolver,
+ Project.MSG_VERBOSE);
+
+ try {
+ final File file = resolver.resolve(requiredExtension, getProject());
+ try {
+ checkExtension(file);
+ return;
+ } catch (final BuildException be) {
+ final String message = "File " + file + " returned by "
+ + "resolver failed to satisfy extension due to: " + be.getMessage();
+ getProject().log(message, Project.MSG_WARN);
+ }
+ } catch (final BuildException be) {
+ final String message = "Failed to resolve extension to file " + "using resolver "
+ + resolver + " due to: " + be;
+ getProject().log(message, Project.MSG_WARN);
+ }
+ }
+ missingExtension();
+ }
+
+ /**
+ * Utility method that will throw a {@link BuildException}
+ * if {@link #failOnError} is true else it just displays
+ * a warning.
+ */
+ private void missingExtension() {
+ final String message = "Unable to resolve extension to a file";
+ if (failOnError) {
+ throw new BuildException(message);
+ }
+ getProject().log(message, Project.MSG_ERR);
+ }
+
+ /**
+ * Check if specified file satisfies extension.
+ * If it does then set the relevant property
+ * else throw a BuildException.
+ *
+ * @param file the candidate library
+ * @throws BuildException if library does not satisfy extension
+ */
+ private void checkExtension(final File file) {
+ if (!file.exists()) {
+ throw new BuildException("File " + file + " does not exist");
+ }
+ if (!file.isFile()) {
+ throw new BuildException("File " + file + " is not a file");
+ }
+ if (!checkExtension) {
+ getProject().log("Setting property to " + file
+ + " without verifying library satisfies extension", Project.MSG_VERBOSE);
+ setLibraryProperty(file);
+ } else {
+ getProject().log("Checking file " + file + " to see if it satisfies extension",
+ Project.MSG_VERBOSE);
+ final Manifest manifest = ExtensionUtil.getManifest(file);
+ final Extension[] extensions = Extension.getAvailable(manifest);
+ for (int i = 0; i < extensions.length; i++) {
+ final Extension extension = extensions[ i ];
+ if (extension.isCompatibleWith(requiredExtension)) {
+ setLibraryProperty(file);
+ return;
+ }
+ }
+ final String message = "File " + file + " skipped as it "
+ + "does not satisfy extension";
+ getProject().log(message, Project.MSG_VERBOSE);
+ throw new BuildException(message);
+ }
+ }
+
+ /**
+ * Utility method to set the appropriate property
+ * to indicate that specified file satisfies library
+ * requirements.
+ *
+ * @param file the library
+ */
+ private void setLibraryProperty(final File file) {
+ getProject().setNewProperty(propertyName, file.getAbsolutePath());
+ }
+
+ /**
+ * Validate the tasks parameters.
+ *
+ * @throws BuildException if invalid parameters found
+ */
+ private void validate() throws BuildException {
+ if (null == propertyName) {
+ final String message = "Property attribute must be specified.";
+ throw new BuildException(message);
+ }
+
+ if (null == requiredExtension) {
+ final String message = "Extension element must be specified.";
+ throw new BuildException(message);
+ }
+ }
+}