diff --git a/README.md b/README.md
index 4e18b55387..a4c78f000d 100644
--- a/README.md
+++ b/README.md
@@ -3,14 +3,6 @@
This project explores common infrastructure and best practices for open source
Java projects for the Google Cloud Platform (GCP).
-# Google Cloud Platform Java Dependency Dashboard
-
-[Google Cloud Platform Java Dependency Dashboard](
-https://storage.googleapis.com/cloud-opensource-java-dashboard/com.google.cloud/libraries-bom/snapshot/index.html)
-(runs daily; work in progress) shows multiple checks on the consistency among
-Google Cloud Java libraries. For manually generating the dashboard, see
-[its README](./dashboard/README.md).
-
# Google Best Practices for Java Libraries
[Google Best Practices for Java Libraries](https://googlecloudplatform.github.io/cloud-opensource-java/)
@@ -43,6 +35,8 @@ The [GCP Libraries BOM](https://cloud.google.com/java/docs/bom) is a Bill-of-Mat
provides consistent versions of Google Cloud Java libraries that work together
without linkage errors.
+This has moved to https://github.com/googleapis/java-cloud-bom/tree/main/libraries-bom.
+
# Development
This project is built using _Maven_.
@@ -62,5 +56,3 @@ This project is built using _Maven_.
This is not an officially supported Google product.
-
-
diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml
deleted file mode 100644
index 0fbd96533f..0000000000
--- a/boms/cloud-oss-bom/pom.xml
+++ /dev/null
@@ -1,288 +0,0 @@
-
-
- 4.0.0
-
- com.google.cloud
- libraries-bom
- 25.3.1-SNAPSHOT
- pom
-
- Google Cloud Platform Supported Libraries
-
- A compatible set of Google Cloud open source libraries.
- Document: https://cloud.google.com/java/docs/bom
-
- https://cloud.google.com/java/docs/bom
-
- Google LLC
- https://cloud.google.com
-
- 2019
-
-
- Elliotte Rusty Harold
-
-
-
-
- https://github.com/GoogleCloudPlatform/cloud-opensource-java/issues
-
-
- scm:git:git@github.com:GoogleCloudPlatform/cloud-opensource-java.git
- scm:git:git@github.com:GoogleCloudPlatform/cloud-opensource-java.git
-
- https://github.com/GoogleCloudPlatform/cloud-opensource-java/boms/cloud-oss-bom
- HEAD
-
-
-
-
- The Apache License, Version 2.0
- http://www.apache.org/licenses/LICENSE-2.0.txt
-
-
-
-
- UTF-8
- 31.1-jre
- 2.9.0
- 0.174.0
- 2.6.0
- 1.45.1
- 1.41.7
- 3.19.4
-
- 2.16.0
- 0.101.0
- 1.6.0
- 2.1.5
- 2.8.3
- 1.3.1
-
-
-
-
- sonatype-nexus-snapshots
- Sonatype Nexus Snapshots
- https://oss.sonatype.org/content/repositories/snapshots/
-
-
-
-
-
-
-
- com.google.guava
- guava
- ${guava.version}
-
-
- com.google.guava
- guava-testlib
- ${guava.version}
-
-
- com.google.code.gson
- gson
- ${gson.version}
-
-
-
- com.google.protobuf
- protobuf-bom
- ${protobuf.version}
- pom
- import
-
-
-
-
- com.google.http-client
- google-http-client
- ${http.version}
-
-
- com.google.http-client
- google-http-client-android
- ${http.version}
-
-
- com.google.http-client
- google-http-client-apache-v2
- ${http.version}
-
-
- com.google.http-client
- google-http-client-appengine
- ${http.version}
-
-
- com.google.http-client
- google-http-client-gson
- ${http.version}
-
-
- com.google.http-client
- google-http-client-jackson2
- ${http.version}
-
-
- com.google.http-client
- google-http-client-protobuf
- ${http.version}
-
-
- com.google.http-client
- google-http-client-test
- ${http.version}
-
-
- com.google.http-client
- google-http-client-xml
- ${http.version}
-
-
-
-
- io.grpc
- grpc-alts
- ${io.grpc.version}
-
-
- io.grpc
- grpc-api
- ${io.grpc.version}
-
-
- io.grpc
- grpc-auth
- ${io.grpc.version}
-
-
- io.grpc
- grpc-context
- ${io.grpc.version}
-
-
- io.grpc
- grpc-core
- ${io.grpc.version}
-
-
- io.grpc
- grpc-grpclb
- ${io.grpc.version}
-
-
- io.grpc
- grpc-netty
- ${io.grpc.version}
-
-
- io.grpc
- grpc-netty-shaded
- ${io.grpc.version}
-
-
- io.grpc
- grpc-okhttp
- ${io.grpc.version}
-
-
- io.grpc
- grpc-protobuf
- ${io.grpc.version}
-
-
- io.grpc
- grpc-protobuf-lite
- ${io.grpc.version}
-
-
- io.grpc
- grpc-services
- ${io.grpc.version}
-
-
- io.grpc
- grpc-stub
- ${io.grpc.version}
-
-
- io.grpc
- grpc-testing
- ${io.grpc.version}
-
-
-
-
- com.google.cloud
- google-cloud-bom
- ${google.cloud.bom.version}
- pom
- import
-
-
-
- com.google.api
- api-common
- ${api-common.version}
-
-
- com.google.api
- gax
- ${gax.version}
-
-
- com.google.api
- gax-grpc
- ${gax.version}
-
-
- com.google.api
- gax-httpjson
- ${gax.httpjson.version}
-
-
- com.google.auth
- google-auth-library-bom
- ${auth.version}
- pom
- import
-
-
- com.google.cloud
- google-cloud-core-bom
- ${google.cloud.core.version}
- pom
- import
-
-
- com.google.api.grpc
- proto-google-common-protos
- ${common.protos.version}
-
-
- com.google.api.grpc
- grpc-google-common-protos
- ${common.protos.version}
-
-
- com.google.api.grpc
- proto-google-iam-v1
- ${iam.protos.version}
-
-
- com.google.api.grpc
- grpc-google-iam-v1
- ${iam.protos.version}
-
-
-
-
-
-
diff --git a/boms/pom.xml b/boms/pom.xml
index 507915a380..5aa20037ba 100644
--- a/boms/pom.xml
+++ b/boms/pom.xml
@@ -29,7 +29,6 @@
- cloud-oss-bomcloud-lts-bomupper-bounds-checkintegration-tests
diff --git a/dashboard/README.md b/dashboard/README.md
deleted file mode 100644
index 9e83166283..0000000000
--- a/dashboard/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-To generate the dashboard from the root directory run:
-
-```
-$ mvn clean install
-$ cd dashboard
-$ mvn exec:java -Dexec.arguments="-f ../boms/cloud-oss-bom/pom.xml"
-```
diff --git a/dashboard/pom.xml b/dashboard/pom.xml
deleted file mode 100644
index 932ec0e4f3..0000000000
--- a/dashboard/pom.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-
-
- 4.0.0
-
- com.google.cloud.tools
- dependencies-parent
- 1.5.16-SNAPSHOT
-
- dashboard
-
- Cloud Tools Open Source Code Hygiene Dashboard
- https://github.com/GoogleCloudPlatform/cloud-opensource-java/dashboard
-
- Google LLC.
- https://www.google.com
-
-
-
-
- The Apache License, Version 2.0
- http://www.apache.org/licenses/LICENSE-2.0.txt
-
-
-
-
- UTF-8
- 1.8
- 1.8
-
-
-
-
- org.freemarker
- freemarker
- 2.3.31
-
-
- com.google.guava
- guava
-
-
- ${project.groupId}
- dependencies
- ${project.version}
-
-
-
- xom
- xom
- 1.3.7
- test
-
-
- junit
- junit
- test
-
-
- com.google.truth
- truth
- test
-
-
-
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
-
- false
- com.google.cloud.tools.opensource.dashboard.DashboardMain
-
-
-
-
-
-
diff --git a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactCache.java b/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactCache.java
deleted file mode 100644
index ec12246c52..0000000000
--- a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactCache.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2018 Google LLC.
- *
- * Licensed 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 com.google.cloud.tools.opensource.dashboard;
-
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.aether.artifact.Artifact;
-
-import com.google.cloud.tools.opensource.dependencies.DependencyGraph;
-
-/**
- * Unified return type to bundle a lot of information about multiple artifacts together.
- */
-class ArtifactCache {
-
- private Map infoMap;
- private List globalDependencies;
-
- void setInfoMap(Map infoMap) {
- this.infoMap = infoMap;
- }
-
- void setGlobalDependencies(List globalDependencies) {
- this.globalDependencies = globalDependencies;
- }
-
- Map getInfoMap() {
- return infoMap;
- }
-
- List getGlobalDependencies() {
- return globalDependencies;
- }
-
-}
diff --git a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactInfo.java b/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactInfo.java
deleted file mode 100644
index 1bf711c88e..0000000000
--- a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactInfo.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2018 Google LLC.
- *
- * Licensed 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 com.google.cloud.tools.opensource.dashboard;
-
-import org.eclipse.aether.RepositoryException;
-
-import com.google.cloud.tools.opensource.dependencies.DependencyGraph;
-
-/**
- * Cache of info looked up for an artifact.
- */
-class ArtifactInfo {
-
- private DependencyGraph completeDependencies;
- private DependencyGraph transitiveDependencies;
- private RepositoryException exception;
-
- ArtifactInfo(DependencyGraph completeDependencies,
- DependencyGraph transitiveDependencies) {
- this.completeDependencies = completeDependencies;
- this.transitiveDependencies = transitiveDependencies;
- }
-
- ArtifactInfo(RepositoryException ex) {
- this.exception = ex;
- }
-
- DependencyGraph getCompleteDependencies() {
- return completeDependencies;
- }
-
- DependencyGraph getTransitiveDependencies() {
- return transitiveDependencies;
- }
-
- RepositoryException getException() {
- return exception;
- }
-
-}
diff --git a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactResults.java b/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactResults.java
deleted file mode 100644
index da528a2f84..0000000000
--- a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactResults.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2018 Google LLC.
- *
- * Licensed 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 com.google.cloud.tools.opensource.dashboard;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.annotation.Nullable;
-
-import org.eclipse.aether.artifact.Artifact;
-
-import com.google.cloud.tools.opensource.dependencies.Artifacts;
-
-/**
- * Collection of test results for a single artifact.
- */
-public final class ArtifactResults {
-
- private final Map results = new HashMap<>();
- private final Artifact artifact;
- private String exceptionMessage;
-
- public ArtifactResults(Artifact artifact) {
- this.artifact = artifact;
- }
-
- public void setExceptionMessage(String exceptionMessage) {
- this.exceptionMessage = exceptionMessage;
- }
-
- void addResult(String testName, int failures) {
- results.put(testName, failures);
- }
-
- /**
- * @return true for pass, false for fail, null for unknown test
- */
- @Nullable
- public Boolean getResult(String testName) {
- Integer failures = results.get(testName);
- if (failures != null) {
- return failures == 0;
- }
- return null;
- }
-
- public String getCoordinates() {
- return Artifacts.toCoordinates(artifact);
- }
-
- /**
- * @return message of exception occurred when running test, null for no exception
- */
- @Nullable
- public String getExceptionMessage() {
- return exceptionMessage;
- }
-
- /**
- *
- * @return number of times the specified test failed. Returns 0
- * if the test was not run.
- */
- public int getFailureCount(String testName) {
- Integer failures = results.get(testName);
- if (failures == null) {
- return 0;
- }
- return failures;
- }
-}
diff --git a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardArguments.java b/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardArguments.java
deleted file mode 100644
index 6dda1bb91a..0000000000
--- a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardArguments.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright 2019 Google LLC.
- *
- * Licensed 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 com.google.cloud.tools.opensource.dashboard;
-
-import com.google.common.collect.ImmutableList;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.annotation.Nullable;
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.DefaultParser;
-import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.OptionGroup;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-
-/**
- * Command-line option for {@link DashboardMain}. The tool takes either a pom.xml file path or Maven
- * coordinates for a BOM.
- */
-final class DashboardArguments {
- private static final Options options = configureOptions();
- private static final HelpFormatter helpFormatter = new HelpFormatter();
-
- private static final ImmutableList validDependencyMediationValues =
- ImmutableList.of("maven", "gradle");
-
- private final CommandLine commandLine;
-
- private DashboardArguments(CommandLine commandLine) {
- this.commandLine = commandLine;
- }
-
- /**
- * Returns true if the argument for a file is specified. False if the argument for coordinates is
- * specified.
- *
- *
It is guaranteed that either a file path or Maven coordinates for a BOM are available.
- */
- boolean hasFile() {
- return commandLine.hasOption('f');
- }
-
- /**
- * Returns true if the argument for a versionless coordinates is specified; otherwise false.
- *
- *
It is guaranteed that either a file path or Maven coordinates for a BOM are available.
- */
- boolean hasVersionlessCoordinates() {
- return commandLine.hasOption('a');
- }
-
- /** Returns an absolute path to pom.xml file of a BOM. Null if file is not specified. */
- @Nullable
- Path getBomFile() {
- if (!commandLine.hasOption('f')) {
- return null;
- }
- // Trim the value so that maven exec plugin can pass arguments with exec.arguments="-f pom.xml"
- return Paths.get(commandLine.getOptionValue('f').trim()).toAbsolutePath();
- }
-
- /** Returns the Maven coordinates of a BOM. Null if coordinates are not specified. */
- @Nullable
- String getBomCoordinates() {
- if (!commandLine.hasOption('c')) {
- return null;
- }
- return commandLine.getOptionValue('c').trim();
- }
-
- /**
- * Returns the versionless Maven coordinates of a BOM. Null if versionless coordinates are not
- * specified.
- */
- @Nullable
- String getVersionlessCoordinates() {
- if (!commandLine.hasOption('a')) {
- return null;
- }
- return commandLine.getOptionValue('a').trim();
- }
-
- static DashboardArguments readCommandLine(String... arguments) throws ParseException {
- CommandLineParser parser = new DefaultParser();
-
- try {
- // Throws ParseException if required option group ('-f' or '-c') is not specified
- CommandLine commandLine = parser.parse(options, arguments);
- String dependencyMediationValue = commandLine.getOptionValue('m');
- if (dependencyMediationValue != null
- && !validDependencyMediationValues.contains(dependencyMediationValue)) {
- throw new ParseException("Valid values for '-m' are " + validDependencyMediationValues);
- }
-
- return new DashboardArguments(commandLine);
- } catch (ParseException ex) {
- helpFormatter.printHelp("DashboardMain", options);
- throw ex;
- }
- }
-
- enum DependencyMediationAlgorithm {
- MAVEN,
- GRADLE,
- }
-
- /**
- * Returns dependency mediation algorithm. By default it's {@link
- * DependencyMediationAlgorithm#MAVEN}.
- */
- DependencyMediationAlgorithm getDependencyMediation() {
- if (!commandLine.hasOption('m')) {
- return DependencyMediationAlgorithm.MAVEN;
- }
- String optionValue = commandLine.getOptionValue('m').trim();
- return "maven".equals(optionValue)
- ? DependencyMediationAlgorithm.MAVEN
- : DependencyMediationAlgorithm.GRADLE;
- }
-
- private static Options configureOptions() {
- Options options = new Options();
- OptionGroup inputGroup = new OptionGroup();
- inputGroup.setRequired(true);
-
- Option inputFileOption =
- Option.builder("f").longOpt("bom-file").hasArg().desc("File to a BOM (pom.xml)").build();
- inputGroup.addOption(inputFileOption);
-
- Option inputCoordinatesOption =
- Option.builder("c")
- .longOpt("bom-coordinates")
- .hasArg()
- .desc(
- "Maven coordinates of a BOM. For example, com.google.cloud:libraries-bom:1.0.0")
- .build();
- inputGroup.addOption(inputCoordinatesOption);
-
- Option versionlessCoordinatesOption =
- Option.builder("a")
- .longOpt("all-versions")
- .hasArg()
- .desc(
- "Maven coordinates of a BOM without version. "
- + "For example, com.google.cloud:libraries-bom")
- .build();
- inputGroup.addOption(versionlessCoordinatesOption);
-
- Option dependencyMediationOption =
- Option.builder("m")
- .longOpt("dependency-mediation")
- .hasArg()
- .desc(
- "The dependency mediation algorithm to choose versions. The valid values are:\n"
- + "- 'maven' for nearest-win strategy (default)\n"
- + "- 'gradle' for highest-win strategy.")
- .build();
- options.addOption(dependencyMediationOption);
-
- options.addOptionGroup(inputGroup);
- return options;
- }
-}
diff --git a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardMain.java b/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardMain.java
deleted file mode 100644
index 94427516e2..0000000000
--- a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardMain.java
+++ /dev/null
@@ -1,623 +0,0 @@
-/*
- * Copyright 2018 Google LLC.
- *
- * Licensed 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 com.google.cloud.tools.opensource.dashboard;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.cloud.tools.opensource.classpath.ClassFile;
-import com.google.cloud.tools.opensource.classpath.ClassPathBuilder;
-import com.google.cloud.tools.opensource.classpath.ClassPathEntry;
-import com.google.cloud.tools.opensource.classpath.ClassPathResult;
-import com.google.cloud.tools.opensource.classpath.DependencyMediation;
-import com.google.cloud.tools.opensource.classpath.GradleDependencyMediation;
-import com.google.cloud.tools.opensource.classpath.LinkageChecker;
-import com.google.cloud.tools.opensource.classpath.LinkageProblem;
-import com.google.cloud.tools.opensource.dashboard.DashboardArguments.DependencyMediationAlgorithm;
-import com.google.cloud.tools.opensource.dependencies.Artifacts;
-import com.google.cloud.tools.opensource.dependencies.Bom;
-import com.google.cloud.tools.opensource.dependencies.DependencyGraph;
-import com.google.cloud.tools.opensource.dependencies.DependencyGraphBuilder;
-import com.google.cloud.tools.opensource.dependencies.DependencyPath;
-import com.google.cloud.tools.opensource.dependencies.MavenRepositoryException;
-import com.google.cloud.tools.opensource.dependencies.RepositoryUtility;
-import com.google.cloud.tools.opensource.dependencies.Update;
-import com.google.cloud.tools.opensource.dependencies.VersionComparator;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Multimaps;
-import com.google.common.collect.Sets;
-import freemarker.template.Configuration;
-import freemarker.template.DefaultObjectWrapper;
-import freemarker.template.DefaultObjectWrapperBuilder;
-import freemarker.template.Template;
-import freemarker.template.TemplateException;
-import freemarker.template.TemplateHashModel;
-import freemarker.template.Version;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.net.URISyntaxException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.TreeMap;
-import org.apache.commons.cli.ParseException;
-import org.eclipse.aether.RepositoryException;
-import org.eclipse.aether.RepositorySystem;
-import org.eclipse.aether.artifact.Artifact;
-import org.eclipse.aether.artifact.DefaultArtifact;
-import org.eclipse.aether.graph.Dependency;
-import org.eclipse.aether.version.InvalidVersionSpecificationException;
-
-public class DashboardMain {
-
- public static final String TEST_NAME_LINKAGE_CHECK = "Linkage Errors";
- public static final String TEST_NAME_UPPER_BOUND = "Upper Bounds";
- public static final String TEST_NAME_GLOBAL_UPPER_BOUND = "Global Upper Bounds";
- public static final String TEST_NAME_DEPENDENCY_CONVERGENCE = "Dependency Convergence";
- public static final int LATEST_VERSIONS_COUNT = 10;
-
- private static final Configuration freemarkerConfiguration = configureFreemarker();
-
- private static final DependencyGraphBuilder dependencyGraphBuilder = new DependencyGraphBuilder();
- private static final ClassPathBuilder classPathBuilder =
- new ClassPathBuilder(dependencyGraphBuilder);
-
- /**
- * Generates a code hygiene dashboard for a BOM. This tool takes a path to pom.xml of the BOM as
- * an argument or Maven coordinates to a BOM.
- *
- *
Generated dashboard is at {@code target/$groupId/$artifactId/$version/index.html}, where
- * each value is from BOM coordinates except {@code $version} is "snapshot" if the BOM has
- * snapshot version.
- */
- public static void main(String[] arguments)
- throws IOException, TemplateException, RepositoryException, URISyntaxException,
- ParseException, MavenRepositoryException {
- DashboardArguments dashboardArguments = DashboardArguments.readCommandLine(arguments);
-
- if (dashboardArguments.hasVersionlessCoordinates()) {
- generateLatestVersions(
- dashboardArguments.getVersionlessCoordinates(),
- dashboardArguments.getDependencyMediation());
- } else if (dashboardArguments.hasFile()) {
- generate(dashboardArguments.getBomFile(), dashboardArguments.getDependencyMediation());
- } else {
- generate(dashboardArguments.getBomCoordinates(), dashboardArguments.getDependencyMediation());
- }
- }
-
- private static void generateLatestVersions(
- String versionlessCoordinates, DependencyMediationAlgorithm dependencyMediationAlgorithm)
- throws IOException, TemplateException, RepositoryException, URISyntaxException,
- MavenRepositoryException {
- List elements = Splitter.on(':').splitToList(versionlessCoordinates);
- if (elements.size() != 2) {
- System.err.println(
- "Versionless coordinates should have one colon: " + versionlessCoordinates);
- return;
- }
- String groupId = elements.get(0);
- String artifactId = elements.get(1);
-
- RepositorySystem repositorySystem = RepositoryUtility.newRepositorySystem();
- // The highest version comes last.
- ImmutableList versions =
- RepositoryUtility.findVersions(repositorySystem, groupId, artifactId);
- ImmutableList latestVersions =
- versions.size() > LATEST_VERSIONS_COUNT ? versions.subList(
- versions.size() - LATEST_VERSIONS_COUNT,
- versions.size()) : versions;
- for (String version : latestVersions) {
- generate(
- String.format("%s:%s:%s", groupId, artifactId, version), dependencyMediationAlgorithm);
- }
- generateVersionIndex(groupId, artifactId, versions);
- }
-
- @VisibleForTesting
- static Path generateVersionIndex(String groupId, String artifactId, List versions)
- throws IOException, TemplateException, URISyntaxException {
- Path directory = outputDirectory(groupId, artifactId, "snapshot").getParent();
- directory.toFile().mkdirs();
- Path page = directory.resolve("index.html");
-
- Map templateData = new HashMap<>();
- templateData.put("versions", versions);
- templateData.put("groupId", groupId);
- templateData.put("artifactId", artifactId);
-
- File dashboardFile = page.toFile();
- try (Writer out =
- new OutputStreamWriter(new FileOutputStream(dashboardFile), StandardCharsets.UTF_8)) {
- Template dashboard = freemarkerConfiguration.getTemplate("/templates/version_index.ftl");
- dashboard.process(templateData, out);
- }
-
- copyResource(directory, "css/dashboard.css");
-
- return page;
- }
-
- @VisibleForTesting
- static Path generate(
- String bomCoordinates, DependencyMediationAlgorithm dependencyMediationAlgorithm)
- throws IOException, TemplateException, RepositoryException, URISyntaxException {
- Path output = generate(Bom.readBom(bomCoordinates), dependencyMediationAlgorithm);
- System.out.println("Wrote dashboard for " + bomCoordinates + " to " + output);
- return output;
- }
-
- @VisibleForTesting
- static Path generate(Path bomFile, DependencyMediationAlgorithm dependencyMediationAlgorithm)
- throws IOException, TemplateException, URISyntaxException, MavenRepositoryException,
- InvalidVersionSpecificationException {
- checkArgument(Files.isRegularFile(bomFile), "The input BOM %s is not a regular file", bomFile);
- checkArgument(Files.isReadable(bomFile), "The input BOM %s is not readable", bomFile);
- Path output = generate(Bom.readBom(bomFile), dependencyMediationAlgorithm);
- System.out.println("Wrote dashboard for " + bomFile + " to " + output);
- return output;
- }
-
- private static Path generate(Bom bom, DependencyMediationAlgorithm dependencyMediationAlgorithm)
- throws IOException, TemplateException, URISyntaxException,
- InvalidVersionSpecificationException {
-
- ImmutableList managedDependencies = bom.getManagedDependencies();
-
- DependencyMediation dependencyMediation =
- dependencyMediationAlgorithm == DependencyMediationAlgorithm.MAVEN
- ? DependencyMediation.MAVEN
- : GradleDependencyMediation.withEnforcedPlatform(bom);
-
- ClassPathResult classPathResult =
- classPathBuilder.resolve(managedDependencies, false, dependencyMediation);
- ImmutableList classpath = classPathResult.getClassPath();
-
- LinkageChecker linkageChecker = LinkageChecker.create(classpath);
-
- ImmutableSet linkageProblems = linkageChecker.findLinkageProblems();
-
- ArtifactCache cache = loadArtifactInfo(managedDependencies);
- Path output = generateHtml(bom, cache, classPathResult, linkageProblems);
-
- return output;
- }
-
- private static Path outputDirectory(String groupId, String artifactId, String version) {
- String versionPathElement = version.contains("-SNAPSHOT") ? "snapshot" : version;
- return Paths.get("target", groupId, artifactId, versionPathElement);
- }
-
- private static Path generateHtml(
- Bom bom,
- ArtifactCache cache,
- ClassPathResult classPathResult,
- ImmutableSet linkageProblems)
- throws IOException, TemplateException, URISyntaxException {
-
- Artifact bomArtifact = new DefaultArtifact(bom.getCoordinates());
-
- Path relativePath =
- outputDirectory(
- bomArtifact.getGroupId(), bomArtifact.getArtifactId(), bomArtifact.getVersion());
- Path output = Files.createDirectories(relativePath);
-
- copyResource(output, "css/dashboard.css");
- copyResource(output, "js/dashboard.js");
-
- ImmutableMap> linkageProblemTable =
- indexByJar(linkageProblems);
-
- List table =
- generateReports(
- freemarkerConfiguration, output, cache, linkageProblemTable, classPathResult, bom);
-
- generateDashboard(
- freemarkerConfiguration,
- output,
- table,
- cache.getGlobalDependencies(),
- linkageProblemTable,
- classPathResult,
- bom);
-
- return output;
- }
-
- private static void copyResource(Path output, String resourceName)
- throws IOException, URISyntaxException {
- ClassLoader classLoader = DashboardMain.class.getClassLoader();
- Path input = Paths.get(classLoader.getResource(resourceName).toURI()).toAbsolutePath();
- Path copy = output.resolve(input.getFileName());
- if (!Files.exists(copy)) {
- Files.copy(input, copy);
- }
- }
-
- @VisibleForTesting
- static Configuration configureFreemarker() {
- Configuration configuration = new Configuration(new Version("2.3.28"));
- configuration.setDefaultEncoding("UTF-8");
- configuration.setClassForTemplateLoading(DashboardMain.class, "/");
- return configuration;
- }
-
- @VisibleForTesting
- static List generateReports(
- Configuration configuration,
- Path output,
- ArtifactCache cache,
- ImmutableMap> linkageProblemTable,
- ClassPathResult classPathResult,
- Bom bom)
- throws TemplateException {
-
- Map artifacts = cache.getInfoMap();
- List table = new ArrayList<>();
- for (Entry entry : artifacts.entrySet()) {
- ArtifactInfo info = entry.getValue();
- try {
- if (info.getException() != null) {
- ArtifactResults unavailable = new ArtifactResults(entry.getKey());
- unavailable.setExceptionMessage(info.getException().getMessage());
- table.add(unavailable);
- } else {
- Artifact artifact = entry.getKey();
- ImmutableSet jarsInDependencyTree =
- classPathResult.getClassPathEntries(Artifacts.toCoordinates(artifact));
- Map> relevantLinkageProblemTable =
- Maps.filterKeys(linkageProblemTable, jarsInDependencyTree::contains);
-
- ArtifactResults results =
- generateArtifactReport(
- configuration,
- output,
- artifact,
- entry.getValue(),
- cache.getGlobalDependencies(),
- ImmutableMap.copyOf(relevantLinkageProblemTable),
- classPathResult,
- bom);
- table.add(results);
- }
- } catch (IOException ex) {
- ArtifactResults unavailableTestResult = new ArtifactResults(entry.getKey());
- unavailableTestResult.setExceptionMessage(ex.getMessage());
- // Even when there's a problem generating test result, show the error in the dashboard
- table.add(unavailableTestResult);
- }
- }
-
- return table;
- }
-
- /**
- * This is the only method that queries the Maven repository.
- */
- private static ArtifactCache loadArtifactInfo(List artifacts) {
- Map infoMap = new LinkedHashMap<>();
- List globalDependencies = new ArrayList<>();
-
- for (Artifact artifact : artifacts) {
- DependencyGraph completeDependencies =
- dependencyGraphBuilder.buildVerboseDependencyGraph(artifact);
- globalDependencies.add(completeDependencies);
-
- // picks versions according to Maven rules
- DependencyGraph transitiveDependencies =
- dependencyGraphBuilder.buildMavenDependencyGraph(new Dependency(artifact, "compile"));
-
- ArtifactInfo info = new ArtifactInfo(completeDependencies, transitiveDependencies);
- infoMap.put(artifact, info);
- }
-
- ArtifactCache cache = new ArtifactCache();
- cache.setInfoMap(infoMap);
- cache.setGlobalDependencies(globalDependencies);
-
- return cache;
- }
-
- private static ArtifactResults generateArtifactReport(
- Configuration configuration,
- Path output,
- Artifact artifact,
- ArtifactInfo artifactInfo,
- List globalDependencies,
- ImmutableMap> linkageProblemTable,
- ClassPathResult classPathResult,
- Bom bom)
- throws IOException, TemplateException {
-
- String coordinates = Artifacts.toCoordinates(artifact);
- File outputFile = output.resolve(coordinates.replace(':', '_') + ".html").toFile();
-
- try (Writer out = new OutputStreamWriter(
- new FileOutputStream(outputFile), StandardCharsets.UTF_8)) {
-
- // includes all versions
- DependencyGraph graph = artifactInfo.getCompleteDependencies();
- List convergenceIssues = graph.findUpdates();
-
- // picks versions according to Maven rules
- DependencyGraph transitiveDependencies = artifactInfo.getTransitiveDependencies();
-
- Map upperBoundFailures =
- findUpperBoundsFailures(graph.getHighestVersionMap(), transitiveDependencies);
-
- Map globalUpperBoundFailures = findUpperBoundsFailures(
- collectLatestVersions(globalDependencies), transitiveDependencies);
-
- long totalLinkageErrorCount =
- linkageProblemTable.values().stream()
- .flatMap(problemToClasses -> problemToClasses.stream().map(LinkageProblem::getSymbol))
- .distinct() // The dashboard counts linkage errors by the symbols
- .count();
-
- Template report = configuration.getTemplate("/templates/component.ftl");
-
- Map templateData = new HashMap<>();
-
- DefaultObjectWrapper wrapper =
- new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_28).build();
- TemplateHashModel staticModels = wrapper.getStaticModels();
- templateData.put("linkageProblem", staticModels.get(LinkageProblem.class.getName()));
-
- templateData.put("artifact", artifact);
- templateData.put("updates", convergenceIssues);
- templateData.put("upperBoundFailures", upperBoundFailures);
- templateData.put("globalUpperBoundFailures", globalUpperBoundFailures);
- templateData.put("lastUpdated", LocalDateTime.now());
- templateData.put("dependencyGraph", graph);
- templateData.put("linkageProblems", linkageProblemTable);
- templateData.put("classPathResult", classPathResult);
- templateData.put("totalLinkageErrorCount", totalLinkageErrorCount);
- templateData.put("coordinates", bom.getCoordinates());
-
- report.process(templateData, out);
-
- ArtifactResults results = new ArtifactResults(artifact);
- results.addResult(TEST_NAME_UPPER_BOUND, upperBoundFailures.size());
- results.addResult(TEST_NAME_GLOBAL_UPPER_BOUND, globalUpperBoundFailures.size());
- results.addResult(TEST_NAME_DEPENDENCY_CONVERGENCE, convergenceIssues.size());
- results.addResult(TEST_NAME_LINKAGE_CHECK, (int) totalLinkageErrorCount);
-
- return results;
- }
- }
-
- private static Map findUpperBoundsFailures(
- Map expectedVersionMap,
- DependencyGraph transitiveDependencies) {
-
- Map actualVersionMap = transitiveDependencies.getHighestVersionMap();
-
- VersionComparator comparator = new VersionComparator();
-
- Map upperBoundFailures = new LinkedHashMap<>();
-
- for (String id : expectedVersionMap.keySet()) {
- String expectedVersion = expectedVersionMap.get(id);
- String actualVersion = actualVersionMap.get(id);
- // Check that the actual version is not null because it is
- // possible for dependencies to appear or disappear from the tree
- // depending on which version of another dependency is loaded.
- // In both cases, no action is needed.
- if (actualVersion != null && comparator.compare(actualVersion, expectedVersion) < 0) {
- // Maven did not choose highest version
- DefaultArtifact lower = new DefaultArtifact(id + ":" + actualVersion);
- DefaultArtifact upper = new DefaultArtifact(id + ":" + expectedVersion);
- upperBoundFailures.put(lower, upper);
- }
- }
- return upperBoundFailures;
- }
-
- /**
- * Partitions {@code linkageProblems} by the JAR file that contains the {@link ClassFile}.
- *
- *
For example, {@code classes = result.get(JarX).get(linkageProblemY)} where {@code classes}
- * are not null means that {@code JarX} has {@code linkageProblemY} and that {@code JarX} contains
- * {@code classes} which reference {@code linkageProblemY.getSymbol()}.
- */
- private static ImmutableMap> indexByJar(
- ImmutableSet linkageProblems) {
-
- ImmutableMap> jarMap =
- Multimaps.index(linkageProblems, problem -> problem.getSourceClass().getClassPathEntry())
- .asMap();
-
- return ImmutableMap.copyOf(Maps.transformValues(jarMap, ImmutableSet::copyOf));
- }
-
- @VisibleForTesting
- static void generateDashboard(
- Configuration configuration,
- Path output,
- List table,
- List globalDependencies,
- ImmutableMap> linkageProblemTable,
- ClassPathResult classPathResult,
- Bom bom)
- throws IOException, TemplateException {
-
- Map latestArtifacts = collectLatestVersions(globalDependencies);
-
- Map templateData = new HashMap<>();
- templateData.put("table", table);
- templateData.put("lastUpdated", LocalDateTime.now());
- templateData.put("latestArtifacts", latestArtifacts);
- templateData.put("linkageProblems", linkageProblemTable);
- templateData.put("classPathResult", classPathResult);
- templateData.put("dependencyPathRootCauses", findRootCauses(classPathResult));
- templateData.put("coordinates", bom.getCoordinates());
- templateData.put("dependencyGraphs", globalDependencies);
-
- // Accessing static methods from Freemarker template
- // https://freemarker.apache.org/docs/pgui_misc_beanwrapper.html#autoid_60
- DefaultObjectWrapper wrapper = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_28)
- .build();
- TemplateHashModel staticModels = wrapper.getStaticModels();
- templateData.put("dashboardMain", staticModels.get(DashboardMain.class.getName()));
- templateData.put("pieChart", staticModels.get(PieChart.class.getName()));
- templateData.put("linkageProblem", staticModels.get(LinkageProblem.class.getName()));
-
- File dashboardFile = output.resolve("index.html").toFile();
- try (Writer out = new OutputStreamWriter(
- new FileOutputStream(dashboardFile), StandardCharsets.UTF_8)) {
- Template dashboard = configuration.getTemplate("/templates/index.ftl");
- dashboard.process(templateData, out);
- }
-
- File detailsFile = output.resolve("artifact_details.html").toFile();
- try (Writer out = new OutputStreamWriter(
- new FileOutputStream(detailsFile), StandardCharsets.UTF_8)) {
- Template details = configuration.getTemplate("/templates/artifact_details.ftl");
- details.process(templateData, out);
- }
-
- File unstable = output.resolve("unstable_artifacts.html").toFile();
- try (Writer out = new OutputStreamWriter(
- new FileOutputStream(unstable), StandardCharsets.UTF_8)) {
- Template details = configuration.getTemplate("/templates/unstable_artifacts.ftl");
- details.process(templateData, out);
- }
-
- File dependencyTrees = output.resolve("dependency_trees.html").toFile();
- try (Writer out =
- new OutputStreamWriter(new FileOutputStream(dependencyTrees), StandardCharsets.UTF_8)) {
- Template details = configuration.getTemplate("/templates/dependency_trees.ftl");
- details.process(templateData, out);
- }
- }
-
- private static Map collectLatestVersions(
- List globalDependencies) {
- Map latestArtifacts = new TreeMap<>();
- VersionComparator comparator = new VersionComparator();
-
- if (globalDependencies != null) {
- for (DependencyGraph graph : globalDependencies) {
- Map map = graph.getHighestVersionMap();
- for (String key : map.keySet()) {
- String newVersion = map.get(key);
- String oldVersion = latestArtifacts.get(key);
- if (oldVersion == null || comparator.compare(newVersion, oldVersion) > 0) {
- latestArtifacts.put(key, map.get(key));
- }
- }
- }
- }
- return latestArtifacts;
- }
-
- /**
- * Returns the number of rows in {@code table} that show unavailable ({@code null} result) or some
- * failures for {@code columnName}.
- */
- public static long countFailures(List table, String columnName) {
- return table.stream()
- .filter(row -> row.getResult(columnName) == null || row.getFailureCount(columnName) > 0)
- .count();
- }
-
- private static final int MINIMUM_NUMBER_DEPENDENCY_PATHS = 5;
-
- /**
- * Returns mapping from jar files to summaries of the root problem in their {@link
- * DependencyPath}s. The summary explains common patterns ({@code groupId:artifactId}) in the path
- * elements. The returned map does not have a key for a jar file when it has fewer than {@link
- * #MINIMUM_NUMBER_DEPENDENCY_PATHS} dependency paths or a common pattern is not found among the
- * elements in the paths.
- *
- *
Example summary: "Artifacts 'com.google.http-client:google-http-client >
- * commons-logging:commons-logging > log4j:log4j' exist in all 994 dependency paths. Example
- * path: com.google.cloud:google-cloud-core:1.59.0 ..."
- *
- *
Using this summary in the BOM dashboard avoids repetitive items in the {@link
- * DependencyPath} list that share the same root problem caused by widely-used libraries, for
- * example, {@code commons-logging:commons-logging}, {@code com.google.http-client:google-http-client}
- * and {@code log4j:log4j}.
- */
- private static ImmutableMap findRootCauses(ClassPathResult classPathResult) {
- // Freemarker is not good at handling non-string keys. Path object in .ftl is automatically
- // converted to String. https://freemarker.apache.org/docs/app_faq.html#faq_nonstring_keys
- ImmutableMap.Builder builder = ImmutableMap.builder();
-
- for (ClassPathEntry entry : classPathResult.getClassPath()) {
- List dependencyPaths = classPathResult.getDependencyPaths(entry);
-
- ImmutableList commonVersionlessArtifacts =
- commonVersionlessArtifacts(dependencyPaths);
-
- if (dependencyPaths.size() > MINIMUM_NUMBER_DEPENDENCY_PATHS
- && commonVersionlessArtifacts.size() > 1) { // The last paths elements are always same
- builder.put(
- entry.toString(),
- summaryMessage(
- dependencyPaths.size(), commonVersionlessArtifacts, dependencyPaths.get(0)));
- }
- }
- return builder.build();
- }
-
- private static ImmutableList commonVersionlessArtifacts(
- List dependencyPaths) {
- ImmutableList initialVersionlessCoordinates =
- dependencyPaths.get(0).getArtifactKeys();
- // LinkedHashSet remembers insertion order
- LinkedHashSet versionlessCoordinatesIntersection =
- Sets.newLinkedHashSet(initialVersionlessCoordinates);
- for (DependencyPath dependencyPath : dependencyPaths) {
- // List of versionless coordinates ("groupId:artifactId")
- ImmutableList versionlessCoordinatesInPath = dependencyPath.getArtifactKeys();
- // intersection of elements in DependencyPaths
- versionlessCoordinatesIntersection.retainAll(versionlessCoordinatesInPath);
- }
-
- return ImmutableList.copyOf(versionlessCoordinatesIntersection);
- }
-
- private static String summaryMessage(
- int dependencyPathCount, List coordinates, DependencyPath examplePath) {
- StringBuilder messageBuilder = new StringBuilder();
- messageBuilder.append("Dependency path '");
- messageBuilder.append(Joiner.on(" > ").join(coordinates));
- messageBuilder.append("' exists in all " + dependencyPathCount + " dependency paths. ");
- messageBuilder.append("Example path: ");
- messageBuilder.append(examplePath);
- return messageBuilder.toString();
- }
-}
diff --git a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/PieChart.java b/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/PieChart.java
deleted file mode 100644
index 8b4ecd75f7..0000000000
--- a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/PieChart.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2019 Google LLC.
- *
- * Licensed 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 com.google.cloud.tools.opensource.dashboard;
-
-import java.awt.geom.Point2D;
-
-public class PieChart {
-
- /**
- * Calculate SVG arc end for a pie piece. Assumes the piece starts at the top of the circle.
- *
- * Do not forget:
- *
- * 1. SVG origin starts at top left.
- * 2. x increases to the right and y increases **down**.
- */
- static Point2D calculateEndPoint(double radius, double centerX, double centerY, double ratio) {
- if (ratio > 1) {
- ratio = 1.0;
- }
-
- double radians = ratio * 2 * Math.PI;
-
- // Since we're starting at the top of the circle this is rotated 90 degrees
- // from the normal coordinates. This is why we use sine for x and cosine for y.
- double x = radius * (1 + Math.sin(radians));
- double y = radius * (1 - Math.cos(radians));
- return new Point2D.Double(x + centerX - radius, y + centerY - radius);
- }
-
- // so I can avoid teaching FreeMarker how to wrap a java.awt.Point
- public static double calculateEndPointX(
- double radius, double centerX, double centerY, double ratio) {
- return calculateEndPoint(radius, centerX, centerY, ratio).getX();
- }
-
- public static double calculateEndPointY(
- double radius, double centerX, double centerY, double ratio) {
- return calculateEndPoint(radius, centerX, centerY, ratio).getY();
- }
-}
diff --git a/dashboard/src/main/resources/css/dashboard.css b/dashboard/src/main/resources/css/dashboard.css
deleted file mode 100644
index 9997f125cc..0000000000
--- a/dashboard/src/main/resources/css/dashboard.css
+++ /dev/null
@@ -1,147 +0,0 @@
-body {
- font-family: "Poppins", sans-serif;
- font-weight: 400;
- line-height: 1.625;
- margin-left: 2em;
-}
-
-h1,
-h2,
-h3 {
- color: #333333;
- font-weight: 700;
- margin: 0;
- line-height: 1.2;
- margin-top: 1ex;
- margin-bottom: 1ex;
-}
-
-h1 {
- font-size: 3em;
-}
-
-h2 {
- font-size: 2.5em;
-}
-
-h3 {
- font-size: 2em;
-}
-
-th, td {
- padding: 5pt;
-}
-
-pre {
- line-height: normal;
-}
-
-.pass {
- background-color: lightgreen;
- font-weight: bold;
-}
-
-.fail {
- background-color: pink;
- font-weight: bold;
-}
-
-.unavailable {
- background-color: gray;
- font-weight: bold;
-}
-
-p.dependency-tree-node {
- margin-top: 0;
- margin-bottom: 0;
-}
-
-.linkage-check-dependency-paths, .jar-linkage-report {
- margin-left: 1em;
-}
-
-p.jar-linkage-report-cause {
- margin-bottom: 0;
- margin-left: 2em;
-}
-
-ul.jar-linkage-report-cause {
- margin-top: 0;
- margin-left: 3em;
-}
-
-ul.jar-linkage-report-cause > li {
- font: 1em 'Droid Sans Mono', monospace;
-}
-
- /* ----- Statistic ----- */
-.statistics {
- padding-top: 50px;
-}
-
-.container {
- min-height: 20ex;
- display: flex;
- flex-wrap: wrap;
- align-items: flex-start;
-}
-
-.statistic-item {
- flex: 0 0 16em;
- padding: 1.6em 2.5em;
- position: relative;
- min-height: 180px;
- overflow: hidden;
- margin-bottom: 40px;
- border: none;
- border-radius: 3px;
- box-shadow: 0px 10px 20px 0px rgba(0, 0, 0, 0.03);
- margin: 1em;
- margin-left: unset;
- margin-right: 2em;
-}
-
-.statistic-item .desc {
- font-size: 1.15em;
- text-transform: uppercase;
- font-weight: 300;
- color: rgba(255, 255, 255, 0.6);
-}
-
-.statistic-item h2 {
- font-size: 2.3em;
- font-weight: 300;
- color: #fff;
-}
-
-.statistic-item-green {
- background: #00b26f;
-}
-
-.statistic-item-orange {
- background: #ff8300;
-}
-
-.statistic-item-blue {
- background: #00b5e9;
-}
-
-.statistic-item-red {
- background: #fa4251;
-}
-
-.statistic-item-yellow {
- background: #f1c40f;
-}
-
-#piecharts th {
- vertical-align: top;
-}
-
-#piecharts td {
- vertical-align: top;
-}
-
-.pie {
- "text-align: center"
-}
diff --git a/dashboard/src/main/resources/js/dashboard.js b/dashboard/src/main/resources/js/dashboard.js
deleted file mode 100644
index 2a2128c45a..0000000000
--- a/dashboard/src/main/resources/js/dashboard.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2019 Google LLC.
- *
- * Licensed 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.
- */
-
-/**
- * Toggles the visibility of an HTML element below the button.
- * @param button clicked button element
- */
-function toggleNextSiblingVisibility(button) {
- const nextSibling = button.parentElement.nextElementSibling;
- const currentVisibility = nextSibling.style.display !== "none";
- const nextVisibility = !currentVisibility;
- nextSibling.style.display = nextVisibility ? "" : "none";
- button.innerText = nextVisibility ? "▼" : "▶";
-}
diff --git a/dashboard/src/main/resources/poms/demo.xml b/dashboard/src/main/resources/poms/demo.xml
deleted file mode 100644
index 7167c0415a..0000000000
--- a/dashboard/src/main/resources/poms/demo.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
- 4.0.0
-
- com.google.cloud
- demo
- 1.0-SNAPSHOT
- jar
-
- demo-pom
-
-
- UTF-8
- 1.8
-
-
-
-
- ${dependencyGroupId}
- ${dependencyArtifactId}
- ${dependencyVersion}
- test
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-enforcer-plugin
- 3.0.0-M1
-
-
- enforce
-
- enforce
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/dashboard/src/main/resources/templates/artifact_details.ftl b/dashboard/src/main/resources/templates/artifact_details.ftl
deleted file mode 100644
index 75acdcd51b..0000000000
--- a/dashboard/src/main/resources/templates/artifact_details.ftl
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
- <#include "macros.ftl">
-
-
- Google Cloud Platform Java Open Source Dependency Dashboard Artifact Details Table
-
-
-
-
-
Google Cloud Platform Java Dependency Dashboard Artifact Details
- <#-- The name key should match TEST_NAME_XXXX variables -->
- <@testResult row=row name="Linkage Errors"/>
- <@testResult row=row name="Upper Bounds"/>
- <@testResult row=row name="Global Upper Bounds"/>
- <@testResult row=row name="Dependency Convergence"/>
-
- #list>
-
-
-
-
-
Linkage Errors
-
- <#list linkageProblems as jar, problems>
- <@formatJarLinkageReport jar problems classPathResult dependencyPathRootCauses/>
- #list>
-
-
-
Last generated at ${lastUpdated}
-
-
\ No newline at end of file
diff --git a/dashboard/src/main/resources/templates/component.ftl b/dashboard/src/main/resources/templates/component.ftl
deleted file mode 100644
index afdc26cc09..0000000000
--- a/dashboard/src/main/resources/templates/component.ftl
+++ /dev/null
@@ -1,156 +0,0 @@
-
-
- <#include "macros.ftl">
- <#assign groupId = artifact.getGroupId()>
- <#assign artifactId = artifact.getArtifactId()>
- <#assign version = artifact.getVersion()>
-
-
- Google Cloud Platform Dependency Analysis Report for ${groupId}:${artifactId}:${version}
-
-
-
-
-
-
Dependency Analysis of ${groupId}:${artifactId}:${version}
-
BOM: ${coordinates?html}
-
Global Upper Bounds Check
-
-
For each transitive dependency the library pulls in, the highest version
- found anywhere in the union of the BOM's dependency trees is picked.
-
- <#if globalUpperBoundFailures?size gt 0>
-
Global Upper Bounds Fixes
-
-
Suggested updates to bring this artifact into sync with the highest versions
- of its dependencies used by any artifact in the BOM:
-
-
- <#list globalUpperBoundFailures as lower, upper>
- <#if lower.getGroupId() == groupId && lower.getArtifactId() == artifactId
- && lower.getVersion() == version ><#-- Not checking 'file' attribute of Artifact -->
- <#-- When this is upgrading a BOM member -->
-
- Upgrade ${lower} in the BOM to version "${upper.getVersion()}":
-
-
Update the version of managed dependency element
- ${groupId}:${artifactId} in the BOM:
If the pom.xml for ${groupId}:${artifactId}:${version} already includes this
- dependency, update the version of the existing dependency element.
- Otherwise add a new dependency element to the
- dependencyManagement section.
-
- #if>
- #list>
-
-
- <#else>
-
- ${groupId}:${artifactId}:${version} selects the highest version of all dependencies.
-
- #if>
-
-
-
Local Upper Bounds Check
-
-
-
For each transitive dependency the library pulls in, the highest version
- found anywhere in the dependency tree is picked.
-
- <#if upperBoundFailures?size gt 0>
-
Upper Bounds Fixes
-
-
Suggested updates to bring this artifact into sync with the highest versions
- of each dependency found in its own dependency tree:
-
-
- <#list upperBoundFailures as lower, upper>
-
Upgrade ${lower} to ${upper}:
-
-
Add this dependency element to the pom.xml for ${groupId}:${artifactId}:${version}:
- ${groupId}:${artifactId}:${version} selects the highest version of all dependencies.
-
- #if>
-
-
Dependency Convergence
-
-
There is exactly one version of each dependency in the library's transitive dependency tree.
- That is, two artifacts with the same group ID and artifact ID but different versions
- do not appear in the tree. No dependency mediation is necessary.
-
- <#if updates?size gt 0>
-
Suggested Dependency Updates
-
-
Caution: The algorithm for suggesting updates is imperfect.
- They are not ordered by importance, and one change
- may render another moot.
-
-
Suggested updates to bring this artifact and its dependencies
- into sync with the highest versions
- of each dependency found in its own dependency tree:
-
-
- <#list updates as update>
-
${update}
- #list>
-
- <#else>
-
${groupId}:${artifactId}:${version} Converges
- #if>
-
-
-
Linkage Check
-
-
${totalLinkageErrorCount} linkage error(s)
- <#list linkageProblems as jar, problems>
- <@formatJarLinkageReport jar problems classPathResult {} />
- #list>
-
-
- ${(convergenceErrorCount == 1)?then("Fails", "Fail")} to Converge
-
-
-
-
- <#assign pieSize = 300 >
-
-
-
-
-
-
-
-
- Linkage Errors
-
- Local Upper Bounds
-
- Global Upper Bounds
-
- Dependency Convergence
-
-
-
${linkageErrorCount} out of ${totalArtifacts} artifacts
- ${plural(linkageErrorCount, "has", "have")} linkage errors.
-
- ${localUpperBoundsErrorCount} out of ${totalArtifacts} artifacts
- ${plural(localUpperBoundsErrorCount, "does not", "do not")} pick the
- latest versions of all artifacts in their own dependency tree.
-
-
${globalUpperBoundsErrorCount} out of ${totalArtifacts} artifacts
- ${plural(globalUpperBoundsErrorCount, "does not", "do not")} select the
- most recent version of all artifacts in the BOM.
-
${convergenceErrorCount} out of ${totalArtifacts} artifacts
- ${plural(convergenceErrorCount, "fails", "fail")} to converge.
-
-
-
-
- <@pieChartSvg
- description="${linkageErrorCount} out of ${totalArtifacts} artifacts have linkage
- errors."
- ratio=linkageErrorCount / totalArtifacts />
-
-
- <#assign doesNot=plural(localUpperBoundsErrorCount, "does not", "do not")>
- <@pieChartSvg
- description="${localUpperBoundsErrorCount} out of ${totalArtifacts} artifacts
- $doesNot pick the
- latest versions of all artifacts in their own dependency tree."
- ratio=localUpperBoundsErrorCount / totalArtifacts />
-
-
- <@pieChartSvg
- description="${globalUpperBoundsErrorCount} out of ${totalArtifacts} artifacts have
- global upper bounds errors."
- ratio=globalUpperBoundsErrorCount / totalArtifacts />
-
-
- <#assign fails=plural(convergenceErrorCount, "fails", "fail")/>
- <@pieChartSvg
- description="${convergenceErrorCount} out of ${totalArtifacts} artifacts
- ${fails} to converge."
- ratio=convergenceErrorCount / totalArtifacts />
-
- The following ${plural(dependencyPaths?size, "path contains", "paths contain")} ${classPathEntry?html}:
- <#if hideDependencyPathsByDefault>
- <#-- The dependency paths are not summarized -->
-
- #if>
-
- These are dependencies found in the GCP orbit that have not yet reached 1.0.
- No 1.0 or later library should depend on them.
- If the libraries are stable, advance them to 1.0.
- Otherwise replace the dependency with something else.
-