22 de novembro de 2014

Ocultar mensagem de apresentação no PUC do Pentaho BA 5.2

Bom para quem utiliza a versão CE em produção, segue abaixo uma dica para melhorar a apresentação do Pentaho User Console (PUC). Provavelmente você não utiliza a apresentação ou "frame" de boas vindas do PUC, então porque não ocultá-la, deixando sua aplicação com um perfil mais personalizado.
Acima, há uma ilustração do PUC, na configuração padrão, logo após a realização do login. Abaixo, segue a ilustração do puc, sem a tela de apresentação. Veja como ocultar este "contêiner".
1. Pare o serviço do Pentaho BA.
2. Faça uma cópia do arquivo a ser alterado, conforme o exemplo abaixo.
~# cp ./tomcat/webapps/pentaho/mantle/home/index.jsp ./tomcat/webapps/pentaho/mantle/home/index.jsp.ori
3. Edite o arquivo "./tomcat/webapps/pentaho/mantle/home/index.jsp". Comente as linhas referentes à apresentação do Pentaho, conforme o exemplo abaixo.
<%-- <div class="row-fluid welcome-container">
  <iframe src="content/welcome/index.html" class='welcome-frame' frameborder="0" scrolling="no"></iframe>
</div> --%>
4. Ainda no arquivo "./tomcat/webapps/pentaho/mantle/home/index.jsp", altere o posicionamento das informações de arquivos recentes (Recents) e favoritos (Favorites). Logo acima da tag comentada, dentro da tag "<div class="span9" style="overflow:visible">", inclua as tags referentes aos contêiners "Recents" e "Faorites", conforme segue.
< ... >
<div class="span9" style="overflow:visible">
<div class="row-fluid">
<div class='span12'>
<script id="recentsTemplate" type="text/x-handlebars-template" delayCompile="true">
            <div id="recents" class="well widget-panel">
              <h3>
                {{i18n.recents}}
              </h3>
              <div id="recentsSpinner"></div>
              {{#if isEmpty}}
              <div class="empty-panel content-panel">
                <div class="centered">
                  <div class="empty-message">{{i18n.empty_recents_panel_message}}</div>
                  <button class="pentaho-button" onclick="window.top.mantle_setPerspective('browser.perspective');">{{i18n.browse}}</button>
                </div>
              </div>
              {{else}}
              <div id="recents-content-panel" class="content-panel">
                <ul class="nav nav-tabs nav-stacked">
                  {{#eachRecent recent}}
                  <li>
                    <a href="javascript:Home.openRepositoryFile('{{escapeQuotes fullPath}}', 'run')" title='{{title}}'>
                      <div class="row-fluid">
                        <div class="span10 ellipsis">
                          {{#if xanalyzer}} <i class="pull-left content-icon file-xanalyzer"/> {{/if}}
                          {{#if xdash}} <i class="pull-left content-icon file-xdash"/> {{/if}}
                          {{#if xcdf}} <i class="pull-left content-icon file-xcdf"/> {{/if}}
                          {{#if prpti}} <i class="pull-left content-icon file-prpti"/> {{/if}}
                          {{#if ktr}} <i class="pull-left content-icon file-ktr"/> {{/if}}
                          {{#if prpt}} <i class="pull-left content-icon file-prpt"/> {{/if}}
                          {{#if xaction}} <i class="pull-left content-icon file-xaction"/> {{/if}}
                          {{#if url}} <i class="pull-left content-icon file-url"/> {{/if}}
                          {{#if html}} <i class="pull-left content-icon file-html"/> {{/if}}
                          {{#if cda}} <i class="pull-left content-icon file-cda"/> {{/if}}
                          {{#if wcdf}} <i class="pull-left content-icon file-wcdf"/> {{/if}}
                          {{#if unknownType}} <i class="pull-left content-icon file-unknown"/> {{/if}}
                          <span class="pad-left">{{title}}</span>
                        </div>
                        <div class="span2">
                          {{#unless isEmpty}}
                          {{#if isFavorite}}
                          <i title="{{../../../i18n.remove_favorite_tooltip}}" class="pull-right favorite-on" onclick="controller.unmarkRecentAsFavorite('{{escapeQuotes fullPath}}'); return false;"/>
                          {{else}}
                          <i title="{{../../../i18n.add_favorite_tooltip}}" class="pull-right favorite-off" onclick="controller.markRecentAsFavorite('{{escapeQuotes fullPath}}', '{{escapeQuotes title}}'); return false;"/>
                          {{/if}}
                          {{/unless}}
                        </div>
                      </div>
                    </a>
                  </li>
                  {{/eachRecent}}
                </ul>
              </div>
              {{/if}}
            </div>
          </script>
          <div id="recentsContianer"></div>
        </div>
      </div>
<div class="row-fluid">
<div class="span12">
<script id="favoritesTemplate" type="text/x-handlebars-template" delayCompile="true">
            <div id="favorites" class="well widget-panel">
              <h3>
                {{i18n.favorites}}
              </h3>
              <div id="favoritesSpinner"></div>
              {{#if isEmpty}}
              <div class="empty-panel content-panel">
                <div class="centered">
                  <div class="empty-message">{{i18n.empty_favorites_panel_message}}</div>
                  <button class="pentaho-button" onclick="window.top.mantle_setPerspective('browser.perspective')">{{i18n.browse}}</button>
                </div>
              </div>
              {{else}}
              <div id="favorites-content-panel" class="content-panel">
                <ul class="nav nav-tabs nav-stacked">
                  {{#eachFavorite favorites}}
                  <li>
                    <a href="javascript:Home.openRepositoryFile('{{escapeQuotes fullPath}}', 'run')" title='{{title}}'>
                      <div class="row-fluid">
                        <div class="span10 ellipsis">
                          {{#if xanalyzer}} <i class="pull-left content-icon file-xanalyzer"/> {{/if}}
                          {{#if xdash}} <i class="pull-left content-icon file-xdash"/> {{/if}}
                          {{#if xcdf}} <i class="pull-left content-icon file-xcdf"/> {{/if}}
                          {{#if prpti}} <i class="pull-left content-icon file-prpti"/> {{/if}}
                          {{#if prpt}} <i class="pull-left content-icon file-prpt"/> {{/if}}
                          {{#if ktr}} <i class="pull-left content-icon file-ktr"/> {{/if}}
                          {{#if xaction}} <i class="pull-left content-icon file-xaction"/> {{/if}}
                          {{#if url}} <i class="pull-left content-icon file-url"/> {{/if}}
                          {{#if html}} <i class="pull-left content-icon file-html"/> {{/if}}
                          {{#if unknownType}} <i class="pull-left content-icon file-unknown"/> {{/if}}
                          <span class="pad-left">{{title}}</span>
                        </div>
                        <div class="span2">
                          {{#unless isEmpty}}
                          <i title="{{../../../i18n.remove_favorite_tooltip}}" class="pull-right favorite-on" onclick="controller.unmarkRecentAsFavorite('{{escapeQuotes fullPath}}'); return false;"/>
                          {{/unless}}
                        </div>
                      </div>
                    </a>
                  </li>
                  {{/eachFavorite}}
                </ul>
              </div>
              {{/if}}
            </div>
          </script>
          <div id="favoritesContianer"></div>
        </div>
      </div>
<%-- <div class="row-fluid welcome-container">
<iframe src="content/welcome/index.html" class='welcome-frame' frameborder="0" scrolling="no"></iframe>
</div> --%>

</div>
< ... >
5. Inicie o serviço do Pentaho BA.
Pronto, o seu PUC agora está de cara nova.

Leia mais ...

15 de novembro de 2014

Integração Pentaho BA 5.2 CE com PostgreSQL 9.3

Veja aqui como integrar o Pentaho Business Analytics (BA) 5.2 Comminity Edition (CE) ao Sistema Gerenciador de Banco de Dados (SGBD) PostgreSQL 9.3. Acredito que esta instalação não seja mais novidade, no entanto, vários profissionais preferem consultar uma documentação mais atualizada. E como estou precisando realizar esta integração agora, apenas vou descrever aqui os passos à medida em que eu for realizando os procedimentos.
Como já é sabido, a partir da versão 5.0 a Pentaho optou por utilizar um gerenciador de conteúdos para armazenar o repositório da soluções, contrário às versões anteriores que utilizavam diretamente o sistema de arquivos. Este gerenciador de conteúdos é o Apache Jackrrabit, que por padrão vem pré configurado na versão CE, utilizando o SGBD H2. Então vamos precisar migrar o banco chamado "jackrabbit", que recebe o mesmo nome do gerenciador de conteúdos, assim como, os tradicionalmente utilizados pela Pentaho, o hibernate e o quartz que utilizam o SGBD HSQLDB.
Antes de iniciar a integração, é necessário que você providencie a instalação do Pentaho BA 5.2 CE e do SGBD PostgreSQL. Consulte os links citados abaixo para realizar estas tarefas.

1 -  Criação da estrutura básica de bancos de dados do PostgreSQL
Agora que estamos com o Pentaho BA 5.2 e o PostgreSQL funcionais, podemos iniciar a migração.
Então, inicialmente, vamos preparar os bancos de dados, utilizando os scripts disponibilizados na própria instalação do biserver-ce.
Tendo como referência a instalação do Pentaho BA 5.2, copie a pasta dos scripts do PostgreSQL para outra pasta, ou se for o caso de utilizar um servidor dedicado para o SGBD, copie para uma pasta neste servidor.
~# cp -rv ./biserver-ce/data/postgresql /tmp

Utilizando o usuário "postgres" ou "superuser" do PostgreSQL, execute os scripts para criação da estrutura básica, ou seja, bancos de dados e/ou tabelas.
~# su - postgres
~$ psql -p 5432 -f /tmp/postgresql/create_repository_postgresql.sql
~$ psql -p 5432 -f /tmp/postgresql/create_quartz_postgresql.sql
~$ psql -p 5432 -f /tmp/postgresql/create_jcr_postgresql.sql

No PostgreSQL, utilizando o "psql", crie a tabela "QRTZ" no banco do "quartz".
~$ psql
postgres=# \c quartz;
 CREATE TABLE "QRTZ"
(
NAME VARCHAR(200) NOT NULL,
PRIMARY KEY (NAME)
);

Observe que os bancos foram criados.
~$ psql
postgres=# \l
                                           List of databases
      Name       |    Owner     | Encoding |   Collate   |    Ctype    |       Access privileges      
-----------------+--------------+----------+-------------+-------------+-------------------------------
 hibernate   | hibuser | UTF8     | pt_BR.UTF-8 | pt_BR.UTF-8 | =Tc/hibuser +                  |              |          |             |             | hibuser=CTc/hibuser
 jackrabbit  | jcr_user  | UTF8     | pt_BR.UTF-8 | pt_BR.UTF-8 | =Tc/jcr_user  +                  |              |          |             |             | jcr_user=CTc/jcr_user
 quartz       | pentaho_user | UTF8     | pt_BR.UTF-8 | pt_BR.UTF-8 | =Tc/pentaho_user             +

Não esquecer de habilitar o acesso a estes bancos, para o Pentaho BA, no "pg_hba.conf". Na dúvida, veja este post "Configurações adicionais para PostgreSQL 9.1", que serve também para a versão 9.3 do PostgreSQL.

2 - Configuração do PostgreSQL no Pentaho BA 5.2 CE
Pare o serviço do Pentaho BA / PUC.
Faça um backup do Pentaho BA 5.2. Veja um exemplo a seguir.
~# mkdir /opt/backups
~# tar -vzcf /opt/backups/biserver-ce-aaaammdd.tar.gz ./biserver-ce

Vamos configurar os principais parâmetros dos arquivos, utilizando as configurações padrões utilizadas nos scripts, sendo:
Banco de Dados      Usuário             Senha
hibernate                   hibuser                 password
quartz                         pentaho_user      password
jackrabbit                   jcr_user                password

Altere somente as informações que estão em destaque.

Arquivo: "./tomcat/webapps/pentaho/META-INF/context.xml".
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/pentaho" docbase="webapps/pentaho/">
<Resource name="jdbc/Hibernate"
     auth="Container" type="javax.sql.DataSource"
     factory="org.apache.commons.dbcp.BasicDataSourceFactory"
     maxActive="20" maxIdle="5"
     maxWait="10000"
     username="hibuser"
     password="password"
     driverClassName="org.postgresql.Driver"
     url="jdbc:postgresql://localhost:5432/hibernate"
     validationQuery="select 1"/>
<Resource name="jdbc/Quartz"
     auth="Container"
     type="javax.sql.DataSource" 
     factory="org.apache.commons.dbcp.BasicDataSourceFactory"
     maxActive="20"
     maxIdle="5"
     maxWait="10000"
     username="pentaho_user"
     password="password"
     driverClassName="org.postgresql.Driver"
     url="jdbc:postgresql://localhost:5432/quartz"
     validationQuery="select 1"/>
</Context>

 
Exclua este Arquivo: "./tomcat/conf/Catalina/localhost/pentaho.xml".
~# sudo rm -rf ./tomcat/conf/Catalina/localhost/pentaho.xml

Arquivo: "./pentaho-solutions/system/dialects/postgresql/applicationContext-spring-security-hibernate.properties".
jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/hibernate
jdbc.username=hibuser
jdbc.password=password
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

Arquivo: "./pentaho-solutions/system/applicationContext-spring-security-hibernate.properties".
jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/hibernate
jdbc.username=hibuser
jdbc.password=password
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
 


Arquivo: "./pentaho-solutions/system/hibernate/hibernate-settings.xml".
<config-file>system/hibernate/postgresql.hibernate.cfg.xml</config-file>

Arquivo: "./pentaho-solutions/system/hibernate/postgresql.hibernate.cfg.xml".
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="connection.url">jdbc:postgresql://localhost:5432/hibernate</property>
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="connection.username">hibuser</property>
<property name="connection.password">password</property>


Arquivo: "./pentaho-solutions/system/jackrabbit/repository.xml".
Neste arquivo, é necessário a correção em vários parâmetros. Utilize o nome da classe como referência, para certificar que todas as modificações foram realizadas. Observe que as configurações referentes ao banco h2 são comentadas e as do PostgreSQL descomn
Classe: "org.apache.jackrabbit.core.fs.local.LocalFileSystem".
-->
<FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
     <param name="driver" value="org.postgresql.Driver"/>
     <param name="url" value="jdbc:postgresql://localhost:5432/jackrabbit"/>
     <param name="user" value="jcr_user"/>
     <param name="password" value="password"/>
     <param name="schema" value="postgresql"/>
     <param name="schemaObjectPrefix" value="fs_repos_"/>
</FileSystem>
<!--
<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
     <param name="path" value="${rep.home}/repository"/>
</FileSystem>
-->

Classe: "org.apache.jackrabbit.core.data.db.DbDataStore".
-->
<DataStore class="org.apache.jackrabbit.core.data.db.DbDataStore">
     <param name="url" value="jdbc:postgresql://localhost:5432/jackrabbit"/>
     <param name="driver" value="org.postgresql.Driver"/>
     <param name="user" value="jcr_user"/>
     <param name="password" value="password"/>
     <param name="databaseType" value="postgresql"/>
     <param name="minRecordLength" value="1024"/>
     <param name="maxConnections" value="3"/>
     <param name="copyWhenReading" value="true"/>
     <param name="tablePrefix" value=""/>
     <param name="schemaObjectPrefix" value="ds_repos_"/>
</DataStore>
<!--
<DataStore class="org.apache.jackrabbit.core.data.FileDataStore"/>
-->

 
Classe: "org.apache.jackrabbit.core.fs.db.DbFileSystem".
-->
<FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
     <param name="driver" value="org.postgresql.Driver"/>
     <param name="url" value="jdbc:postgresql://localhost:5432/jackrabbit"/>
     <param name="user" value="jcr_user"/>
     <param name="password" value="password"/>
     <param name="schema" value="postgresql"/>
     <param name="schemaObjectPrefix" value="fs_ws_"/>
</FileSystem>
<!--
<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
     <param name="path" value="${wsp.home}"/>
</FileSystem>
-->

Classe: "org.apache.jackrabbit.core.persistence.bundle.PostgreSQLPersistenceManager".
-->
<PersistenceManager
     class="org.apache.jackrabbit.core.persistence.bundle.PostgreSQLPersistenceManager">
     <param name="url" value="jdbc:postgresql://localhost:5432/jackrabbit"/>
     <param name="driver" value="org.postgresql.Driver"/>
     <param name="user" value="jcr_user"/>
     <param name="password" value="password"/>
     <param name="schema" value="postgresql"/>
     <param name="schemaObjectPrefix" value="${wsp.name}_pm_ws_"/>
</PersistenceManager>
<!--
<PersistenceManager 
     class="org.apache.jackrabbit.core.persistence.pool.H2PersistenceManager">
     <param name="url" value="jdbc:h2:${wsp.home}/db"/>
     <param name="schemaObjectPrefix" value="${wsp.name}_"/>
</PersistenceManager>
-->

Classe: "org.apache.jackrabbit.core.fs.db.DbFileSystem".
-->
    <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
      <param name="driver" value="org.postgresql.Driver"/>
      <param name="url" value="jdbc:postgresql://localhost:5432/jackrabbit"/>
      <param name="user" value="jcr_user"/>
      <param name="password" value="password"/>
      <param name="schema" value="postgresql"/>
      <param name="schemaObjectPrefix" value="fs_ver_"/>
    </FileSystem>
<!--
    <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
      <param name="path" value="${rep.home}/version" />
    </FileSystem>
-->

Classe: "org.apache.jackrabbit.core.persistence.bundle.PostgreSQLPersistenceManager".
-->
<PersistenceManager
     class="org.apache.jackrabbit.core.persistence.bundle.PostgreSQLPersistenceManager">
     <param name="url" value="jdbc:postgresql://localhost:5432/jackrabbit"/>
     <param name="driver" value="org.postgresql.Driver"/>
     <param name="user" value="jcr_user"/>
     <param name="password" value="password"/>
     <param name="schema" value="postgresql"/>
     <param name="schemaObjectPrefix" value="pm_ver_"/>
</PersistenceManager>
<!--
<PersistenceManager
     class="org.apache.jackrabbit.core.persistence.pool.H2PersistenceManager">
     <param name="url" value="jdbc:h2:${rep.home}/version/db"/>
     <param name="schemaObjectPrefix" value="version_"/>
</PersistenceManager>
-->


Arquivo: "./tomcat/webapps/pentaho/WEB-INF/web.xml".
Comente as linhas referentes à inicialização do SGBD HSQLDB, uma vez que este serviço não mais será utilizado.
<!-- [BEGIN HSQLDB DATABASES]
<context-param>
     <param-name>hsqldb-databases</param-name>
     <param-value>sampledata@../../data/hsqldb/sampledata,hibernate@../../data/hsqldb/hibernate,quartz@../../data/hsqldb/quartz</param-value>
</context-param>
[END HSQLDB DATABASES] -->


<!-- [BEGIN HSQLDB STARTER]
<listener>
     <listener-class>org.pentaho.platform.web.http.context.HsqldbStartupListener</listener-class>
</listener>
[END HSQLDB STARTER] -->

Arquivo: "./pentaho-solutions/system/pentaho-spring-beans.xml".
Comente a linha referente à inicialização do SGBD H2, uma vez que este serviço não mais será utilizado.
<!-- <import resource="GettingStartedDB-spring.xml" /> Remove this line to unhook the Getting Started DB -->

Com atenção, exclua os arquivos conforme o exemplo a seguir:
~# rm -rf ./tomcat/work/*
~# rm -rf ./tomcat/temp/*
~# rm -rf ./pentaho-solutions/system/jackrabbit/repository/repository
~# rm -rf ./pentaho-solutions/system/jackrabbit/repository/workspaces

Concluído as configurações, Inicie o serviço do PUC.

Em caso de problemas na inicialização, reveja as configurações, observando a bertura e fechamento de tags, nomes de usuários, senhas, drivers configurados nos arquivos, ip's e portas dos bancos, que são os principais problema ocorridos.
Utilize o log do tomcat como suporte para esta tarefa, em "./tomcat/logs/catalina.out".
Leia mais ...

1 de novembro de 2014

Inicializar o HSQLDB independentemente do Pentaho BA

Hoje vamos demandar uma dica simples. Quando fazemos a opção pela mudança do banco de metadados do Pentaho BA, independendo do Sistema Gerenciador de Banco de Dados (SGBD) escolhido para a substituição, perdemos de certa forma, o acesso ao Data Wherehouse (DW) de teste, o "SampleData", que acompanha a solução.
Por que isso ocorre? O Hypersonic SQL Database (HSQLDB) é o SGBD que dá suporte aos bancos "hibernate", "quartz" e "SampleData". Logo, quando os bancos de metadados são desabilitados, conforme sugerido na documentação da Pentaho, o "SampleData" fica indisponível.
Para a solução deste problema, as opções são, popular um novo banco "SampleData" no SGBD adotado, utilizando dumps/SQL encontrados na internet, ou de forma rápida e eficiente, inicializar de forma independente o HSQLDB, conforme mostrarei neste post.

1 - Configurando o HSQLDB
Criar uma pasta "hsqldb".
~# mkdir /opt/hsqldb
~# cd ./biserver-ce/data/
~# cp -rv ./*.bat ./*.sh ./hsqldb ./lib /opt/hsqldb

Configurar o script de inicialização
Editar o script "start_hypersonic.sh" e comentar apenas os comandos correspondentes à inicialização dos bancos do hibernate e do quartz, que não serão mais utilizados.
"$_PENTAHO_JAVA" -cp $THE_CLASSPATH org.hsqldb.Server -database.0 $DIR_REL/hsqldb/sampledata -dbname.0 sampledata
# -database.1 $DIR_REL/hsqldb/hibernate -dbname.1 hibernate -database.2 $DIR_REL/hsqldb/quartz -dbname.2 quartz

Configurar o script de finalização
Editar o script "stop_hypersonic.sh" e comentar apenas os comandos correspondentes à finalização dos bancos do hibernate e do quartz.
"$_PENTAHO_JAVA" -cp $THE_CLASSPATH org.hsqldb.util.ShutdownServer -url "jdbc:hsqldb:hsql://localhost/sampledata" -user "SA" -password ""
# "$_PENTAHO_JAVA" -cp $THE_CLASSPATH org.hsqldb.util.ShutdownServer -url "jdbc:hsqldb:hsql://localhost/hibernate" -user "SA" -password ""
# "$_PENTAHO_JAVA" -cp $THE_CLASSPATH org.hsqldb.util.ShutdownServer -url "jdbc:hsqldb:hsql://localhost/quartz" -user "sa" -password ""


2 - Inicializando ou parando o serviço hsqldb
Inicializando o HSQLDB
~# cd /opt/hsqldb
~# ./start_hypersonic.sh &

Para ver se o SGBD foi inicializado, execute o comando "netstat", coforme citado abaixo.
A porta utilizada pelo HSQLDB é 9001, default para o serviço.
~# netstat -nap | grep 901
tcp6       0      0 :::9001                 :::*                    OUÇA       -


Parando o HSQLDB
~# cd /opt/hsqldb
~# ./stop_hypersonic.sh &

3 - Configuração do Sampledata no HSQLDB
No Pentaho BA, crie uma nova "Conexão de Fonte de dados", com as informações a seguir e realize o teste de conexão:
- Connection Name: SampleData
- Database Type: Hypersonic
- Host Name: localhost
- Database Name: SampleData
- Port Number:9001
- User Name: pentaho_user
- Password: [Deixar sem preencher] 
Faça o teste de conexão.
Finalizado, o SampleData já pode ser utilizado.

Leia mais ...