Indent BrooklynVersion properly
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/b515f38d Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/b515f38d Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/b515f38d Branch: refs/heads/master Commit: b515f38d3e3e4643108c40d4ca46473dfcc49ab5 Parents: 7a3a1f8 Author: Sam Corbett <[email protected]> Authored: Tue May 5 17:14:59 2015 +0100 Committer: Sam Corbett <[email protected]> Committed: Tue Jun 2 17:52:49 2015 +0100 ---------------------------------------------------------------------- .../src/main/java/brooklyn/BrooklynVersion.java | 398 ++++++++++--------- .../test/java/brooklyn/BrooklynVersionTest.java | 96 ++--- 2 files changed, 250 insertions(+), 244 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b515f38d/core/src/main/java/brooklyn/BrooklynVersion.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/BrooklynVersion.java b/core/src/main/java/brooklyn/BrooklynVersion.java index ec71df7..9920b17 100644 --- a/core/src/main/java/brooklyn/BrooklynVersion.java +++ b/core/src/main/java/brooklyn/BrooklynVersion.java @@ -46,201 +46,207 @@ import brooklyn.util.text.Strings; */ public class BrooklynVersion { - private static final Logger log = LoggerFactory.getLogger(BrooklynVersion.class); - - private static final String MVN_VERSION_RESOURCE_FILE = "META-INF/maven/org.apache.brooklyn/brooklyn-core/pom.properties"; - private static final String MANIFEST_PATH = "META-INF/MANIFEST.MF"; - private static final String BROOKLYN_CORE_SYMBOLIC_NAME = "org.apache.brooklyn.core"; - - private static final String MVN_VERSION_PROPERTY_NAME = "version"; - private static final String OSGI_VERSION_PROPERTY_NAME = Attributes.Name.IMPLEMENTATION_VERSION.toString(); - private static final String OSGI_SHA1_PROPERTY_NAME = "Implementation-SHA-1"; - - - private final static String VERSION_FROM_STATIC = "0.7.0-SNAPSHOT"; // BROOKLYN_VERSION - private static final AtomicReference<Boolean> IS_DEV_ENV = new AtomicReference<Boolean>(); - - public static final BrooklynVersion INSTANCE = new BrooklynVersion(); - - private final Properties versionProperties = new Properties(); - - public BrooklynVersion() { - // we read the maven pom metadata and osgi metadata and make sure it's sensible - // everything is put into a single map for now (good enough, but should be cleaned up) - readPropertiesFromMavenResource(BrooklynVersion.class.getClassLoader()); - readPropertiesFromOsgiResource(BrooklynVersion.class.getClassLoader(), BROOKLYN_CORE_SYMBOLIC_NAME); - // TODO there is also build-metadata.properties used in ServerResource /v1/server/version endpoint - // see comments on that about folding it into this class instead - - checkVersions(); - } - - public void checkVersions() { - String mvnVersion = getVersionFromMavenProperties(); - if (mvnVersion!=null && !VERSION_FROM_STATIC.equals(mvnVersion)) { - throw new IllegalStateException("Version error: maven "+mvnVersion+" / code "+VERSION_FROM_STATIC); - } - - String osgiVersion = versionProperties.getProperty(OSGI_VERSION_PROPERTY_NAME); - // TODO does the OSGi version include other slightly differ gubbins/style ? - if (osgiVersion!=null && !VERSION_FROM_STATIC.equals(osgiVersion)) { - throw new IllegalStateException("Version error: osgi "+osgiVersion+" / code "+VERSION_FROM_STATIC); - } - } - - /** Returns version as inferred from classpath/osgi, if possible, or 0.0.0-SNAPSHOT. - * See also {@link #getVersionFromMavenProperties()} and {@link #getVersionFromOsgiManifest()}. - * @deprecated since 0.7.0, in favour of the more specific methods (and does anyone need that default value?) - */ - @Deprecated - public String getVersionFromClasspath() { - String v = getVersionFromMavenProperties(); - if (Strings.isNonBlank(v)) return v; - v = getVersionFromOsgiManifest(); - if (Strings.isNonBlank(v)) return v; - return "0.0.0-SNAPSHOT"; - } - - @Nullable - public String getVersionFromMavenProperties() { - return versionProperties.getProperty(MVN_VERSION_PROPERTY_NAME); - } - - @Nullable - public String getVersionFromOsgiManifest() { - return versionProperties.getProperty(OSGI_VERSION_PROPERTY_NAME); - } - - @Nullable - /** SHA1 of the last commit to brooklyn at the time this build was made. - * For SNAPSHOT builds of course there may have been further non-committed changes. */ - public String getSha1FromOsgiManifest() { - return versionProperties.getProperty(OSGI_SHA1_PROPERTY_NAME); - } - - public String getVersion() { - return VERSION_FROM_STATIC; - } - - public boolean isSnapshot() { - return (getVersion().indexOf("-SNAPSHOT")>=0); - } - - private void readPropertiesFromMavenResource(ClassLoader resourceLoader) { - InputStream versionStream = null; - try { - versionStream = resourceLoader.getResourceAsStream(MVN_VERSION_RESOURCE_FILE); - if (versionStream==null) { - if (isDevelopmentEnvironment()) { - // allowed for dev env - log.trace("No maven resource file "+MVN_VERSION_RESOURCE_FILE+" available"); - } else { - log.warn("No maven resource file "+MVN_VERSION_RESOURCE_FILE+" available"); - } - return; - } - versionProperties.load(checkNotNull(versionStream)); - } catch (IOException e) { - log.warn("Error reading maven resource file "+MVN_VERSION_RESOURCE_FILE+": "+e, e); - } finally { - Streams.closeQuietly(versionStream); + private static final Logger log = LoggerFactory.getLogger(BrooklynVersion.class); + + private static final String MVN_VERSION_RESOURCE_FILE = "META-INF/maven/org.apache.brooklyn/brooklyn-core/pom.properties"; + private static final String MANIFEST_PATH = "META-INF/MANIFEST.MF"; + private static final String BROOKLYN_CORE_SYMBOLIC_NAME = "org.apache.brooklyn.core"; + + private static final String MVN_VERSION_PROPERTY_NAME = "version"; + private static final String OSGI_VERSION_PROPERTY_NAME = Attributes.Name.IMPLEMENTATION_VERSION.toString(); + private static final String OSGI_SHA1_PROPERTY_NAME = "Implementation-SHA-1"; + + private final static String VERSION_FROM_STATIC = "0.7.0-SNAPSHOT"; // BROOKLYN_VERSION + private static final AtomicReference<Boolean> IS_DEV_ENV = new AtomicReference<Boolean>(); + + public static final BrooklynVersion INSTANCE = new BrooklynVersion(); + + private final Properties versionProperties = new Properties(); + + public BrooklynVersion() { + // we read the maven pom metadata and osgi metadata and make sure it's sensible + // everything is put into a single map for now (good enough, but should be cleaned up) + readPropertiesFromMavenResource(BrooklynVersion.class.getClassLoader()); + readPropertiesFromOsgiResource(BrooklynVersion.class.getClassLoader(), BROOKLYN_CORE_SYMBOLIC_NAME); + // TODO there is also build-metadata.properties used in ServerResource /v1/server/version endpoint + // see comments on that about folding it into this class instead + + checkVersions(); + } + + public void checkVersions() { + String mvnVersion = getVersionFromMavenProperties(); + if (mvnVersion != null && !VERSION_FROM_STATIC.equals(mvnVersion)) { + throw new IllegalStateException("Version error: maven " + mvnVersion + " / code " + VERSION_FROM_STATIC); + } + + String osgiVersion = versionProperties.getProperty(OSGI_VERSION_PROPERTY_NAME); + // TODO does the OSGi version include other slightly differ gubbins/style ? + if (osgiVersion != null && !VERSION_FROM_STATIC.equals(osgiVersion)) { + throw new IllegalStateException("Version error: osgi " + osgiVersion + " / code " + VERSION_FROM_STATIC); + } + } + + /** + * Returns version as inferred from classpath/osgi, if possible, or 0.0.0-SNAPSHOT. + * See also {@link #getVersionFromMavenProperties()} and {@link #getVersionFromOsgiManifest()}. + * + * @deprecated since 0.7.0, in favour of the more specific methods (and does anyone need that default value?) + */ + @Deprecated + public String getVersionFromClasspath() { + String v = getVersionFromMavenProperties(); + if (Strings.isNonBlank(v)) return v; + v = getVersionFromOsgiManifest(); + if (Strings.isNonBlank(v)) return v; + return "0.0.0-SNAPSHOT"; + } + + @Nullable + public String getVersionFromMavenProperties() { + return versionProperties.getProperty(MVN_VERSION_PROPERTY_NAME); + } + + @Nullable + public String getVersionFromOsgiManifest() { + return versionProperties.getProperty(OSGI_VERSION_PROPERTY_NAME); + } + + @Nullable + /** SHA1 of the last commit to brooklyn at the time this build was made. + * For SNAPSHOT builds of course there may have been further non-committed changes. */ + public String getSha1FromOsgiManifest() { + return versionProperties.getProperty(OSGI_SHA1_PROPERTY_NAME); + } + + public String getVersion() { + return VERSION_FROM_STATIC; + } + + public boolean isSnapshot() { + return (getVersion().indexOf("-SNAPSHOT") >= 0); + } + + private void readPropertiesFromMavenResource(ClassLoader resourceLoader) { + InputStream versionStream = null; + try { + versionStream = resourceLoader.getResourceAsStream(MVN_VERSION_RESOURCE_FILE); + if (versionStream == null) { + if (isDevelopmentEnvironment()) { + // allowed for dev env + log.trace("No maven resource file " + MVN_VERSION_RESOURCE_FILE + " available"); + } else { + log.warn("No maven resource file " + MVN_VERSION_RESOURCE_FILE + " available"); + } + return; + } + versionProperties.load(checkNotNull(versionStream)); + } catch (IOException e) { + log.warn("Error reading maven resource file " + MVN_VERSION_RESOURCE_FILE + ": " + e, e); + } finally { + Streams.closeQuietly(versionStream); + } + } + + /** + * reads properties from brooklyn-core's manifest + */ + private void readPropertiesFromOsgiResource(ClassLoader resourceLoader, String symbolicName) { + Enumeration<URL> paths; + try { + paths = BrooklynVersion.class.getClassLoader().getResources(MANIFEST_PATH); + } catch (IOException e) { + // shouldn't happen + throw Exceptions.propagate(e); + } + while (paths.hasMoreElements()) { + URL u = paths.nextElement(); + InputStream us = null; + try { + us = u.openStream(); + ManifestHelper mh = Osgis.ManifestHelper.forManifest(us); + if (BROOKLYN_CORE_SYMBOLIC_NAME.equals(mh.getSymbolicName())) { + Attributes attrs = mh.getManifest().getMainAttributes(); + for (Object key : attrs.keySet()) { + // key is an Attribute.Name; toString converts to string + versionProperties.put(key.toString(), attrs.getValue(key.toString())); + } + return; + } + } catch (Exception e) { + Exceptions.propagateIfFatal(e); + log.warn("Error reading OSGi manifest from " + u + " when determining version properties: " + e, e); + } finally { + Streams.closeQuietly(us); + } + } + if (isDevelopmentEnvironment()) { + // allowed for dev env + log.trace("No OSGi manifest available to determine version properties"); + } else { + log.warn("No OSGi manifest available to determine version properties"); + } + } + + /** + * Returns whether this is a Brooklyn dev environment, + * specifically core/target/classes/ is on the classpath for the org.apache.brooklyn.core project. + * <p/> + * In a packaged or library build of Brooklyn (normal usage) this should return false, + * and all OSGi components should be available. + * <p/> + * There is no longer any way to force this, + * such as the old BrooklynDevelopmentMode class; + * but that could easily be added if required (eg as a system property). + */ + public static boolean isDevelopmentEnvironment() { + Boolean isDevEnv = IS_DEV_ENV.get(); + if (isDevEnv != null) return isDevEnv; + synchronized (IS_DEV_ENV) { + isDevEnv = computeIsDevelopmentEnvironment(); + IS_DEV_ENV.set(isDevEnv); + return isDevEnv; + } } - } - - /** reads properties from brooklyn-core's manifest */ - private void readPropertiesFromOsgiResource(ClassLoader resourceLoader, String symbolicName) { - Enumeration<URL> paths; - try { - paths = BrooklynVersion.class.getClassLoader().getResources(MANIFEST_PATH); - } catch (IOException e) { - // shouldn't happen - throw Exceptions.propagate(e); - } - while (paths.hasMoreElements()) { - URL u = paths.nextElement(); - InputStream us = null; - try { - us = u.openStream(); - ManifestHelper mh = Osgis.ManifestHelper.forManifest(us); - if (BROOKLYN_CORE_SYMBOLIC_NAME.equals(mh.getSymbolicName())) { - Attributes attrs = mh.getManifest().getMainAttributes(); - for (Object key: attrs.keySet()) { - // key is an Attribute.Name; toString converts to string - versionProperties.put(key.toString(), attrs.getValue(key.toString())); - } - return; - } - } catch (Exception e) { - Exceptions.propagateIfFatal(e); - log.warn("Error reading OSGi manifest from "+u+" when determining version properties: "+e, e); - } finally { - Streams.closeQuietly(us); - } - } - if (isDevelopmentEnvironment()) { - // allowed for dev env - log.trace("No OSGi manifest available to determine version properties"); - } else { - log.warn("No OSGi manifest available to determine version properties"); - } - } - - /** - * Returns whether this is a Brooklyn dev environment, - * specifically core/target/classes/ is on the classpath for the org.apache.brooklyn.core project. - * <p> - * In a packaged or library build of Brooklyn (normal usage) this should return false, - * and all OSGi components should be available. - * <p> - * There is no longer any way to force this, - * such as the old BrooklynDevelopmentMode class; - * but that could easily be added if required (eg as a system property). - */ - public static boolean isDevelopmentEnvironment() { - Boolean isDevEnv = IS_DEV_ENV.get(); - if (isDevEnv!=null) return isDevEnv; - synchronized (IS_DEV_ENV) { - isDevEnv = computeIsDevelopmentEnvironment(); - IS_DEV_ENV.set(isDevEnv); - return isDevEnv; - } - } - - private static boolean computeIsDevelopmentEnvironment() { - Enumeration<URL> paths; - try { - paths = BrooklynVersion.class.getClassLoader().getResources("brooklyn/BrooklynVersion.class"); - } catch (IOException e) { - // shouldn't happen - throw Exceptions.propagate(e); - } - while (paths.hasMoreElements()) { - URL u = paths.nextElement(); - // running fram a classes directory (including coverage-classes for cobertura) triggers dev env - if (u.getPath().endsWith("classes/brooklyn/BrooklynVersion.class")) { - try { - log.debug("Brooklyn dev/src environment detected: BrooklynVersion class is at: "+u); - return true; - } catch (Exception e) { - Exceptions.propagateIfFatal(e); - log.warn("Error reading manifest to determine whether this is a development environment: "+e, e); - } - } - } - return false; - } - - public void logSummary() { - log.debug("Brooklyn version "+getVersion()+" (git SHA1 "+getSha1FromOsgiManifest()+")"); - } - - /** @deprecated since 0.7.0, redundant with {@link #get()} */ @Deprecated - public static String getVersionFromStatic() { - return VERSION_FROM_STATIC; - } - - public static String get() { - return INSTANCE.getVersion(); - } - + + private static boolean computeIsDevelopmentEnvironment() { + Enumeration<URL> paths; + try { + paths = BrooklynVersion.class.getClassLoader().getResources("brooklyn/BrooklynVersion.class"); + } catch (IOException e) { + // shouldn't happen + throw Exceptions.propagate(e); + } + while (paths.hasMoreElements()) { + URL u = paths.nextElement(); + // running fram a classes directory (including coverage-classes for cobertura) triggers dev env + if (u.getPath().endsWith("classes/brooklyn/BrooklynVersion.class")) { + try { + log.debug("Brooklyn dev/src environment detected: BrooklynVersion class is at: " + u); + return true; + } catch (Exception e) { + Exceptions.propagateIfFatal(e); + log.warn("Error reading manifest to determine whether this is a development environment: " + e, e); + } + } + } + return false; + } + + public void logSummary() { + log.debug("Brooklyn version " + getVersion() + " (git SHA1 " + getSha1FromOsgiManifest() + ")"); + } + + /** + * @deprecated since 0.7.0, redundant with {@link #get()} + */ + @Deprecated + public static String getVersionFromStatic() { + return VERSION_FROM_STATIC; + } + + public static String get() { + return INSTANCE.getVersion(); + } + } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b515f38d/core/src/test/java/brooklyn/BrooklynVersionTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/BrooklynVersionTest.java b/core/src/test/java/brooklyn/BrooklynVersionTest.java index 3bc0a19..bfd32ce 100644 --- a/core/src/test/java/brooklyn/BrooklynVersionTest.java +++ b/core/src/test/java/brooklyn/BrooklynVersionTest.java @@ -31,52 +31,52 @@ import brooklyn.util.text.Strings; public class BrooklynVersionTest { - private static final Logger log = LoggerFactory.getLogger(BrooklynVersionTest.class); - - @Test - public void testGetVersion() { - assertEquals(BrooklynVersion.get(), BrooklynVersion.INSTANCE.getVersion()); - } - - @Test - public void testGetHardcodedClasspathVersion() { - @SuppressWarnings("deprecation") - String v = BrooklynVersion.INSTANCE.getVersionFromClasspath(); - Assert.assertTrue(BrooklynVersion.get().equals(v) || "0.0.0-SNAPSHOT".equals(v), v); - } - - @Test - public void testGetFromMaven() { - String v = BrooklynVersion.INSTANCE.getVersionFromMavenProperties(); - Assert.assertTrue(v==null || BrooklynVersion.get().equals(v), v); - } - - @Test - public void testGetFromOsgi() { - String v = BrooklynVersion.INSTANCE.getVersionFromOsgiManifest(); - Assert.assertTrue(v==null || BrooklynVersion.get().equals(v), v); - } - - @Test - public void testGetOsgiSha1() { - String sha1 = BrooklynVersion.INSTANCE.getSha1FromOsgiManifest(); - log.info("sha1: "+sha1); - if (Strings.isNonBlank(sha1) || BrooklynVersion.isDevelopmentEnvironment()) - return; - // we might not have a SHA1 if it's a standalone (non-git) source build; just log warn in that case - log.warn("This build does not have git SHA1 information."); - // (can't assert anything, except that sha1 lookup doesn't NPE) - } - - @Test - public void testDevEnv() { - URL sp = getClass().getClassLoader().getResource("brooklyn/config/sample.properties"); - if (sp==null) Assert.fail("Can't find test resources"); - - log.info("Test for dev env: "+"Dev env? "+BrooklynVersion.isDevelopmentEnvironment()+"; path "+sp); - boolean testResourcePathInClasses = sp.getPath().endsWith("classes/brooklyn/config/sample.properties"); - Assert.assertEquals(testResourcePathInClasses, BrooklynVersion.isDevelopmentEnvironment(), - "Dev env? "+BrooklynVersion.isDevelopmentEnvironment()+"; but resource path: "+sp); - } - + private static final Logger log = LoggerFactory.getLogger(BrooklynVersionTest.class); + + @Test + public void testGetVersion() { + assertEquals(BrooklynVersion.get(), BrooklynVersion.INSTANCE.getVersion()); + } + + @Test + public void testGetHardcodedClasspathVersion() { + @SuppressWarnings("deprecation") + String v = BrooklynVersion.INSTANCE.getVersionFromClasspath(); + Assert.assertTrue(BrooklynVersion.get().equals(v) || "0.0.0-SNAPSHOT".equals(v), v); + } + + @Test + public void testGetFromMaven() { + String v = BrooklynVersion.INSTANCE.getVersionFromMavenProperties(); + Assert.assertTrue(v == null || BrooklynVersion.get().equals(v), v); + } + + @Test + public void testGetFromOsgi() { + String v = BrooklynVersion.INSTANCE.getVersionFromOsgiManifest(); + Assert.assertTrue(v == null || BrooklynVersion.get().equals(v), v); + } + + @Test + public void testGetOsgiSha1() { + String sha1 = BrooklynVersion.INSTANCE.getSha1FromOsgiManifest(); + log.info("sha1: " + sha1); + if (Strings.isNonBlank(sha1) || BrooklynVersion.isDevelopmentEnvironment()) + return; + // we might not have a SHA1 if it's a standalone (non-git) source build; just log warn in that case + log.warn("This build does not have git SHA1 information."); + // (can't assert anything, except that sha1 lookup doesn't NPE) + } + + @Test + public void testDevEnv() { + URL sp = getClass().getClassLoader().getResource("brooklyn/config/sample.properties"); + if (sp == null) Assert.fail("Can't find test resources"); + + log.info("Test for dev env: " + "Dev env? " + BrooklynVersion.isDevelopmentEnvironment() + "; path " + sp); + boolean testResourcePathInClasses = sp.getPath().endsWith("classes/brooklyn/config/sample.properties"); + Assert.assertEquals(testResourcePathInClasses, BrooklynVersion.isDevelopmentEnvironment(), + "Dev env? " + BrooklynVersion.isDevelopmentEnvironment() + "; but resource path: " + sp); + } + }
