<!-- public artifacts to be deployed to central repository -->
<module>sonar-application</module>
<module>sonar-batch</module>
- <module>sonar-batch-bootstrapper</module>
<module>sonar-batch-maven-compat</module>
<module>sonar-channel</module>
<module>sonar-check-api</module>
+++ /dev/null
--Djava.awt.headless=true
\ No newline at end of file
+++ /dev/null
-# These tests fail in Eclipse. Until they are fixed, let's ignore them
-
-.*BootstrapperVersionTest
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.codehaus.sonar</groupId>
- <artifactId>sonar</artifactId>
- <version>3.3-SNAPSHOT</version>
- </parent>
-
- <artifactId>sonar-batch-bootstrapper</artifactId>
- <name>Sonar :: Batch Bootstrapper</name>
- <description>Provides API to bootstrap Sonar Batch.</description>
-
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.easytesting</groupId>
- <artifactId>fest-assert</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- <build>
- <resources>
- <resource>
- <directory>src/main/resources</directory>
- <filtering>true</filtering>
- </resource>
- </resources>
- </build>
-</project>
+++ /dev/null
-/*
- * Sonar, open source software quality management tool.
- * Copyright (C) 2008-2012 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * Sonar is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * Sonar is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with Sonar; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
- */
-package org.sonar.batch.bootstrapper;
-
-import java.io.IOException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.Enumeration;
-
-/**
- * Special {@link URLClassLoader} to execute Sonar, which restricts loading from parent.
- */
-public class BootstrapClassLoader extends URLClassLoader {
-
- private final String[] unmaskedPackages;
-
- public BootstrapClassLoader(ClassLoader parent, String... unmaskedPackages) {
- super(new URL[0], parent);
- this.unmaskedPackages = unmaskedPackages;
- }
-
- /**
- * {@inheritDoc} Visibility of a method has been relaxed to public.
- */
- @Override
- public void addURL(URL url) {
- super.addURL(url);
- }
-
- /**
- * {@inheritDoc} Visibility of a method has been relaxed to public.
- */
- @Override
- public Class<?> findClass(String name) throws ClassNotFoundException {
- return super.findClass(name);
- }
-
- /**
- * @return true, if class can be loaded from parent ClassLoader
- */
- boolean canLoadFromParent(String name) {
- for (String pkg : unmaskedPackages) {
- if (name.startsWith(pkg + ".")) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Same behavior as in {@link URLClassLoader#loadClass(String, boolean)}, except loading from parent.
- */
- @Override
- protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
- // First, check if the class has already been loaded
- Class<?> c = findLoadedClass(name);
- if (c == null) {
- try {
- // Load from parent
- if (getParent() != null && canLoadFromParent(name)) {
- c = getParent().loadClass(name);
- } else {
- // Load from system
-
- // I don't know for other vendors, but for Oracle JVM :
- // - ClassLoader.getSystemClassLoader() is sun.misc.Launcher$AppClassLoader. It contains app classpath.
- // - ClassLoader.getSystemClassLoader().getParent() is sun.misc.Launcher$ExtClassLoader. It contains core JVM
- ClassLoader systemClassLoader = getSystemClassLoader();
- if (systemClassLoader.getParent() != null) {
- systemClassLoader = systemClassLoader.getParent();
- }
- c = systemClassLoader.loadClass(name);
- }
- } catch (ClassNotFoundException e) {
- // If still not found, then invoke findClass in order
- // to find the class.
- c = findClass(name);
- }
- }
- if (resolve) {
- resolveClass(c);
- }
- return c;
- }
-
- /**
- * Unlike {@link URLClassLoader#getResource(String)} don't return resource from parent.
- * See http://jira.codehaus.org/browse/SONAR-2276
- */
- @Override
- public URL getResource(String name) {
- return findResource(name);
- }
-
- /**
- * Unlike {@link URLClassLoader#getResources(String)} don't return resources from parent.
- * See http://jira.codehaus.org/browse/SONAR-2276
- */
- @Override
- public Enumeration<URL> getResources(String name) throws IOException {
- return findResources(name);
- }
-
-}
+++ /dev/null
-/*
- * Sonar, open source software quality management tool.
- * Copyright (C) 2008-2012 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * Sonar is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * Sonar is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with Sonar; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
- */
-package org.sonar.batch.bootstrapper;
-
-public class BootstrapException extends RuntimeException {
-
- public BootstrapException(String message) {
- super(message);
- }
-
- public BootstrapException(Throwable cause) {
- super(cause);
- }
-
- public BootstrapException(String message, Throwable cause) {
- super(message, cause);
- }
-
-}
+++ /dev/null
-/*
- * Sonar, open source software quality management tool.
- * Copyright (C) 2008-2012 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * Sonar is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * Sonar is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with Sonar; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
- */
-package org.sonar.batch.bootstrapper;
-
-import java.io.*;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-
-public class Bootstrapper {
-
- private static final String VERSION_PATH = "/api/server/version";
- private static final String BATCH_PATH = "/batch/";
-
- public static final int CONNECT_TIMEOUT_MILLISECONDS = 30000;
- public static final int READ_TIMEOUT_MILLISECONDS = 60000;
-
- private File bootDir;
- private String serverUrl;
- private String productToken;
- private String serverVersion;
-
- /**
- * @param productToken part of User-Agent request-header field - see http://tools.ietf.org/html/rfc1945#section-10.15
- */
- public Bootstrapper(String productToken, String serverUrl, File workDir) {
- this.productToken = productToken;
- bootDir = new File(workDir, "batch");
- bootDir.mkdirs();
- if (serverUrl.endsWith("/")) {
- this.serverUrl = serverUrl.substring(0, serverUrl.length() - 1);
- } else {
- this.serverUrl = serverUrl;
- }
- }
-
- /**
- * @return server url
- */
- public String getServerUrl() {
- return serverUrl;
- }
-
- /**
- * @return server version
- */
- public String getServerVersion() {
- if (serverVersion == null) {
- try {
- serverVersion = remoteContent(VERSION_PATH);
- } catch (IOException e) {
- throw new BootstrapException(e.getMessage(), e);
- }
- }
- return serverVersion;
- }
-
- /**
- * Download batch files from server and creates {@link BootstrapClassLoader}.
- * To use this method version of Sonar should be at least 2.6.
- *
- * @param urls additional URLs for loading classes and resources
- * @param parent parent ClassLoader
- * @param unmaskedPackages only classes and resources from those packages would be available for loading from parent
- */
- public BootstrapClassLoader createClassLoader(URL[] urls, ClassLoader parent, String... unmaskedPackages) {
- BootstrapClassLoader classLoader = new BootstrapClassLoader(parent, unmaskedPackages);
- List<File> files = downloadBatchFiles();
- for (URL url : urls) {
- classLoader.addURL(url);
- }
- for (File file : files) {
- try {
- classLoader.addURL(file.toURI().toURL());
- } catch (MalformedURLException e) {
- throw new BootstrapException(e);
- }
- }
- return classLoader;
- }
-
- private void remoteContentToFile(String path, File toFile) {
- InputStream input = null;
- FileOutputStream output = null;
- String fullUrl = serverUrl + path;
- try {
- HttpURLConnection connection = newHttpConnection(new URL(fullUrl));
- output = new FileOutputStream(toFile, false);
- input = connection.getInputStream();
- BootstrapperIOUtils.copyLarge(input, output);
- } catch (IOException e) {
- BootstrapperIOUtils.closeQuietly(output);
- BootstrapperIOUtils.deleteFileQuietly(toFile);
- throw new BootstrapException("Fail to download the file: " + fullUrl, e);
- } finally {
- BootstrapperIOUtils.closeQuietly(input);
- BootstrapperIOUtils.closeQuietly(output);
- }
- }
-
- String remoteContent(String path) throws IOException {
- String fullUrl = serverUrl + path;
- HttpURLConnection conn = newHttpConnection(new URL(fullUrl));
- Reader reader = new InputStreamReader((InputStream) conn.getContent());
- try {
- int statusCode = conn.getResponseCode();
- if (statusCode != HttpURLConnection.HTTP_OK) {
- throw new IOException("Status returned by url : '" + fullUrl + "' is invalid : " + statusCode);
- }
- return BootstrapperIOUtils.toString(reader);
- } finally {
- BootstrapperIOUtils.closeQuietly(reader);
- conn.disconnect();
- }
- }
-
- /**
- * By convention, the product tokens are listed in order of their significance for identifying the application.
- */
- String getUserAgent() {
- return "sonar-bootstrapper/" + BootstrapperVersion.getVersion() + " " + productToken;
- }
-
- HttpURLConnection newHttpConnection(URL url) throws IOException {
- HttpURLConnection connection = (HttpURLConnection) url.openConnection();
- connection.setConnectTimeout(CONNECT_TIMEOUT_MILLISECONDS);
- connection.setReadTimeout(READ_TIMEOUT_MILLISECONDS);
- connection.setInstanceFollowRedirects(true);
- connection.setRequestMethod("GET");
- connection.setRequestProperty("User-Agent", getUserAgent());
- return connection;
- }
-
- private List<File> downloadBatchFiles() {
- try {
- List<File> files = new ArrayList<File>();
- String libs = remoteContent(BATCH_PATH);
- for (String lib : libs.split(",")) {
- File file = new File(bootDir, lib);
- remoteContentToFile(BATCH_PATH + lib, file);
- files.add(file);
- }
- return files;
- } catch (Exception e) {
- throw new BootstrapException(e);
- }
- }
-}
+++ /dev/null
-/*
- * Sonar, open source software quality management tool.
- * Copyright (C) 2008-2012 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * Sonar is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * Sonar is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with Sonar; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
- */
-package org.sonar.batch.bootstrapper;
-
-import java.io.*;
-
-public final class BootstrapperIOUtils {
-
- private BootstrapperIOUtils() {
- // only static methods
- }
-
- /**
- * The default buffer size to use.
- */
- private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
-
- /**
- * Unconditionally close a <code>Closeable</code>.
- */
- public static void closeQuietly(Closeable closeable) {
- try {
- if (closeable != null) {
- closeable.close();
- }
- } catch (IOException ioe) { // NOSONAR
- }
- }
-
- /**
- * Get the contents of a <code>Reader</code> as a String.
- */
- public static String toString(Reader input) throws IOException {
- StringWriter sw = new StringWriter();
- copyLarge(input, sw);
- return sw.toString();
- }
-
- /**
- * Copy bytes from an <code>InputStream</code> to an <code>OutputStream</code>.
- */
- public static long copyLarge(InputStream input, OutputStream output) throws IOException {
- byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
- long count = 0;
- int n = 0;
- while (-1 != (n = input.read(buffer))) {
- output.write(buffer, 0, n);
- count += n;
- }
- return count;
- }
-
- /**
- * Copy chars from a <code>Reader</code> to a <code>Writer</code>.
- */
- public static long copyLarge(Reader input, Writer output) throws IOException {
- char[] buffer = new char[DEFAULT_BUFFER_SIZE];
- long count = 0;
- int n = 0;
- while (-1 != (n = input.read(buffer))) {
- output.write(buffer, 0, n);
- count += n;
- }
- return count;
- }
-
- /**
- * Deletes a file (not a directory).
- */
- public static boolean deleteFileQuietly(File file) {
- if (file == null) {
- return false;
- }
- try {
- return file.delete();
- } catch (Exception e) {
- return false;
- }
- }
-
-}
+++ /dev/null
-/*
- * Sonar, open source software quality management tool.
- * Copyright (C) 2008-2012 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * Sonar is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * Sonar is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with Sonar; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
- */
-package org.sonar.batch.bootstrapper;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
-
-public enum BootstrapperVersion {
-
- INSTANCE;
-
- private static final String PROPERTIES_PATH = "/org/sonar/batch/bootstrapper/version.txt";
- private String version;
-
- public static String getVersion() {
- return INSTANCE.version;
- }
-
- private BootstrapperVersion() {
- InputStream input = getClass().getResourceAsStream(PROPERTIES_PATH);
- try {
- Properties properties = new Properties();
- properties.load(input);
- this.version = properties.getProperty("version");
-
- } catch (IOException e) {
- // Can not load the version
- this.version = "";
-
- } finally {
- BootstrapperIOUtils.closeQuietly(input);
- }
- }
-}
+++ /dev/null
-/*
- * Sonar, open source software quality management tool.
- * Copyright (C) 2008-2012 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * Sonar is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * Sonar is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with Sonar; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
- */
-
-/**
- * Provides API to bootstrap Sonar Batch.
- */
-package org.sonar.batch.bootstrapper;
\ No newline at end of file
+++ /dev/null
-version=${project.version}
+++ /dev/null
-/*
- * Sonar, open source software quality management tool.
- * Copyright (C) 2008-2012 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * Sonar is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * Sonar is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with Sonar; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
- */
-package org.sonar.batch.bootstrapper;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-
-import static org.fest.assertions.Assertions.assertThat;
-
-public class BootstrapClassLoaderTest {
-
- @Rule
- public ExpectedException thrown = ExpectedException.none();
-
- @Test
- public void shouldRestrictLoadingFromParent() throws Exception {
- BootstrapClassLoader classLoader = new BootstrapClassLoader(getClass().getClassLoader(), "org.sonar.ant");
- assertThat(classLoader.canLoadFromParent("org.sonar.ant.Launcher")).isTrue();
- assertThat(classLoader.canLoadFromParent("org.objectweb.asm.ClassVisitor")).isFalse();
- }
-
- @Test
- public void use_isolated_system_classloader_when_parent_is_excluded() throws ClassNotFoundException {
- thrown.expect(ClassNotFoundException.class);
- thrown.expectMessage("org.junit.Test");
- ClassLoader parent = getClass().getClassLoader();
- BootstrapClassLoader classLoader = new BootstrapClassLoader(parent);
-
- // JUnit is available in the parent classloader (classpath used to execute this test) but not in the core JVM
- assertThat(classLoader.loadClass("java.lang.String", false)).isNotNull();
- classLoader.loadClass("org.junit.Test", false);
- }
-
- @Test
- public void find_in_parent_when_matches_unmasked_packages() throws ClassNotFoundException {
- ClassLoader parent = getClass().getClassLoader();
- BootstrapClassLoader classLoader = new BootstrapClassLoader(parent, "org.junit");
-
- // JUnit is available in the parent classloader (classpath used to execute this test) but not in the core JVM
- assertThat(classLoader.loadClass("org.junit.Test", false)).isNotNull();
- }
-}
+++ /dev/null
-/*
- * Sonar, open source software quality management tool.
- * Copyright (C) 2008-2012 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * Sonar is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * Sonar is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with Sonar; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
- */
-package org.sonar.batch.bootstrapper;
-
-import org.junit.Test;
-
-import java.io.File;
-import java.io.IOException;
-
-import static org.fest.assertions.Assertions.assertThat;
-
-public class BootstrapperTest {
-
- @Test
- public void shouldRemoveLastUrlSlash() {
- Bootstrapper bootstrapper = new Bootstrapper("", "http://test/", new File("target"));
- assertThat(bootstrapper.getServerUrl()).isEqualTo("http://test");
- }
-
- @Test(expected = Exception.class)
- public void shouldFailIfCanNotConnectServer() {
- Bootstrapper bootstrapper = new Bootstrapper("", "http://unknown.foo", new File("target"));
- bootstrapper.getServerVersion();
- }
-
- @Test
- public void shouldReturnUserAgent() {
- Bootstrapper bootstrapper = new Bootstrapper("test/0.1", "http://unknown.foo", new File("target"));
- String userAgent = bootstrapper.getUserAgent();
-
- assertThat(userAgent.length()).isGreaterThan(0);
- assertThat(userAgent).startsWith("sonar-bootstrapper/");
- assertThat(userAgent).endsWith(" test/0.1");
- }
-
- @Test
- public void shouldReturnValidVersion() {
- Bootstrapper bootstrapper = new Bootstrapper("", "http://test", new File("target")) {
- @Override
- String remoteContent(String path) throws IOException {
- return "2.6";
- }
- };
- assertThat(bootstrapper.getServerVersion()).isEqualTo("2.6");
- }
-
-}
+++ /dev/null
-/*
- * Sonar, open source software quality management tool.
- * Copyright (C) 2008-2012 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * Sonar is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * Sonar is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with Sonar; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
- */
-package org.sonar.batch.bootstrapper;
-
-import org.junit.Test;
-
-import static org.fest.assertions.Assertions.assertThat;
-
-public class BootstrapperVersionTest {
-
- @Test
- public void shouldLoadVersion() {
- String version = BootstrapperVersion.getVersion();
- assertThat(version).contains(".");
- assertThat(version).doesNotContain("$");
- }
-
-}