diff options
author | Kristina Chodorow <kchodorow@google.com> | 2016-02-17 15:08:47 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2016-02-17 15:36:55 +0000 |
commit | 829b561d10c5226284d16fb247deac0c4485bb4e (patch) | |
tree | e6aef76c77fc163fb3564f006f21758f53f76dc6 /src | |
parent | 3e16768b4c2ded6c4bcd0eb452eadf205626079e (diff) |
Move SHA-1 download out of the Rule (plain old data) class
--
MOS_MIGRATED_REVID=114855891
Diffstat (limited to 'src')
7 files changed, 160 insertions, 20 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenConnector.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenConnector.java index ab9202516e..a330d2acfa 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenConnector.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenConnector.java @@ -34,7 +34,7 @@ import org.eclipse.aether.transport.http.HttpTransporterFactory; * Connections to Maven repositories. */ public class MavenConnector { - private static final String MAVEN_CENTRAL_URL = "https://repo1.maven.org/maven2/"; + public static final String MAVEN_CENTRAL_URL = "https://repo1.maven.org/maven2/"; private final String localRepositoryPath; diff --git a/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/Resolver.java b/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/Resolver.java index 780b4cb9e2..2d95c4bd58 100644 --- a/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/Resolver.java +++ b/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/Resolver.java @@ -119,9 +119,13 @@ public class Resolver { modelResolver.addUserRepository(attributeMap.get("repository", Type.STRING)); rule.setRepository(attributeMap.get("repository", Type.STRING), handler); } + if (attributeMap.isAttributeValueExplicitlySpecified("sha1")) { + rule.setSha1(attributeMap.get("sha1", Type.STRING)); + } else { + rule.setSha1(resolver.downloadSha1(rule)); + } ModelSource modelSource; - try { modelSource = modelResolver.resolveModel( rule.groupId(), rule.artifactId(), rule.version()); diff --git a/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/maven/Resolver.java b/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/maven/Resolver.java index 62ea66720d..bbc9e52993 100644 --- a/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/maven/Resolver.java +++ b/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/maven/Resolver.java @@ -17,6 +17,7 @@ package com.google.devtools.build.workspace.maven; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import com.google.common.io.CharStreams; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventHandler; @@ -42,7 +43,11 @@ import org.apache.maven.model.resolution.UnresolvableModelException; import java.io.File; import java.io.IOException; +import java.io.InputStreamReader; import java.io.PrintStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.Charset; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -187,6 +192,7 @@ public class Resolver { dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion()); if (depModelSource != null) { artifactRule.setRepository(depModelSource.getLocation(), handler); + artifactRule.setSha1(downloadSha1(artifactRule)); resolveEffectiveModel(depModelSource, localDepExclusions, artifactRule); } else { handler.handle(Event.error("Could not get a model for " + dependency)); @@ -284,4 +290,25 @@ public class Resolver { public void addRootDependency(Rule rule) { rootDependencies.add(rule); } + + static String getSha1Url(String url, String extension) { + return url.replaceAll(".pom$", "." + extension + ".sha1"); + } + + /** + * Downloads the SHA-1 for the given artifact. + */ + public String downloadSha1(Rule rule) { + String sha1Url = getSha1Url(rule.getUrl(), rule.getArtifact().getExtension()); + try { + HttpURLConnection connection = (HttpURLConnection) new URL(sha1Url).openConnection(); + connection.setInstanceFollowRedirects(true); + connection.connect(); + return CharStreams.toString( + new InputStreamReader(connection.getInputStream(), Charset.defaultCharset())).trim(); + } catch (IOException e) { + handler.handle(Event.warn("Failed to download the sha1 at " + sha1Url)); + } + return null; + } } diff --git a/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/maven/Rule.java b/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/maven/Rule.java index fb9fa8938d..8f14523a41 100644 --- a/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/maven/Rule.java +++ b/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/maven/Rule.java @@ -14,8 +14,8 @@ package com.google.devtools.build.workspace.maven; +import com.google.common.base.Preconditions; import com.google.common.collect.Sets; -import com.google.common.io.CharStreams; import com.google.devtools.build.lib.bazel.repository.MavenConnector; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventHandler; @@ -25,10 +25,6 @@ import org.apache.maven.model.Exclusion; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.artifact.DefaultArtifact; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; import java.util.Objects; import java.util.Set; @@ -38,10 +34,10 @@ import java.util.Set; public final class Rule implements Comparable<Rule> { private final Artifact artifact; private final Set<String> parents; + private final Set<String> exclusions; + private final Set<Rule> dependencies; private String repository; private String sha1; - private Set<String> exclusions; - private Set<Rule> dependencies; public Rule(String artifactStr) throws InvalidRuleException { try { @@ -52,6 +48,7 @@ public final class Rule implements Comparable<Rule> { this.parents = Sets.newHashSet(); this.dependencies = Sets.newTreeSet(); this.exclusions = Sets.newHashSet(); + this.repository = MavenConnector.MAVEN_CENTRAL_URL; } public Rule(Dependency dependency) throws InvalidRuleException { @@ -127,25 +124,27 @@ public final class Rule implements Comparable<Rule> { + " attribute manually")); } else { this.repository = url.substring(0, uriStart); - String jarSha1Url = url.replaceAll("pom$", "jar.sha1"); - try { - // Download the sha1 of the jar file from the repository. - HttpURLConnection connection = (HttpURLConnection) new URL(jarSha1Url).openConnection(); - connection.setInstanceFollowRedirects(true); - connection.connect(); - this.sha1 = CharStreams.toString(new InputStreamReader(connection.getInputStream())).trim(); - } catch (IOException e) { - handler.handle(Event.warn("Failed to download the sha1 at " + jarSha1Url)); - } } } + public void setSha1(String sha1) { + this.sha1 = sha1; + } + private String getUri() { return groupId().replaceAll("\\.", "/") + "/" + artifactId() + "/" + version() + "/" + artifactId() + "-" + version() + ".pom"; } /** + * @return The artifact's URL. + */ + public String getUrl() { + Preconditions.checkState(repository.endsWith("/")); + return repository + getUri(); + } + + /** * The way this jar should be stringified for the WORKSPACE file. */ @Override @@ -164,7 +163,7 @@ public final class Rule implements Comparable<Rule> { } private boolean hasCustomRepository() { - return repository != null && !repository.equals(MavenConnector.getMavenCentral().getUrl()); + return !MavenConnector.MAVEN_CENTRAL_URL.equals(repository); } @Override diff --git a/src/tools/generate_workspace/src/test/java/com/google/devtools/build/workspace/maven/BUILD b/src/tools/generate_workspace/src/test/java/com/google/devtools/build/workspace/maven/BUILD new file mode 100644 index 0000000000..919502fef7 --- /dev/null +++ b/src/tools/generate_workspace/src/test/java/com/google/devtools/build/workspace/maven/BUILD @@ -0,0 +1,21 @@ +java_test( + name = "RuleTest", + srcs = ["RuleTest.java"], + deps = [ + "//src/main/java/com/google/devtools/build/lib:events", + "//src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/maven:rule", + "//third_party:junit4", + "//third_party:truth", + ], +) + +java_test( + name = "ResolverTest", + srcs = ["ResolverTest.java"], + deps = [ + "//src/main/java/com/google/devtools/build/lib:events", + "//src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/maven", + "//third_party:junit4", + "//third_party:truth", + ], +) diff --git a/src/tools/generate_workspace/src/test/java/com/google/devtools/build/workspace/maven/ResolverTest.java b/src/tools/generate_workspace/src/test/java/com/google/devtools/build/workspace/maven/ResolverTest.java new file mode 100644 index 0000000000..20318ec802 --- /dev/null +++ b/src/tools/generate_workspace/src/test/java/com/google/devtools/build/workspace/maven/ResolverTest.java @@ -0,0 +1,41 @@ +// Copyright 2016 The Bazel Authors. All rights reserved. +// +// 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.devtools.build.workspace.maven; + +import static com.google.common.truth.Truth.assertThat; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** + * Tests for {@link Resolver}. + */ +@RunWith(JUnit4.class) +public class ResolverTest { + @Test + public void testGetSha1Url() throws Exception { + assertThat(Resolver.getSha1Url("http://example.com/foo.pom", "jar")) + .isEqualTo("http://example.com/foo.jar.sha1"); + assertThat(Resolver.getSha1Url("http://example.com/foo.pom", "aar")) + .isEqualTo("http://example.com/foo.aar.sha1"); + } + + @Test + public void testGetSha1UrlOnlyAtEOL() throws Exception { + assertThat(Resolver.getSha1Url("http://example.pom/foo.pom", "jar")) + .isEqualTo("http://example.pom/foo.jar.sha1"); + } +} diff --git a/src/tools/generate_workspace/src/test/java/com/google/devtools/build/workspace/maven/RuleTest.java b/src/tools/generate_workspace/src/test/java/com/google/devtools/build/workspace/maven/RuleTest.java new file mode 100644 index 0000000000..18cd687862 --- /dev/null +++ b/src/tools/generate_workspace/src/test/java/com/google/devtools/build/workspace/maven/RuleTest.java @@ -0,0 +1,48 @@ +// Copyright 2016 The Bazel Authors. All rights reserved. +// +// 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.devtools.build.workspace.maven; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.devtools.build.lib.events.StoredEventHandler; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** + * Tests for {@link Rule}. + */ +@RunWith(JUnit4.class) +public class RuleTest { + + private StoredEventHandler handler; + + @Before + public void createEventHandler() { + handler = new StoredEventHandler(); + } + + @Test + public void testUrl() throws Exception { + Rule rule = new Rule("foo:bar:1.2.3"); + assertThat(rule.getUrl()) + .isEqualTo("https://repo1.maven.org/maven2/foo/bar/1.2.3/bar-1.2.3.pom"); + rule.setRepository("http://myrepo.com/foo/bar/1.2.3/bar-1.2.3.pom", handler); + assertThat(handler.getEvents()).isEmpty(); + assertThat(rule.getUrl()).isEqualTo("http://myrepo.com/foo/bar/1.2.3/bar-1.2.3.pom"); + } +} |