All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mule.config.MuleManifest Maven / Gradle / Ivy

There is a newer version: 3.9.0
Show newest version
/*
 * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
 * The software in this package is published under the terms of the CPAL v1.0
 * license, a copy of which has been included with this distribution in the
 * LICENSE.txt file.
 */
package org.mule.config;

import org.mule.api.config.MuleConfiguration;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Enumeration;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.jar.Attributes;
import java.util.jar.Manifest;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * This is a static class that provides access to the Mule core manifest file.
 */
// TODO EE-572
public class MuleManifest
{
    /**
     * logger used by this class
     */
    protected static final Log logger = LogFactory.getLog(MuleManifest.class);

    private static Manifest manifest;

    public static String getProductVersion()
    {
        final String version = getManifestProperty("Implementation-Version");
        return version == null ? "Unknown" : version;
    }

    public static String getVendorName()
    {
        return getManifestProperty("Specification-Vendor");
    }

    public static String getVendorUrl()
    {
        return getManifestProperty("Vendor-Url");
    }

    public static String getProductUrl()
    {
        return getManifestProperty("Product-Url");
    }

    public static String getProductName()
    {
        return getManifestProperty("Implementation-Title");
    }

    public static String getProductMoreInfo()
    {
        return getManifestProperty("More-Info");
    }

    public static String getProductSupport()
    {
        return getManifestProperty("Support");
    }

    public static String getProductLicenseInfo()
    {
        return getManifestProperty("License");
    }

    public static String getProductDescription()
    {
        return getManifestProperty("Description");
    }

    public static String getBuildNumber()
    {
        return getManifestProperty("Build-Revision");
    }

    public static String getBuildDate()
    {
        return getManifestProperty("Build-Date");
    }

	public static String getSupportedJdks()
	{
		return getManifestProperty("Supported-Jdks");
	}

	public static String getRecommndedJdks()
	{
		return getManifestProperty("Recommended-Jdks");
	}

    // synchronize this method as manifest initialized here.
    public static synchronized Manifest getManifest()
    {
        if (manifest == null)
        {
            manifest = new Manifest();

            InputStream is = null;
            try
            {
                // We want to load the MANIFEST.MF from the mule-core jar. Sine we
                // don't know the version we're using we have to search for the jar on the classpath
                URL url = AccessController.doPrivileged(new UrlPrivilegedAction());

                if (url != null)
                {
                    is = url.openStream();
                }

                if (is != null)
                {
                    manifest.read(is);
                }
            }
            catch (IOException e)
            {
                logger.warn("Failed to read manifest Info, Manifest information will not display correctly: "
                        + e.getMessage());
            }
        }
        return manifest;
    }

    protected static String getManifestProperty(String name)
    {
        return getManifest().getMainAttributes().getValue(new Attributes.Name(name));
    }

    static class UrlPrivilegedAction implements PrivilegedAction
    {
        @Override
        public URL run()
        {
            URL result = null;
            try
            {
                Enumeration e = MuleConfiguration.class.getClassLoader().getResources("META-INF/MANIFEST.MF");
                result = getManifestJarURL(e);
                if (result == null)
                {
                    // if we haven't found a valid manifest yet, maybe we're running tests
                    result = getManifestTestJarURL();
                }
            }
            catch (IOException e1)
            {
                logger.warn("Failure reading manifest: " + e1.getMessage(), e1);
            }
            return result;
        }

        URL getManifestJarURL(Enumeration e)
        {
            SortedMap candidates = new TreeMap();
            while (e.hasMoreElements())
            {
                URL url = e.nextElement();
                if ((url.toExternalForm().indexOf("mule-core") > -1 && url.toExternalForm().indexOf("tests.jar") < 0)
                    || url.toExternalForm().matches(".*mule.*-.*-embedded.*\\.jar.*"))
                {
                    candidates.put(url.toExternalForm(), url);
                }
            }
            if (!candidates.isEmpty())
            {
                //if mule-core and mule-core-ee jars are present, then mule-core-ee gets precedence
                return candidates.get(candidates.lastKey());
            }
            return null;
        }

        URL getManifestTestJarURL() throws IOException
        {
            String pathSeparator = System.getProperty("file.separator");
            String testManifestPath = "core" + pathSeparator + "target" + pathSeparator + "test-classes";
            Enumeration e = MuleConfiguration.class.getClassLoader().getResources("META-INF/MANIFEST.MF");
            while (e.hasMoreElements())
            {
                URL url = e.nextElement();
                if ((url.toExternalForm().indexOf(testManifestPath) > -1 && url.toExternalForm().indexOf("tests.jar") < 0)
                    || url.toExternalForm().matches(".*mule.*-.*-embedded.*\\.jar.*"))
                {
                    return url;
                }
            }
            return null;
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy