aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Kristina Chodorow <kchodorow@google.com>2016-02-17 15:08:47 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-02-17 15:36:55 +0000
commit829b561d10c5226284d16fb247deac0c4485bb4e (patch)
treee6aef76c77fc163fb3564f006f21758f53f76dc6 /src
parent3e16768b4c2ded6c4bcd0eb452eadf205626079e (diff)
Move SHA-1 download out of the Rule (plain old data) class
-- MOS_MIGRATED_REVID=114855891
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/MavenConnector.java2
-rw-r--r--src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/Resolver.java6
-rw-r--r--src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/maven/Resolver.java27
-rw-r--r--src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/maven/Rule.java35
-rw-r--r--src/tools/generate_workspace/src/test/java/com/google/devtools/build/workspace/maven/BUILD21
-rw-r--r--src/tools/generate_workspace/src/test/java/com/google/devtools/build/workspace/maven/ResolverTest.java41
-rw-r--r--src/tools/generate_workspace/src/test/java/com/google/devtools/build/workspace/maven/RuleTest.java48
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");
+ }
+}