Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix #275: Json-io shading needs additional transformer #280

Merged
merged 1 commit into from
Oct 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
org.gradle.parallel=true

group=io.pivotal.cfenv
version=3.2.0-SNAPSHOT
version=3.3.0-SNAPSHOT
onlyShowStandardStreamsOnTestFailure=false

63 changes: 59 additions & 4 deletions java-cfenv-all/build.gradle
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer
import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext
import org.apache.tools.zip.ZipEntry
import org.apache.tools.zip.ZipOutputStream
import org.codehaus.plexus.util.IOUtil

buildscript {
repositories {
gradlePluginPortal()
}
dependencies {
classpath 'com.github.johnrengelman:shadow:8.1.1'
// groupId changed from com.github.johnrengelman to com.gradleup.shadow
classpath 'com.gradleup.shadow:shadow-gradle-plugin:8.3.3'
}
}

plugins {
id 'io.pivotal.cfenv.java-conventions'
}

apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'com.gradleup.shadow'
apply plugin: 'java-library'

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

import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer

shadowJar {
archiveClassifier.set('')
mergeServiceFiles()
transform(PropertiesFileTransformer) {
paths = ['META-INF/spring.factories']
mergeStrategy = "append"
}
// Fix #275: json-io uses text config file with packages names; those names need to be updated, with values we gave to the relocator
transform(new com.github.jengelman.gradle.plugins.shadow.transformers.Transformer() {

private Map<String, String> configTextFiles = new HashMap<>()

@Override
boolean canTransformResource(FileTreeElement fileTreeElement) {
var isConfigFileText = fileTreeElement.getName().startsWith("config/") && fileTreeElement.getName().endsWith(".txt")
return isConfigFileText
}

@Override
void transform(TransformerContext transformerContext) {
def originalPackageName = transformerContext.relocators.get(0).pattern
def relocatedPackageName = transformerContext.relocators.get(0).shadedPattern

String originalFileContent = transformerContext.is.getText("UTF-8")
if (originalFileContent.contains(originalPackageName)) {
println "transforming " + transformerContext.path
def modifiedFileContent = originalFileContent.replaceAll(originalPackageName, relocatedPackageName)
configTextFiles.put(transformerContext.path, modifiedFileContent)
} else {
configTextFiles.put(transformerContext.path, originalFileContent)
}
}

@Override
boolean hasTransformedResource() {
return true
}

@Override
void modifyOutputStream(ZipOutputStream zipOutputStream, boolean preserveFileTimestamps) {
// cannot close the writer as the OutputStream needs to remain open
def zipWriter = new OutputStreamWriter(zipOutputStream, 'UTF-8')
configTextFiles.each { String path, String fileContent ->
ZipEntry entry = new ZipEntry(path)
entry.time = TransformerContext.getEntryTimestamp(preserveFileTimestamps, entry.time)
zipOutputStream.putNextEntry(entry)
IOUtil.copy(new ByteArrayInputStream(fileContent.getBytes('UTF-8')), zipWriter)
zipWriter.flush()
zipOutputStream.closeEntry()
}
}

@Override
String getName() {
return ""
}
})
dependencies {
exclude(dependency('org.springframework.boot::'))
exclude(dependency('org.springframework::'))
Expand Down