📄 specification.java
字号:
/* * 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.text.ParseException;import java.util.ArrayList;import java.util.Arrays;import java.util.Iterator;import java.util.Map;import java.util.jar.Attributes;import java.util.jar.Manifest;import org.apache.tools.ant.util.StringUtils;/** * <p>Utility class that represents either an available "Optional Package" * (formerly known as "Standard Extension") as described in the manifest * of a JAR file, or the requirement for such an optional package.</p> * * <p>For more information about optional packages, see the document * <em>Optional Package Versioning</em> in the documentation bundle for your * Java2 Standard Edition package, in file * <code>guide/extensions/versioning.html</code>.</p> * */public final class Specification { private static final String MISSING = "Missing "; /** * Manifest Attribute Name object for SPECIFICATION_TITLE. */ public static final Attributes.Name SPECIFICATION_TITLE = Attributes.Name.SPECIFICATION_TITLE; /** * Manifest Attribute Name object for SPECIFICATION_VERSION. */ public static final Attributes.Name SPECIFICATION_VERSION = Attributes.Name.SPECIFICATION_VERSION; /** * Manifest Attribute Name object for SPECIFICATION_VENDOR. */ public static final Attributes.Name SPECIFICATION_VENDOR = Attributes.Name.SPECIFICATION_VENDOR; /** * Manifest Attribute Name object for IMPLEMENTATION_TITLE. */ public static final Attributes.Name IMPLEMENTATION_TITLE = Attributes.Name.IMPLEMENTATION_TITLE; /** * Manifest Attribute Name object for IMPLEMENTATION_VERSION. */ public static final Attributes.Name IMPLEMENTATION_VERSION = Attributes.Name.IMPLEMENTATION_VERSION; /** * Manifest Attribute Name object for IMPLEMENTATION_VENDOR. */ public static final Attributes.Name IMPLEMENTATION_VENDOR = Attributes.Name.IMPLEMENTATION_VENDOR; /** * Enum indicating that extension is compatible with other Package * Specification. */ public static final Compatibility COMPATIBLE = new Compatibility("COMPATIBLE"); /** * Enum indicating that extension requires an upgrade * of specification to be compatible with other Package Specification. */ public static final Compatibility REQUIRE_SPECIFICATION_UPGRADE = new Compatibility("REQUIRE_SPECIFICATION_UPGRADE"); /** * Enum indicating that extension requires a vendor * switch to be compatible with other Package Specification. */ public static final Compatibility REQUIRE_VENDOR_SWITCH = new Compatibility("REQUIRE_VENDOR_SWITCH"); /** * Enum indicating that extension requires an upgrade * of implementation to be compatible with other Package Specification. */ public static final Compatibility REQUIRE_IMPLEMENTATION_CHANGE = new Compatibility("REQUIRE_IMPLEMENTATION_CHANGE"); /** * This enum indicates that an extension is incompatible with * other Package Specification in ways other than other enums * indicate. For example, the other Package Specification * may have a different ID. */ public static final Compatibility INCOMPATIBLE = new Compatibility("INCOMPATIBLE"); /** * The name of the Package Specification. */ private String specificationTitle; /** * The version number (dotted decimal notation) of the specification * to which this optional package conforms. */ private DeweyDecimal specificationVersion; /** * The name of the company or organization that originated the * specification to which this specification conforms. */ private String specificationVendor; /** * The title of implementation. */ private String implementationTitle; /** * The name of the company or organization that produced this * implementation of this specification. */ private String implementationVendor; /** * The version string for implementation. The version string is * opaque. */ private String implementationVersion; /** * The sections of jar that the specification applies to. */ private String[] sections; /** * Return an array of <code>Package Specification</code> objects. * If there are no such optional packages, a zero-length array is returned. * * @param manifest Manifest to be parsed * @return the Package Specifications extensions in specified manifest * @throws ParseException if the attributes of the specifications cannot * be parsed according to their expected formats. */ public static Specification[] getSpecifications(final Manifest manifest) throws ParseException { if (null == manifest) { return new Specification[ 0 ]; } final ArrayList results = new ArrayList(); final Map entries = manifest.getEntries(); final Iterator keys = entries.keySet().iterator(); while (keys.hasNext()) { final String key = (String) keys.next(); final Attributes attributes = (Attributes) entries.get(key); final Specification specification = getSpecification(key, attributes); if (null != specification) { results.add(specification); } } final ArrayList trimmedResults = removeDuplicates(results); return (Specification[]) trimmedResults.toArray(new Specification[trimmedResults.size()]); } /** * The constructor to create Package Specification object. * Note that every component is allowed to be specified * but only the specificationTitle is mandatory. * * @param specificationTitle the name of specification. * @param specificationVersion the specification Version. * @param specificationVendor the specification Vendor. * @param implementationTitle the title of implementation. * @param implementationVersion the implementation Version. * @param implementationVendor the implementation Vendor. */ public Specification(final String specificationTitle, final String specificationVersion, final String specificationVendor, final String implementationTitle, final String implementationVersion, final String implementationVendor) { this(specificationTitle, specificationVersion, specificationVendor, implementationTitle, implementationVersion, implementationVendor, null); } /** * The constructor to create Package Specification object. * Note that every component is allowed to be specified * but only the specificationTitle is mandatory. * * @param specificationTitle the name of specification. * @param specificationVersion the specification Version. * @param specificationVendor the specification Vendor. * @param implementationTitle the title of implementation. * @param implementationVersion the implementation Version. * @param implementationVendor the implementation Vendor. * @param sections the sections/packages that Specification applies to. */ public Specification(final String specificationTitle, final String specificationVersion, final String specificationVendor, final String implementationTitle, final String implementationVersion, final String implementationVendor, final String[] sections) { this.specificationTitle = specificationTitle; this.specificationVendor = specificationVendor; if (null != specificationVersion) { try { this.specificationVersion = new DeweyDecimal(specificationVersion); } catch (final NumberFormatException nfe) { final String error = "Bad specification version format '" + specificationVersion + "' in '" + specificationTitle + "'. (Reason: " + nfe + ")"; throw new IllegalArgumentException(error); } } this.implementationTitle = implementationTitle; this.implementationVendor = implementationVendor; this.implementationVersion = implementationVersion; if (null == this.specificationTitle) { throw new NullPointerException("specificationTitle"); } String[] copy = null; if (null != sections) { copy = new String[ sections.length ]; System.arraycopy(sections, 0, copy, 0, sections.length); } this.sections = copy; } /** * Get the title of the specification. * * @return the title of speciication */ public String getSpecificationTitle() { return specificationTitle; } /** * Get the vendor of the specification. * * @return the vendor of the specification. */ public String getSpecificationVendor() { return specificationVendor; } /** * Get the title of the specification. * * @return the title of the specification. */ public String getImplementationTitle() { return implementationTitle; } /** * Get the version of the specification. * * @return the version of the specification. */ public DeweyDecimal getSpecificationVersion() { return specificationVersion; } /** * Get the vendor of the extensions implementation. * * @return the vendor of the extensions implementation.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -