summaryrefslogtreecommitdiff
path: root/trunk/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java')
-rw-r--r--trunk/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java190
1 files changed, 190 insertions, 0 deletions
diff --git a/trunk/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java b/trunk/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java
new file mode 100644
index 0000000000..2c783aeaa4
--- /dev/null
+++ b/trunk/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java
@@ -0,0 +1,190 @@
+/*
+ * 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.qpid.common;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * QpidProperties captures the project name, version number, and source code repository revision number from a properties
+ * file which is generated as part of the build process. Normally, the name and version number are pulled from the module
+ * name and version number of the Maven build POM, but could come from other sources if the build system is changed. The
+ * idea behind this, is that every build has these values incorporated directly into its jar file, so that code in the
+ * wild can be identified, should its origination be forgotten.
+ *
+ * <p/>To get the build version of any Qpid code call the {@link #main} method. This version string is usually also
+ * printed to the console on broker start up.
+ *
+ * <p/><table id="crc"><caption>CRC Card</caption>
+ * <tr><td>Load build versioning information into the runtime, for code identification purposes.
+ * </table>
+ *
+ * @todo Code to locate/load/log properties can be factored into a reusable properties utils class. Avoid having this
+ * same snippet of loading code scattered in many places.
+ *
+ * @todo Could also add a build number property for a sequential build number assigned by an automated build system, for
+ * build reproducability purposes.
+ */
+public class QpidProperties
+{
+ /** Used for debugging purposes. */
+ private static final Logger _logger = LoggerFactory.getLogger(QpidProperties.class);
+
+ /** The name of the version properties file to load from the class path. */
+ public static final String VERSION_RESOURCE = "qpidversion.properties";
+
+ /** Defines the name of the product property. */
+ public static final String PRODUCT_NAME_PROPERTY = "qpid.name";
+
+ /** Defines the name of the version property. */
+ public static final String RELEASE_VERSION_PROPERTY = "qpid.version";
+
+ /** Defines the name of the source code revision property. */
+ public static final String BUILD_VERSION_PROPERTY = "qpid.svnversion";
+
+ /** Defines the default value for all properties that cannot be loaded. */
+ private static final String DEFAULT = "unknown";
+
+ /** Holds the product name. */
+ private static String productName = DEFAULT;
+
+ /** Holds the product version. */
+ private static String releaseVersion = DEFAULT;
+
+ /** Holds the source code revision. */
+ private static String buildVersion = DEFAULT;
+
+ // Loads the values from the version properties file.
+ static
+ {
+ Properties props = new Properties();
+
+ try
+ {
+ InputStream propertyStream = QpidProperties.class.getClassLoader().getResourceAsStream(VERSION_RESOURCE);
+ if (propertyStream == null)
+ {
+ _logger.warn("Unable to find resource " + VERSION_RESOURCE + " from classloader");
+ }
+ else
+ {
+ props.load(propertyStream);
+
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Dumping QpidProperties");
+ for (Map.Entry<Object, Object> entry : props.entrySet())
+ {
+ _logger.debug("Property: " + entry.getKey() + " Value: " + entry.getValue());
+ }
+
+ _logger.debug("End of property dump");
+ }
+
+ productName = readPropertyValue(props, PRODUCT_NAME_PROPERTY);
+ releaseVersion = readPropertyValue(props, RELEASE_VERSION_PROPERTY);
+ buildVersion = readPropertyValue(props, BUILD_VERSION_PROPERTY);
+ }
+ }
+ catch (IOException e)
+ {
+ // Log a warning about this and leave the values initialized to unknown.
+ _logger.error("Could not load version.properties resource: " + e, e);
+ }
+ }
+
+ /**
+ * Gets the product name.
+ *
+ * @return The product name.
+ */
+ public static String getProductName()
+ {
+ return productName;
+ }
+
+ /**
+ * Gets the product version.
+ *
+ * @return The product version.
+ */
+ public static String getReleaseVersion()
+ {
+ return releaseVersion;
+ }
+
+ /**
+ * Gets the source code revision.
+ *
+ * @return The source code revision.
+ */
+ public static String getBuildVersion()
+ {
+ return buildVersion;
+ }
+
+ /**
+ * Extracts all of the version information as a printable string.
+ *
+ * @return All of the version information as a printable string.
+ */
+ public static String getVersionString()
+ {
+ return getProductName() + " - " + getReleaseVersion() + " build: " + getBuildVersion();
+ }
+
+ /**
+ * Helper method to extract a named property from properties.
+ *
+ * @param props The properties.
+ * @param propertyName The named property to extract.
+ *
+ * @return The extracted property or a default value if the properties do not contain the named property.
+ *
+ * @todo A bit pointless.
+ */
+ private static String readPropertyValue(Properties props, String propertyName)
+ {
+ String retVal = (String) props.get(propertyName);
+ if (retVal == null)
+ {
+ retVal = DEFAULT;
+ }
+
+ return retVal;
+ }
+
+ /**
+ * Prints the versioning information to the console. This is extremely usefull for identifying Qpid code in the
+ * wild, where the origination of the code has been forgotten.
+ *
+ * @param args Does not require any arguments.
+ */
+ public static void main(String[] args)
+ {
+ System.out.println(getVersionString());
+ }
+}