Skip to content

Commit cf283e5

Browse files
Fix #275: Json-io shading needs additional transformer (#280)
* upgrade to latest Gradle Shadow plugin * add new transformer that replaces the original package name in text files in the json-io config folder (aliases.txt, classFactory.txt, coercedTypes.txt, customWriters.txt) with the shaded one
1 parent 7f5ee8b commit cf283e5

File tree

2 files changed

+60
-5
lines changed

2 files changed

+60
-5
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
org.gradle.parallel=true
22

33
group=io.pivotal.cfenv
4-
version=3.2.0-SNAPSHOT
4+
version=3.3.0-SNAPSHOT
55
onlyShowStandardStreamsOnTestFailure=false
66

java-cfenv-all/build.gradle

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
1+
import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer
2+
import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext
3+
import org.apache.tools.zip.ZipEntry
4+
import org.apache.tools.zip.ZipOutputStream
5+
import org.codehaus.plexus.util.IOUtil
6+
17
buildscript {
28
repositories {
39
gradlePluginPortal()
410
}
511
dependencies {
6-
classpath 'com.github.johnrengelman:shadow:8.1.1'
12+
// groupId changed from com.github.johnrengelman to com.gradleup.shadow
13+
classpath 'com.gradleup.shadow:shadow-gradle-plugin:8.3.3'
714
}
815
}
916

1017
plugins {
1118
id 'io.pivotal.cfenv.java-conventions'
1219
}
1320

14-
apply plugin: 'com.github.johnrengelman.shadow'
21+
apply plugin: 'com.gradleup.shadow'
1522
apply plugin: 'java-library'
1623

1724
description = 'java-cfenv-all, contains all java-cfenv modules in a convenient uberjar - to be used with CF Java Buildpack'
@@ -23,15 +30,63 @@ dependencies {
2330
testImplementation 'org.springframework.boot:spring-boot-starter-test'
2431
}
2532

26-
import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer
27-
2833
shadowJar {
2934
archiveClassifier.set('')
3035
mergeServiceFiles()
3136
transform(PropertiesFileTransformer) {
3237
paths = ['META-INF/spring.factories']
3338
mergeStrategy = "append"
3439
}
40+
// Fix #275: json-io uses text config file with packages names; those names need to be updated, with values we gave to the relocator
41+
transform(new com.github.jengelman.gradle.plugins.shadow.transformers.Transformer() {
42+
43+
private Map<String, String> configTextFiles = new HashMap<>()
44+
45+
@Override
46+
boolean canTransformResource(FileTreeElement fileTreeElement) {
47+
var isConfigFileText = fileTreeElement.getName().startsWith("config/") && fileTreeElement.getName().endsWith(".txt")
48+
return isConfigFileText
49+
}
50+
51+
@Override
52+
void transform(TransformerContext transformerContext) {
53+
def originalPackageName = transformerContext.relocators.get(0).pattern
54+
def relocatedPackageName = transformerContext.relocators.get(0).shadedPattern
55+
56+
String originalFileContent = transformerContext.is.getText("UTF-8")
57+
if (originalFileContent.contains(originalPackageName)) {
58+
println "transforming " + transformerContext.path
59+
def modifiedFileContent = originalFileContent.replaceAll(originalPackageName, relocatedPackageName)
60+
configTextFiles.put(transformerContext.path, modifiedFileContent)
61+
} else {
62+
configTextFiles.put(transformerContext.path, originalFileContent)
63+
}
64+
}
65+
66+
@Override
67+
boolean hasTransformedResource() {
68+
return true
69+
}
70+
71+
@Override
72+
void modifyOutputStream(ZipOutputStream zipOutputStream, boolean preserveFileTimestamps) {
73+
// cannot close the writer as the OutputStream needs to remain open
74+
def zipWriter = new OutputStreamWriter(zipOutputStream, 'UTF-8')
75+
configTextFiles.each { String path, String fileContent ->
76+
ZipEntry entry = new ZipEntry(path)
77+
entry.time = TransformerContext.getEntryTimestamp(preserveFileTimestamps, entry.time)
78+
zipOutputStream.putNextEntry(entry)
79+
IOUtil.copy(new ByteArrayInputStream(fileContent.getBytes('UTF-8')), zipWriter)
80+
zipWriter.flush()
81+
zipOutputStream.closeEntry()
82+
}
83+
}
84+
85+
@Override
86+
String getName() {
87+
return ""
88+
}
89+
})
3590
dependencies {
3691
exclude(dependency('org.springframework.boot::'))
3792
exclude(dependency('org.springframework::'))

0 commit comments

Comments
 (0)