Skip to content

Commit 01dc0ca

Browse files
committed
fix: Configuration Cache Support
1 parent 15a99fa commit 01dc0ca

File tree

2 files changed

+46
-44
lines changed

2 files changed

+46
-44
lines changed

vss-processor-plugin/src/main/java/org/eclipse/velocitas/vssprocessor/VssModelGenerator.kt

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,28 @@ import org.eclipse.kuksa.vsscore.model.parentClassName
2222
import org.eclipse.velocitas.vssprocessor.parser.factory.VssParserFactory
2323
import org.eclipse.velocitas.vssprocessor.spec.VssNodeSpecModel
2424
import org.eclipse.velocitas.vssprocessor.spec.VssPath
25-
import org.gradle.api.Project
2625
import org.gradle.api.logging.Logger
2726

2827
/**
2928
* Generates a [org.eclipse.kuksa.vsscore.model.VssNode] for every entry listed in the input file.
3029
* These nodes are a usable kotlin data class reflection of the element.
3130
*
31+
* @param projectDir absolute path to the project which has embedded the vss-processor-plugin.
3232
* @param logger to log output with
3333
*/
3434
class VssModelGenerator(
35-
val project: Project,
36-
val logger: Logger,
35+
projectDir: File,
36+
private val logger: Logger,
3737
) {
3838
private val vssParserFactory = VssParserFactory()
3939

40-
val sourceSetBasePath = "build" + fileSeparator + "generated" + fileSeparator + "vss" + fileSeparator + "kotlin"
41-
val outputPath = sourceSetBasePath + fileSeparator + PACKAGE_NAME.replace(".", fileSeparator)
40+
private val packageName = "org.eclipse.velocitas.vss"
41+
42+
private val buildDir = File(projectDir, "build")
43+
private val generatedDir = File(buildDir, "generated")
44+
private val vssDir = File(generatedDir, "vss")
45+
val sourceSetBaseDir = File(vssDir, "kotlin")
46+
val outputDir = File(sourceSetBaseDir, packageName.replace(".", File.separator))
4247

4348
fun generate(vssFiles: Set<File>) {
4449
val simpleNodeElements = mutableListOf<VssNodeSpecModel>()
@@ -75,27 +80,25 @@ class VssModelGenerator(
7580

7681
specModel.logger = logger
7782
val classSpec = specModel.createClassSpec(
78-
PACKAGE_NAME,
83+
packageName,
7984
vssPathToVssNode.values,
8085
duplicateNodeNames,
8186
)
8287

8388
val className = classSpec.name ?: throw NoSuchFieldException("Class spec $classSpec has no name field!")
84-
val fileSpecBuilder = FileSpec.builder(PACKAGE_NAME, className)
89+
val fileSpecBuilder = FileSpec.builder(packageName, className)
8590

8691
val parentImport = buildParentImport(specModel, generatedFilesVssPathToClassName)
8792
if (parentImport.isNotEmpty()) {
88-
fileSpecBuilder.addImport(PACKAGE_NAME, parentImport)
93+
fileSpecBuilder.addImport(packageName, parentImport)
8994
}
9095

9196
val file = fileSpecBuilder
9297
.addType(classSpec)
9398
.build()
9499

95-
val sourcePath = sourceSetBasePath + fileSeparator + PACKAGE_NAME.replace(".", fileSeparator)
96-
val sourceDir = project.file(sourcePath)
97-
sourceDir.mkdirs()
98-
sourceDir.resolve(file.name + ".kt").writeText(file.toString())
100+
outputDir.mkdirs()
101+
outputDir.resolve(file.name + ".kt").writeText(file.toString())
99102

100103
generatedFilesVssPathToClassName[vssPath.path] = className
101104
}
@@ -133,9 +136,4 @@ class VssModelGenerator(
133136
parentClassName // Main class = File name
134137
}
135138
}
136-
137-
private companion object {
138-
private val fileSeparator = File.separator
139-
private const val PACKAGE_NAME = "org.eclipse.velocitas.vss"
140-
}
141139
}

