Доступ к доменной модели
При разработке иногда часто хочется иметь под рукой доменную модель со всеми сервисами и доступом к актуальной базе, чтобы можно было нагенерить нужных данных и положить их в базу, замерить производительность выборок, простестировать работоспособность отдельного куска кода. Это особенно удобно, если контейнер долго запускается. Впервые я это увидел в Django: dbshell, что весьма удобно. Мы имитировали этот шелл, положив запускабельный класс в папку с тестами, который инициализировал доменную модель и необходимый набор сервисов.POC веб-консоли
Но хочется большего. В серверных приложения за время работы может накопиться невоспроизводимое состояние, либо в целом приложение начинает вести себя неадекватно. Основной способ борьбы - выводить подробные логи, а потом вдумчиво курить стектрейсы, строя гипотезы, как исключение могло возникнуть. А потом перезапустить приложение. Но что если доступаться к живому приложению? Возможности по съему телеметрии стали бы неограниченными: нам доступно для чтения и изменения все состояние живого приложения (правда неосторожными действиями можно его легко убить).Groovy гордится своей встраиваемостью, синтаксис совместим с джавой, есть готовый шелл. В общем я нашел репост репоста репоста (оригинал протух). Главным недостатком была завязанность на Spring, а хотелось Guice. Оставалось дело за малым.
Все исходники лежат в песочнице. Запускабельный EmbeddedServer заполняет нехитрую доменную модель из двух сущностей тестовыми данными и поднимает embedded Jetty сервер. За DI отвечает GuiceListener, который рулит маппингом и инъектит EntityManager-ами. За выполнение скриптов отвечает GroovyService из которого я выкинул всё, что относилось к Spring. HTML страница с шеллом находится в index.html.
Как работает?

2. В TextArea вводим скрипт
3. Жмем Evar
4. Снизу получаем результат выполнения
5. Если нажать Refresh еще раз, то увидим новую строку.
В скрипте доступны дву переменные: log для вывода в лог сервера и emp - Guice провайдер для EntityManager.
Скрипты выполняются довольно быстро. Можно даже попробовать сделать что-то вроде реальной консоли с сохранением состояния в сессии, но зачем заморачиваться.