@@ -53,6 +53,10 @@ open class FileTreeNode() {
53
53
@Transient
54
54
var context: VelocityContext ? = null
55
55
56
+ // flag whether the node is resolved, if true, represents the node info has been resolved via the velocity engine or placeholders.
57
+ @Transient
58
+ var resolved: Boolean = false
59
+
56
60
companion object {
57
61
58
62
private val TAG = FileTreeNode ::class .java.simpleName
@@ -156,11 +160,11 @@ open class FileTreeNode() {
156
160
fileName : String = this.name,
157
161
): String {
158
162
return if (isDir) {
159
- val rn = replacePlaceholder (velocityContext, fileName, getPlaceholderInherit(), false )
163
+ val rn = getResolveTemplate (velocityContext, fileName, getPlaceholderInherit(), false )
160
164
if (getModuleInherit()?.lowercaseDir == true ) rn.lowercase() else rn
161
165
} else {
162
166
val capitalize = getModuleInherit()?.capitalizeFile ? : false
163
- replacePlaceholder (velocityContext, fileName, getPlaceholderInherit(), capitalize)
167
+ getResolveTemplate (velocityContext, fileName, getPlaceholderInherit(), capitalize)
164
168
}
165
169
}
166
170
@@ -183,6 +187,8 @@ open class FileTreeNode() {
183
187
184
188
/* *
185
189
* Return all file template in tree node
190
+ *
191
+ * TODO: optimize
186
192
*/
187
193
fun getAllTemplateMap (): Map <String , String > {
188
194
val templates = fileTemplates.orEmpty().toMutableMap()
@@ -212,19 +218,15 @@ open class FileTreeNode() {
212
218
}
213
219
214
220
fun getFileTemplateInherit (): MutableMap <String , String >? {
215
- return if (fileTemplates.isNullOrEmpty()) {
216
- return parent?.getFileTemplateInherit()
217
- } else {
218
- fileTemplates
219
- }
221
+ return parent?.getFileTemplateInherit()?.apply {
222
+ putAll(fileTemplates.orEmpty())
223
+ } ? : fileTemplates ? : mutableMapOf ()
220
224
}
221
225
222
226
fun getPlaceholderInherit (): MutableMap <String , String >? {
223
- return if (placeholders.isNullOrEmpty()) {
224
- return parent?.getPlaceholderInherit()
225
- } else {
226
- placeholders
227
- }
227
+ return parent?.getPlaceholderInherit()?.apply {
228
+ putAll(placeholders.orEmpty())
229
+ } ? : placeholders ? : mutableMapOf ()
228
230
}
229
231
230
232
/* *
@@ -243,20 +245,31 @@ open class FileTreeNode() {
243
245
* Resolve all file template file name in tree node.
244
246
*/
245
247
fun resolveFileTemplate (context : VelocityContext ? = getContextInherit()) {
246
- val templates = getAllTemplateMap()
247
- val placeholders = getPlaceholderInherit() ? : return
248
- if (fileTemplates != null && templates.isNotEmpty()) {
249
- templates.forEach { (key, value) ->
250
- val realName = getRealNameInternal(context, key)
251
- val realValue = replacePlaceholder(context, value, placeholders, false )
252
- fileTemplates!! [realName] = realValue
248
+ val templates = getFileTemplateInherit()
249
+ if (templates != null ) {
250
+ val resolved = mutableMapOf<String , String >()
251
+ val capitalize = getModuleInherit()?.capitalizeFile ? : false
252
+ templates.forEach {
253
+ val resolvedFileName =
254
+ getResolveTemplate(context, it.key, getPlaceholderInherit(), capitalize = capitalize)
255
+ resolved[resolvedFileName] = it.value
253
256
}
257
+ fileTemplates = resolved
254
258
}
255
259
traversal({ it, _ ->
256
260
it.resolveFileTemplate(context)
257
261
})
258
262
}
259
263
264
+ fun resolve () {
265
+ resolved = true
266
+ resolveTreeFileName()
267
+ resolveFileTemplate()
268
+ traversal({ it, _ ->
269
+ it.resolved = true
270
+ })
271
+ }
272
+
260
273
/* *
261
274
* Return the most matching file template.
262
275
* If the node has template, return it, otherwise return the template in parent node.
@@ -608,23 +621,23 @@ open class FileTreeNode() {
608
621
return result
609
622
}
610
623
611
- private fun replacePlaceholder (
624
+ private fun getResolveTemplate (
612
625
velocityContext : VelocityContext ? = null,
613
- origin : String ,
614
- placeholders : Map <String , String >? ,
626
+ template : String ,
627
+ variables : Map <String , String >? ,
615
628
capitalize : Boolean = false
616
629
): String {
617
630
if (velocityContext != null ) {
618
631
val writer = StringWriter ()
619
- Velocity .evaluate(velocityContext, writer, " FileTreeNode" , origin )
632
+ Velocity .evaluate(velocityContext, writer, " FileTreeNode" , template )
620
633
return writer.toString()
621
634
}
622
635
623
- var after = origin
624
- if (placeholders .isNullOrEmpty()) {
625
- return origin
636
+ var after = template
637
+ if (variables .isNullOrEmpty()) {
638
+ return template
626
639
}
627
- placeholders .forEach { (k, v) ->
640
+ variables .forEach { (k, v) ->
628
641
var replacement = v
629
642
if (capitalize) {
630
643
replacement = v.lowercase(Locale .getDefault())
@@ -634,10 +647,10 @@ open class FileTreeNode() {
634
647
}
635
648
after = after.replace(" \$ {$k }" , replacement)
636
649
}
637
- return if (after == origin || ! after.contains(' $' )) {
650
+ return if (after == template || ! after.contains(' $' )) {
638
651
after
639
652
} else {
640
- replacePlaceholder (velocityContext, after, placeholders , capitalize)
653
+ getResolveTemplate (velocityContext, after, variables , capitalize)
641
654
}
642
655
}
643
656
}
0 commit comments