@@ -36,6 +36,7 @@ import org.gradle.api.provider.Property
36
36
import org.gradle.api.tasks.CacheableTask
37
37
import org.gradle.api.tasks.IgnoreEmptyDirectories
38
38
import org.gradle.api.tasks.InputDirectory
39
+ import org.gradle.api.tasks.Internal
39
40
import org.gradle.api.tasks.OutputDirectory
40
41
import org.gradle.api.tasks.PathSensitive
41
42
import org.gradle.api.tasks.PathSensitivity
@@ -59,8 +60,6 @@ internal constructor(objectFactory: ObjectFactory) {
59
60
val searchPath: Property <String > = objectFactory.property(String ::class .java).convention(" " )
60
61
}
61
62
62
- private val fileSeparator = File .separator
63
-
64
63
/* *
65
64
* This Plugin searches for compatible VSS files, generates VSS Model classes and copies them into an output folder
66
65
* which is added as a main sourceSet.
@@ -72,19 +71,18 @@ class VssProcessorPlugin : Plugin<Project> {
72
71
73
72
// The extension variables are only available after the project has been evaluated
74
73
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
77
76
78
- addGeneratedPathToSourceSets(project, sourceSetBasePath )
77
+ addGeneratedPathToSourceSets(project, sourceSetBaseDir )
79
78
80
79
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)
85
84
86
- val genOutputDir = File (vssModelGenerator.outputPath)
87
- outputDir.set(genOutputDir)
85
+ generatedOutputDir.set(sourceSetBaseDir)
88
86
}
89
87
90
88
tasks.withType(KotlinCompile ::class .java).configureEach {
@@ -99,9 +97,16 @@ class VssProcessorPlugin : Plugin<Project> {
99
97
}
100
98
}
101
99
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
+
102
107
private fun addGeneratedPathToSourceSets (
103
108
project : Project ,
104
- sourceSetBasePath : String ,
109
+ sourceSetBaseDir : File ,
105
110
) {
106
111
val extensions = project.extensions
107
112
val pluginManager = project.pluginManager
@@ -113,15 +118,15 @@ class VssProcessorPlugin : Plugin<Project> {
113
118
if (isAndroidApplication) {
114
119
val androidExtension = extensions.getByType(AppExtension ::class .java)
115
120
val mainSourceSet = androidExtension.sourceSets.named(SOURCESET_MAIN_NAME ).get()
116
- mainSourceSet.java.srcDirs(sourceSetBasePath )
121
+ mainSourceSet.java.srcDirs(sourceSetBaseDir )
117
122
} else if (isAndroidLibrary) {
118
123
val androidExtension = extensions.getByType(LibraryExtension ::class .java)
119
124
val mainSourceSet = androidExtension.sourceSets.named(SOURCESET_MAIN_NAME ).get()
120
- mainSourceSet.java.srcDirs(sourceSetBasePath )
125
+ mainSourceSet.java.srcDirs(sourceSetBaseDir )
121
126
} else if (isJavaProject) {
122
127
val sourceSets = extensions.getByType(SourceSetContainer ::class .java)
123
128
val mainSourceSet = sourceSets.named(SOURCESET_MAIN_NAME ).get()
124
- mainSourceSet.java.srcDirs(sourceSetBasePath )
129
+ mainSourceSet.java.srcDirs(sourceSetBaseDir )
125
130
} else {
126
131
throw GradleException (" Project does not contain any supported plugin" )
127
132
}
@@ -142,27 +147,26 @@ class VssProcessorPlugin : Plugin<Project> {
142
147
}
143
148
144
149
/* *
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.
147
152
*/
148
153
@CacheableTask
149
154
private abstract class GenerateVssModelsTask : DefaultTask () {
150
155
@get:Incremental
151
156
@get:IgnoreEmptyDirectories
152
157
@get:PathSensitive(PathSensitivity .NAME_ONLY )
153
158
@get:InputDirectory
154
- abstract val inputDir : DirectoryProperty
159
+ abstract val vssDir : DirectoryProperty
155
160
156
161
@get:OutputDirectory
157
- abstract val outputDir : DirectoryProperty
162
+ abstract val generatedOutputDir : DirectoryProperty
158
163
159
- private val vssModelGenerator by lazy {
160
- VssModelGenerator (project, logger)
161
- }
164
+ @Internal
165
+ lateinit var vssModelGenerator: VssModelGenerator
162
166
163
167
@TaskAction
164
168
fun provideFile (inputChanges : InputChanges ) {
165
- inputChanges.getFileChanges(inputDir ).forEach { change ->
169
+ inputChanges.getFileChanges(vssDir ).forEach { change ->
166
170
if (change.fileType == FileType .DIRECTORY ) return @forEach
167
171
168
172
val file = change.file
@@ -172,18 +176,18 @@ private abstract class GenerateVssModelsTask : DefaultTask() {
172
176
return @forEach
173
177
}
174
178
175
- val targetFile = outputDir .file(change.normalizedPath).get().asFile
179
+ val targetFile = generatedOutputDir .file(change.normalizedPath).get().asFile
176
180
logger.info(" Found VSS file changes for: ${targetFile.name} , change: ${change.changeType} " )
177
181
178
182
when (change.changeType) {
179
183
ChangeType .ADDED ,
180
184
ChangeType .MODIFIED ,
181
185
-> {
182
- val outputDir = outputDir .asFile.get()
186
+ val outputDir = generatedOutputDir .asFile.get()
183
187
outputDir.deleteRecursively()
184
188
outputDir.mkdirs()
185
189
186
- val vssFiles = inputDir .asFile.get()
190
+ val vssFiles = vssDir .asFile.get()
187
191
.walk()
188
192
.filter { it.isFile }
189
193
.filter { validVssExtension.contains(it.extension) }
@@ -196,7 +200,7 @@ private abstract class GenerateVssModelsTask : DefaultTask() {
196
200
vssModelGenerator.generate(vssFiles)
197
201
}
198
202
199
- ChangeType .REMOVED -> outputDir .asFile.get().deleteRecursively()
203
+ ChangeType .REMOVED -> generatedOutputDir .asFile.get().deleteRecursively()
200
204
else -> logger.warn(" Could not determine file change type: ${change.changeType} " )
201
205
}
202
206
}
0 commit comments