Grails grailApplication.controllerClasses контроллер сортировки по пакетам - PullRequest
0 голосов
/ 28 февраля 2012

У меня есть следующий код, который захватывает все контроллеры, сортирует его и выводит в тегах li:

<g:each var="c" in="${grailsApplication.controllerClasses.sort { it.fullName } }">
        <li<%= c.logicalPropertyName == controllerName ? ' class="active"' : '' %>>
                <g:link controller="${c.logicalPropertyName}">${c.naturalName}</g:link>
        </li>
</g:each>

Мне нужно отфильтровать контроллеры по пакетам, т.е. получить контроллер из определенного пакета.

Например:

com.app.module.mars.controller.HelloController
com.app.module.venus.controller.PrintController

Как вы можете видеть, я упаковываю контроллеры по модулям, поэтому у mars будет свой набор контроллеров, а у venus будет свой.Затем в пользовательском интерфейсе я хочу использовать приведенный выше код (с некоторым фильтром), в котором модули будут отображаться как главные меню, а их контроллеры - как выпадающие.

Как я могу применить такой фильтр?Или, если бы вы могли вести меня в правильном направлении, было бы здорово.Спасибо.

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Вы можете использовать Collection#groupBy для группировки классов контроллера по имени пакета.

У меня нет системы Grails для быстрого тестирования, но это будет небольшой пример группировки классов по имени пакета:

def classes = [Integer, List, String]
def classesByPackage = classes.groupBy { it.package.name }
assert classesByPackage == ['java.lang': [Integer, String], 'java.util': [List]]

Затем можно выполнить итерацию по каждому packageName, чтобы создать каждое меню, и через каждый класс под этим именем пакета, чтобы создать каждый пункт меню. Что-то вроде ...

classesByPackage.each { packageName, packageClasses ->
    println "Menu $packageName"
    packageClasses.each { println "  Item $it.simpleName" }
}

... но с циклами в стиле GSP:)

1 голос
/ 28 февраля 2012

Вы можете использовать GrailsClassUtils.isClassBelowPackage(), который принимает класс и список пакетов в качестве аргументов.Так что это должно сработать:

GrailsClassUtils.isClassBelowPackage(c.class, ['com.app.module.mars'])

Редактировать: grailsApplication.controllerClasses, вероятно, даст вам список GrailsClass объектов, поэтому вы захотите использовать c.clazz вместо c.class, как

grailsApplication.controllerClasses.each { c ->
    GrailsClassUtils.isClassBelowPackage(c.clazz, ['com.app.module.mars'])
}
...