@@ -53,6 +53,10 @@ open class FileTreeNode() {
5353 @Transient
5454 var context: VelocityContext ? = null
5555
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+
5660 companion object {
5761
5862 private val TAG = FileTreeNode ::class .java.simpleName
@@ -156,11 +160,11 @@ open class FileTreeNode() {
156160 fileName : String = this.name,
157161 ): String {
158162 return if (isDir) {
159- val rn = replacePlaceholder (velocityContext, fileName, getPlaceholderInherit(), false )
163+ val rn = getResolveTemplate (velocityContext, fileName, getPlaceholderInherit(), false )
160164 if (getModuleInherit()?.lowercaseDir == true ) rn.lowercase() else rn
161165 } else {
162166 val capitalize = getModuleInherit()?.capitalizeFile ? : false
163- replacePlaceholder (velocityContext, fileName, getPlaceholderInherit(), capitalize)
167+ getResolveTemplate (velocityContext, fileName, getPlaceholderInherit(), capitalize)
164168 }
165169 }
166170
@@ -183,6 +187,8 @@ open class FileTreeNode() {
183187
184188 /* *
185189 * Return all file template in tree node
190+ *
191+ * TODO: optimize
186192 */
187193 fun getAllTemplateMap (): Map <String , String > {
188194 val templates = fileTemplates.orEmpty().toMutableMap()
@@ -212,19 +218,15 @@ open class FileTreeNode() {
212218 }
213219
214220 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 ()
220224 }
221225
222226 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 ()
228230 }
229231
230232 /* *
@@ -243,20 +245,31 @@ open class FileTreeNode() {
243245 * Resolve all file template file name in tree node.
244246 */
245247 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
253256 }
257+ fileTemplates = resolved
254258 }
255259 traversal({ it, _ ->
256260 it.resolveFileTemplate(context)
257261 })
258262 }
259263
264+ fun resolve () {
265+ resolved = true
266+ resolveTreeFileName()
267+ resolveFileTemplate()
268+ traversal({ it, _ ->
269+ it.resolved = true
270+ })
271+ }
272+
260273 /* *
261274 * Return the most matching file template.
262275 * If the node has template, return it, otherwise return the template in parent node.
@@ -608,23 +621,23 @@ open class FileTreeNode() {
608621 return result
609622 }
610623
611- private fun replacePlaceholder (
624+ private fun getResolveTemplate (
612625 velocityContext : VelocityContext ? = null,
613- origin : String ,
614- placeholders : Map <String , String >? ,
626+ template : String ,
627+ variables : Map <String , String >? ,
615628 capitalize : Boolean = false
616629 ): String {
617630 if (velocityContext != null ) {
618631 val writer = StringWriter ()
619- Velocity .evaluate(velocityContext, writer, " FileTreeNode" , origin )
632+ Velocity .evaluate(velocityContext, writer, " FileTreeNode" , template )
620633 return writer.toString()
621634 }
622635
623- var after = origin
624- if (placeholders .isNullOrEmpty()) {
625- return origin
636+ var after = template
637+ if (variables .isNullOrEmpty()) {
638+ return template
626639 }
627- placeholders .forEach { (k, v) ->
640+ variables .forEach { (k, v) ->
628641 var replacement = v
629642 if (capitalize) {
630643 replacement = v.lowercase(Locale .getDefault())
@@ -634,10 +647,10 @@ open class FileTreeNode() {
634647 }
635648 after = after.replace(" \$ {$k }" , replacement)
636649 }
637- return if (after == origin || ! after.contains(' $' )) {
650+ return if (after == template || ! after.contains(' $' )) {
638651 after
639652 } else {
640- replacePlaceholder (velocityContext, after, placeholders , capitalize)
653+ getResolveTemplate (velocityContext, after, variables , capitalize)
641654 }
642655 }
643656}
0 commit comments