Skip to content

Commit

Permalink
Issue nebula-plugins#78 Fixed thread-safety for DependencyLockProvide…
Browse files Browse the repository at this point in the history
…r, IvyRecommendationProvider, PropertyFileRecommendationProvider
  • Loading branch information
Buerenheide, Christian committed Dec 19, 2017
1 parent 76f5324 commit 2ef2639
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import groovy.json.JsonSlurper
import org.gradle.api.Project

class DependencyLockProvider extends FileBasedRecommendationProvider {
Map<String, String> recommendations
volatile Map<String, String> recommendations

DependencyLockProvider() {}

Expand All @@ -14,20 +14,28 @@ class DependencyLockProvider extends FileBasedRecommendationProvider {

@Override
String getVersion(String org, String name) throws Exception {
if (!recommendations) {
input.withCloseable {
final locks = new JsonSlurper().parse(it)
final isDependencyLock4Format = locks.every {
it.value.every {
it.value instanceof Map

Map<String, String> tmpResult = recommendations

if (tmpResult == null) {
synchronized (this) {
tmpResult = recommendations
if (tmpResult == null) {
input.withCloseable {
final locks = new JsonSlurper().parse(it)
final isDependencyLock4Format = locks.every {
it.value.every {
it.value instanceof Map
}
}
tmpResult = (isDependencyLock4Format ? locks.collectEntries { it.value } : locks).collectEntries {
[(it.key): it.value.locked]
}
}
}

recommendations = (isDependencyLock4Format ? locks.collectEntries { it.value } : locks).collectEntries {
[(it.key): it.value.locked]
recommendations = tmpResult
}
}
}
recommendations[org + ':' + name]
tmpResult[org + ':' + name]
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,33 @@ package netflix.nebula.dependency.recommender.provider
import org.gradle.api.Project

class IvyRecommendationProvider extends FileBasedRecommendationProvider {
Map<String, String> versionsByCoord
volatile Map<String, String> versionsByCoord

IvyRecommendationProvider(Project p) { super(p) }

@Override
String getVersion(String org, String name) throws Exception {
if (versionsByCoord == null) {
versionsByCoord = [:]
getInput().withCloseable {
def ivy = new XmlSlurper().parse(it)
ivy.dependencies.dependency.each { d ->
versionsByCoord.put("${[email protected]()}:${[email protected]()}".toString(), "${[email protected]()}")

Map<String, String> tmpResult = versionsByCoord

if (tmpResult == null) {
synchronized (this) {
tmpResult = versionsByCoord
if (tmpResult == null) {
tmpResult = [:]
getInput().withCloseable {
def ivy = new XmlSlurper().parse(it)
ivy.dependencies.dependency.each { d ->
tmpResult.put("${[email protected]()}:${[email protected]()}".toString(), "${[email protected]()}")
}
}
versionsByCoord = tmpResult
}
}
}
return versionsByCoord["$org:$name".toString()]
return tmpResult["$org:$name".toString()]
}

@SuppressWarnings("unchecked")
@Override
public InputStreamProvider setModule(Object dependencyNotation) {
if (dependencyNotation == null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
import java.util.Properties;

public class PropertyFileRecommendationProvider extends FileBasedRecommendationProvider {
private Properties recommendations;

private volatile Properties recommendations;

private FuzzyVersionResolver fuzzyResolver = new FuzzyVersionResolver() {
@Override
Expand All @@ -31,12 +32,20 @@ public PropertyFileRecommendationProvider(Project project) {

@Override
public String getVersion(String org, String name) throws Exception {
if(recommendations == null) {
recommendations = new Properties();
try (InputStream inputStream = inputProvider.getInputStream()) {
recommendations.load(
new EolCommentFilteringReader(
new ColonFilteringReader(new InputStreamReader(inputStream))));

Properties tmpResult = recommendations;

if(tmpResult == null) {
synchronized (this) {
if (tmpResult == null) {
tmpResult = new Properties();
try (InputStream inputStream = inputProvider.getInputStream()) {
tmpResult.load(
new EolCommentFilteringReader(
new ColonFilteringReader(new InputStreamReader(inputStream))));
}
recommendations = tmpResult;
}
}
}
return fuzzyResolver.versionOf(org + "/" + name);
Expand Down

0 comments on commit 2ef2639

Please sign in to comment.