Debug Toolbar do JMINE

A DebugToolBar do JMINE foi criada para substituir a DebugBar do Wicket. O principal motivo para essa substituição foi a péssima usabilidade da DebugBar do Wicket, que acabava fazendo com que ela fosse ignorada pelos desenvolvedores e analistas da Maps.

Atualmente a DebugBar do Jmine provê as mesmas funcionalidades que a do Wicket, porém ela foi criada com o intuito de ser extensível de uma forma que cada produto possa personalizá-la de acordo com suas necessidades, tendo assim um maior controle sobre a debugBar é possível criar extensões poderosas que ajudem no dia a dia de cada colaborador da empresa.

Por default ela provê 3 painéis:

  • Queries Executadas

    Um painel que possui os tempos de execução de cada query executada em uma determinada tela do sistema.

  • General Info

    Um painel com informações gerais do sistemas tais como parâmetros passados nos headers do request, versão do wicket entre outras informações.

  • Session Info

    Um painel com algumas informações contidas na Session, como: Tamanho da sessão, Mensagens no FeedbackPanel e Credenciais do Usuário.

Um exemplo da debugBar em ação pode ser visualizado na GIF abaixo:

../../_images/debug-bar.gif

DebugBar em funcionamento

Adicionando novos painéis

Para adicionar novos painéis é necessário implementar a interface DebugToolbarContributor que possui 3 métodos:

  • title

    Determina qual é o Titulo do seu Painel;

  • summary

    Uma breve descrição, ou apresentação de algum dado relevante que o painel tem a oferecer;

  • createDebugPanel:id

    Cria o painel que deve ser apresentado pela DebugToolBar com o seu determinado ID.

Um exemplo de implementação dessa interface, pode ser visto em:

public class SessionInfoContributor implements DebugToolbarContributor {
    public String title() {
        return "Session Info";
    }

    /**
     * {@inheritDoc}
     */
    public String summary() {
        long sizeInBytes = Session.get().getSizeInBytes();
        double sizeInKB = sizeInBytes / 1024.0;
        return String.format("Size %.2fkb", sizeInKB);
    }

    /**
     * {@inheritDoc}
     */
    public Panel createDebugPanel(String id) {
        return new SessionInfoPanel(id);
    }
}

Após implementar o seu “contributor” basta registrá-lo na aplicação usando a própria infra de Registries do Jmine, utilizando como receiver o bean debugContributorsRegistry

<bean id="minimalContributor" class="jmine.tec.utils.register.Registrar">
    <property name="receiver" ref="debugContributorsRegistry"/>
    <property name="registers">
        <list>
            <bean class="jmine.tec.web.wicket.debug.contributors.info.GeneralInfoContributor"/>
            <bean class="jmine.tec.web.wicket.debug.contributors.session.SessionInfoContributor"/>
        </list>
     </property>
</bean>

Estilizando os painéis

O painel criado no método createDebugPanel é apenas um painel Wicket como outro qualquer, não é necessário implementar nenhum método adicional, apenas ficando atento que o método renderHead não irá funcionar para adicionar estilos ao painel, para isso é necessário implementar a interface HeaderContributor e registrá-la no receiver headerContributorRegistry da seguinte forma:

<bean id="databaseHeadersContributors" class="jmine.tec.utils.register.Registrar">
    <property name="receiver" ref="headerContributorsRegistry"/>
    <property name="registers">
        <list>
            <bean class="jmine.tec.web.wicket.debug.contributors.DatabaseStatisticsContributor"/>
        </list>
    </property>
</bean>

Bootstrap

O visual da DebugToolBar foi criado utilizando Twitter Bootstrap, porém, nem todos os produtos possuem o bootstrap ativado, para resolver esse problema foi criado um arquivo CSS de compatibilidade, para ativá-lo basta registrá-lo da seguinte forma:

<bean id="databaseHeadersContributors" class="jmine.tec.utils.register.Registrar">
    <property name="receiver" ref="headerContributorsRegistry"/>
    <property name="registers">
         <list>
             <bean class="jmine.tec.web.wicket.debug.contributors.legacy.NoBootstrapHeaderContributor"/>
         </list>
    </property>
 </bean>

Como pode ser visto a única responsabilidade da classe NoBootstrapHeaderContributor é adicionar um arquivo CSS no header da DebugToolBar

public class NoBootstrapHeaderContributor implements HeaderContributor {

    /**
     * {@inheritDoc}
     */
    public void renderHead(IHeaderResponse response) {
        response.renderCSSReference(ResourceReferenceUtils.getCSSResource("debug.toolbar.bootstrap.css"));
    }
}

Painel de Queries

O painel de queries da DebugToolBar utiliza dados coletados pelo p6spy, então para que ele possua dados para exibir é necessário ativar o p6spy no starter da sua aplicação. Por exemplo o jmine.tec.web.pages.app.StartTecWebPages que ativa o h2-sequence-p6spy setando ele como propriedade do sistema de forma estática:

static {
   System.setProperty(SpringConfigFactory.TEST_DATABASE_PROPERTY_NAME, "h2-sequence-p6spy");
}