diff options
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/ExtensionUtil.java')
-rw-r--r-- | framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/ExtensionUtil.java | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/ExtensionUtil.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/ExtensionUtil.java new file mode 100644 index 00000000..089c7894 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/ExtensionUtil.java @@ -0,0 +1,215 @@ +/* + * 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.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.jar.JarFile; +import java.util.jar.Manifest; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.DirectoryScanner; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.types.FileSet; + +/** + * A set of useful methods relating to extensions. + * + */ +public final class ExtensionUtil { + /** + * Class is not meant to be instantiated. + */ + private ExtensionUtil() { + //all methods static + } + + /** + * Convert a list of extensionAdapter objects to extensions. + * + * @param adapters the list of ExtensionAdapterss to add to convert + * @throws BuildException if an error occurs + */ + static ArrayList toExtensions(final List adapters) + throws BuildException { + final ArrayList results = new ArrayList(); + + final int size = adapters.size(); + for (int i = 0; i < size; i++) { + final ExtensionAdapter adapter = + (ExtensionAdapter) adapters.get(i); + final Extension extension = adapter.toExtension(); + results.add(extension); + } + + return results; + } + + /** + * Generate a list of extensions from a specified fileset. + * + * @param libraries the list to add extensions to + * @param fileset the filesets containing librarys + * @throws BuildException if an error occurs + */ + static void extractExtensions(final Project project, + final List libraries, + final List fileset) + throws BuildException { + if (!fileset.isEmpty()) { + final Extension[] extensions = getExtensions(project, + fileset); + for (int i = 0; i < extensions.length; i++) { + libraries.add(extensions[ i ]); + } + } + } + + /** + * Retrieve extensions from the specified libraries. + * + * @param libraries the filesets for libraries + * @return the extensions contained in libraries + * @throws BuildException if failing to scan libraries + */ + private static Extension[] getExtensions(final Project project, + final List libraries) + throws BuildException { + final ArrayList extensions = new ArrayList(); + final Iterator iterator = libraries.iterator(); + while (iterator.hasNext()) { + final FileSet fileSet = (FileSet) iterator.next(); + + boolean includeImpl = true; + boolean includeURL = true; + + if (fileSet instanceof LibFileSet) { + LibFileSet libFileSet = (LibFileSet) fileSet; + includeImpl = libFileSet.isIncludeImpl(); + includeURL = libFileSet.isIncludeURL(); + } + + final DirectoryScanner scanner = fileSet.getDirectoryScanner(project); + final File basedir = scanner.getBasedir(); + final String[] files = scanner.getIncludedFiles(); + for (int i = 0; i < files.length; i++) { + final File file = new File(basedir, files[ i ]); + loadExtensions(file, extensions, includeImpl, includeURL); + } + } + return (Extension[]) extensions.toArray(new Extension[extensions.size()]); + } + + /** + * Load list of available extensions from specified file. + * + * @param file the file + * @param extensionList the list to add available extensions to + * @throws BuildException if there is an error + */ + private static void loadExtensions(final File file, + final List extensionList, + final boolean includeImpl, + final boolean includeURL) + throws BuildException { + try { + final JarFile jarFile = new JarFile(file); + final Extension[] extensions = + Extension.getAvailable(jarFile.getManifest()); + for (int i = 0; i < extensions.length; i++) { + final Extension extension = extensions[ i ]; + addExtension(extensionList, extension, includeImpl, includeURL); + } + } catch (final Exception e) { + throw new BuildException(e.getMessage(), e); + } + } + + /** + * Add extension to list. + * If extension should not have implementation details but + * does strip them. If extension should not have url but does + * then strip it. + * + * @param extensionList the list of extensions to add to + * @param originalExtension the extension + * @param includeImpl false to exclude implementation details + * @param includeURL false to exclude implementation URL + */ + private static void addExtension(final List extensionList, + final Extension originalExtension, + final boolean includeImpl, + final boolean includeURL) { + Extension extension = originalExtension; + if (!includeURL + && null != extension.getImplementationURL()) { + extension = + new Extension(extension.getExtensionName(), + extension.getSpecificationVersion().toString(), + extension.getSpecificationVendor(), + extension.getImplementationVersion().toString(), + extension.getImplementationVendor(), + extension.getImplementationVendorID(), + null); + } + + final boolean hasImplAttributes = + null != extension.getImplementationURL() + || null != extension.getImplementationVersion() + || null != extension.getImplementationVendorID() + || null != extension.getImplementationVendor(); + + if (!includeImpl && hasImplAttributes) { + extension = + new Extension(extension.getExtensionName(), + extension.getSpecificationVersion().toString(), + extension.getSpecificationVendor(), + null, + null, + null, + extension.getImplementationURL()); + } + + extensionList.add(extension); + } + + /** + * Retrieve manifest for specified file. + * + * @param file the file + * @return the manifest + * @throws BuildException if errror occurs (file doesn't exist, + * file not a jar, manifest doesn't exist in file) + */ + static Manifest getManifest(final File file) + throws BuildException { + try { + final JarFile jarFile = new JarFile(file); + Manifest m = jarFile.getManifest(); + if (m == null) { + throw new BuildException(file + " doesn't have a MANIFEST"); + } + return m; + } catch (final IOException ioe) { + throw new BuildException(ioe.getMessage(), ioe); + } + } +} |