vss-processor-plugin/src/main/java/org/eclipse/velocitas/vssprocessor/plugin/VssProcessorPlugin.kt

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import org.gradle.api.provider.Property
3636
import org.gradle.api.tasks.CacheableTask
3737
import org.gradle.api.tasks.IgnoreEmptyDirectories
3838
import org.gradle.api.tasks.InputDirectory
39+
import org.gradle.api.tasks.Internal
3940
import org.gradle.api.tasks.OutputDirectory
4041
import org.gradle.api.tasks.PathSensitive
4142
import org.gradle.api.tasks.PathSensitivity
@@ -59,8 +60,6 @@ internal constructor(objectFactory: ObjectFactory) {
5960
val searchPath: Property<String> = objectFactory.property(String::class.java).convention("")
6061
}
6162

62-
private val fileSeparator = File.separator
63-
6463
/**
6564
* This Plugin searches for compatible VSS files, generates VSS Model classes and copies them into an output folder
6665
* which is added as a main sourceSet.
@@ -72,19 +71,18 @@ class VssProcessorPlugin : Plugin<Project> {
7271

7372
// The extension variables are only available after the project has been evaluated
7473
project.afterEvaluate {
75-
val vssModelGenerator = VssModelGenerator(project, logger)
76-
val sourceSetBasePath = vssModelGenerator.sourceSetBasePath
74+
val modelGenerator = VssModelGenerator(project.projectDir, logger)
75+
val sourceSetBaseDir = modelGenerator.sourceSetBaseDir
7776

78-
addGeneratedPathToSourceSets(project, sourceSetBasePath)
77+
addGeneratedPathToSourceSets(project, sourceSetBaseDir)
7978

8079
val generateVssModelsTask = project.tasks.register<GenerateVssModelsTask>(GENERATE_TASK_NAME) {
81-
val defaultVssPath = "${rootDir}${fileSeparator}$VSS_FOLDER_NAME"
82-
val vssPath = vssProcessorExtension.searchPath.get().ifEmpty { defaultVssPath }
83-
val vssDir = File(vssPath)
84-
inputDir.set(vssDir)
80+
vssModelGenerator = modelGenerator
81+
82+
val vssDir = readVssDir(vssProcessorExtension)
83+
this.vssDir.set(vssDir)
8584

86-
val genOutputDir = File(vssModelGenerator.outputPath)
87-
outputDir.set(genOutputDir)
85+
generatedOutputDir.set(sourceSetBaseDir)
8886
}
8987

9088
tasks.withType(KotlinCompile::class.java).configureEach {
@@ -99,9 +97,16 @@ class VssProcessorPlugin : Plugin<Project> {
9997
}
10098
}
10199

100+
private fun Project.readVssDir(vssProcessorExtension: VssProcessorPluginExtension): File {
101+
val defaultVssPath = File(rootDir, VSS_FOLDER_NAME)
102+
val vssPath = vssProcessorExtension.searchPath.get().ifEmpty { defaultVssPath.absolutePath }
103+
val vssDir = File(vssPath)
104+
return vssDir
105+
}
106+
102107
private fun addGeneratedPathToSourceSets(
103108
project: Project,
104-
sourceSetBasePath: String,
109+
sourceSetBaseDir: File,
105110
) {
106111
val extensions = project.extensions
107112
val pluginManager = project.pluginManager
@@ -113,15 +118,15 @@ class VssProcessorPlugin : Plugin<Project> {
113118
if (isAndroidApplication) {
114119
val androidExtension = extensions.getByType(AppExtension::class.java)
115120
val mainSourceSet = androidExtension.sourceSets.named(SOURCESET_MAIN_NAME).get()
116-
mainSourceSet.java.srcDirs(sourceSetBasePath)
121+
mainSourceSet.java.srcDirs(sourceSetBaseDir)
117122
} else if (isAndroidLibrary) {
118123
val androidExtension = extensions.getByType(LibraryExtension::class.java)
119124
val mainSourceSet = androidExtension.sourceSets.named(SOURCESET_MAIN_NAME).get()
120-
mainSourceSet.java.srcDirs(sourceSetBasePath)
125+
mainSourceSet.java.srcDirs(sourceSetBaseDir)
121126
} else if (isJavaProject) {
122127
val sourceSets = extensions.getByType(SourceSetContainer::class.java)
123128
val mainSourceSet = sourceSets.named(SOURCESET_MAIN_NAME).get()
124-
mainSourceSet.java.srcDirs(sourceSetBasePath)
129+
mainSourceSet.java.srcDirs(sourceSetBaseDir)
125130
} else {
126131
throw GradleException("Project does not contain any supported plugin")
127132
}
@@ -142,27 +147,26 @@ class VssProcessorPlugin : Plugin<Project> {
142147
}
143148

144149
/**
145-
* This task takes an input directory [inputDir] which should contain all available VSS files and an
146-
* output directory [outputDir] where all files are copied to so the VSSProcessor can work with them.
150+
* This task takes an input directory [vssDir] which should contain all available VSS files and an
151+
* output directory [generatedOutputDir] where all files are copied to so the VSSProcessor can work with them.
147152
*/
148153
@CacheableTask
149154
private abstract class GenerateVssModelsTask : DefaultTask() {
150155
@get:Incremental
151156
@get:IgnoreEmptyDirectories
152157
@get:PathSensitive(PathSensitivity.NAME_ONLY)
153158
@get:InputDirectory
154-
abstract val inputDir: DirectoryProperty
159+
abstract val vssDir: DirectoryProperty
155160

156161
@get:OutputDirectory
157-
abstract val outputDir: DirectoryProperty
162+
abstract val generatedOutputDir: DirectoryProperty
158163

159-
private val vssModelGenerator by lazy {
160-
VssModelGenerator(project, logger)
161-
}
164+
@Internal
165+
lateinit var vssModelGenerator: VssModelGenerator
162166

163167
@TaskAction
164168
fun provideFile(inputChanges: InputChanges) {
165-
inputChanges.getFileChanges(inputDir).forEach { change ->
169+
inputChanges.getFileChanges(vssDir).forEach { change ->
166170
if (change.fileType == FileType.DIRECTORY) return@forEach
167171

168172
val file = change.file
@@ -172,18 +176,18 @@ private abstract class GenerateVssModelsTask : DefaultTask() {
172176
return@forEach
173177
}
174178

175-
val targetFile = outputDir.file(change.normalizedPath).get().asFile
179+
val targetFile = generatedOutputDir.file(change.normalizedPath).get().asFile
176180
logger.info("Found VSS file changes for: ${targetFile.name}, change: ${change.changeType}")
177181

178182
when (change.changeType) {
179183
ChangeType.ADDED,
180184
ChangeType.MODIFIED,
181185
-> {
182-
val outputDir = outputDir.asFile.get()
186+
val outputDir = generatedOutputDir.asFile.get()
183187
outputDir.deleteRecursively()
184188
outputDir.mkdirs()
185189

186-
val vssFiles = inputDir.asFile.get()
190+
val vssFiles = vssDir.asFile.get()
187191
.walk()
188192
.filter { it.isFile }
189193
.filter { validVssExtension.contains(it.extension) }
@@ -196,7 +200,7 @@ private abstract class GenerateVssModelsTask : DefaultTask() {
196200
vssModelGenerator.generate(vssFiles)
197201
}
198202

199-
ChangeType.REMOVED -> outputDir.asFile.get().deleteRecursively()
203+
ChangeType.REMOVED -> generatedOutputDir.asFile.get().deleteRecursively()
200204
else -> logger.warn("Could not determine file change type: ${change.changeType}")
201205
}
202206
}

0 commit comments

Comments
 (0)