jBPM Console 6.2.0.Final / JBoss: Autenticação utilizando seu banco de dados

Neste post, vamos aprender como realizar a autenticação do jBPM Console a partir de um banco de dados.

Conforme consta na documentação, o jbpm console utiliza a autenticação padrão do JBoss, que se baseia em dois arquivos: users.properties e roles.properties.

O primeiro contém a lista de usuários válidos e suas respectivas senhas. O segundo contém os usuários e a lista de grupos ao qual ele pertence. Esse método de autenticação está definido dentro do WAR, no arquivo WEB-INF/jboss-web.xml:

<security-domain>other</security-domain>

Essa configuração indica que o workbench irá utilizar o modelo de autenticação que estiver especificado no security domain chamado “other” dentro do standalone-*.xml.

Por padrão, esse security domain estará configurado conforme abaixo:

<security-domain name="other" cache-type="default">
    <authentication>
        <login-module code="UsersRoles" flag="required">
            <module-option name="usersProperties" value="${jboss.server.config.dir}/users.properties"/>
            <module-option name="rolesProperties" value="${jboss.server.config.dir}/roles.properties"/>
        </login-module>
    </authentication>
</security-domain>

Ok, agora sabemos como funciona por padrão. Agora vamos fazer os ajustes necessários para que possamos validar os usuários em nossa base de dados:

<security-domain name="other" cache-type="default">
    <authentication>
        <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
            <module-option name="dsJndiName" value="java:jboss/datasources/ExemploDS"/>
            <module-option name="principalsQuery" value="select senha as password from usuario where login = ?"/>
            <module-option name="rolesQuery" value="select g.nome as role, 'Roles' from usuario u inner join grupo g on (g.id = u.id_grupo) where u.login = ? union all select 'admin' as role, 'Roles'"/>
            <module-option name="hashAlgorithm" value="SHA-256"/>
            <module-option name="hashEncoding" value="hex"/>
        </login-module>
    </authentication>
</security-domain>

Temos dois “tricks” nesta configuração:

<module-option name="rolesQuery" value="select g.nome as role, 'Roles' from usuario u inner join grupo g on (g.id = u.id_grupo) where u.login = ? union all select 'admin' as role, 'Roles'"/>

Apenas usuários que pertencem as roles: admin, user e manager podem fazer logon. É provável que você não tenha essas roles cadastradas em sua tabela de grupos e provavelmente você não vai querer ficar limitado à essas 3 roles … o jeito então é retornar ambas de alguma forma. No exemplo eu utilizei uma union mas nada impede que você tenha uma função/procedure, uma tabela apenas para as roles, valores fixos, etc. O importante aqui é você saber que irá precisar de uma role que te autorize logar no console e você vai precisar de “roles” ou grupos para você criar seus processos ok?

    <module-option name="hashAlgorithm" value="SHA-256"/>
    <module-option name="hashEncoding" value="hex"/>

Essas duas linhas são opcionais e os valores vão depender da forma que suas senhas estão armazenadas em seu banco de dados. Se elas estiverem em plaintext, não será necessário nenhuma das duas linhas. Em meu caso, estou usando SHA-256 como criptografia e gravando os dados em hexadecimal.

A última configuração (confesso que não tenho 100% de certeza de que é necessária, se alguém souber, comente), é fazer com que a API (KIE Remote Services :: Cliente)  também utilize o mesmo método de autenticação:

<security-realm name="ApplicationRealm">
    <authentication>
        <jaas name="other"/>
    </authentication>
</security-realm>

Segue um bom material sobre security realms do JBoss: http://docs.jboss.org/jbossweb/3.0.x/realm-howto.html#DataSourceRealm

Até o próximo post o/

Tutorial de Instalação do jBPM 6.2 + PostgreSQL + JBoss 7.1 Final + Eclipse

Fala galera! O objetivo deste tutorial é guiá-los na instalação do jBPM 6.2.0.Final utilizando como base de dados o PostgreSQL. Não abordarei a instalação do PostgreSQL e do Ant pois não é o foco do tutorial.

AMBIENTE

Para este tutorial, estou utilizando o sistema operacional Ubuntu 14.04 mas nada impede que você utilize Windows ou qualquer outra distro Linux ok?

INGREDIENTES

  • Instalador do jBPM-6.2.0.Final
  • PostgreSQL
  • Ant
  • Uma boa conexão
  • Paciência

INSTALAÇÃO

Baixe o instalador: http://sourceforge.net/projects/jbpm/files/jBPM%206/jbpm-6.2.0.Final/jbpm-6.2.0.Final-installer-full.zip/download

Descompacte o arquivo no diretório “/opt” (ou em outro diretório de sua preferência)

Abra o arquivo build.properties que está na raiz do diretório “/opt/jbpm-installer”. O trabalho aqui é comentar/descomentar linhas, exceto a configuração do PostgreSQL que vamos adicionar.

As 3 primeiras linhas do arquivo indicam o diretório home da instalação, a snapshot e a release. Não é necessário fazer nenhuma alteração aqui.

install.home=./
snapshot.version=6.2.0-SNAPSHOT
release.version=6.2.0.Final

O próximo bloco diz respeito a versão do jBPM que iremos utilizar, como vamos trabalhar com a release, descomente as linhas abaixo e comente as demais:

jBPM.version=${release.version}
jBPM.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/drools/droolsjbpm-bpms-distribution/${jBPM.version}/droolsjbpm-bpms-distribution-${jBPM.version}-bin.zip

A próxima configuração é a respeito do WAR do jBPM Console que iremos instalar, em nosso caso, para JBoss AS 7:

jBPM.console.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/kie/kie-wb-distribution-wars/${jBPM.version}/kie-wb-distribution-wars-${jBPM.version}-jboss-as7.war

Eclipse + plugin jBPM e Drools:

droolsjbpm.eclipse.version=${release.version}
droolsjbpm.eclipse.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/drools/org.drools.updatesite/${droolsjbpm.eclipse.version}/org.drools.updatesite-${droolsjbpm.eclipse.version}.zip

e

eclipse.home=./eclipse
eclipse.clean.workspace=true

JBoss AS 7.1.1.Final:

jboss.server.version=as-7.1.1.Final
jboss.home=./jboss-${jboss.server.version}
jboss.download.url=http://download.jboss.org/jbossas/7.1/jboss-${jboss.server.version}/jboss-${jboss.server.version}.zip
jboss.server.conf.dir=${jboss.home}/standalone/configuration
jboss.server.deploy.dir=${jboss.home}/standalone/deployments
jboss.server.data.dir=${jboss.home}/standalone/data
jboss.clean.repository=true
jboss.war.type=${jboss.server.version}

O próximo é Dashboard. Dashboard é uma ferramenta utilizada para medir indicadores dos processos.

dashboard.version=${release.version}
dashboard.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/jbpm/dashboard/jbpm-dashboard-distributions/${dashboard.version}/jbpm-dashboard-distributions-${dashboard.version}-jboss-as7.war

E finalmente, o banco de dados. Por padrão, o jBPM usa o H2 como backend. Nós iremos utilizar o PostgreSQL 9.3 e a partir dessa configuração, fica fácil utilizar qualquer outro banco de dados.

Quem já tiver alguma experiência com módulos do JBoss, não terá nenhuma dificuldade aqui.
As duas linhas abaixo são respectivamente: O caminho de origem para o driver (jar) e a pasta do módulo no JBoss.

db.driver.jar=${install.home}/db/driver/${db.driver.jar.name}
db.driver.module.dir=${jboss.home}/modules/${db.driver.module.prefix}/main/

Faça o download do driver postgresql-9.3-1103.jdbc4.jar e salve-o na pasta “/opt/jbpm-installer/db/driver”.
No build.properties, comente as linhas referente ao H2 e acrescente as linhas abaixo:

#postgresql
db.name=postgresql
db.driver.module.prefix=org/postgresql
db.driver.jar.name=postgresql-9.3-1103.jdbc4.jar
db.driver.download.url=https://repository.jboss.org/nexus/content/repositories/thirdparty-uploads/postgresql/postgresql/9.1-902.jdbc4/postgresql-9.1-902.jdbc4.jar

Pronto. Depois de realizar essas alterações, seu arquivo build.properties deve se parecer com esse:

# NOTES for doing a release
# - replace all *.url variables with the variables marked as <RELEASE>
# - make sure all *.version variables = ${release.version}
# - set ${release.version} to the current release version.

install.home=./
snapshot.version=6.2.0-SNAPSHOT
release.version=6.2.0.Final

# the version of jBPM you want to use
# and the associated URL you want to get the dependencies from
# for example:
#<RELEASE>
#   jBPM.version=${release.version}
#   jBPM.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/jbpm/jbpm-distribution/${jBPM.version}/jbpm-distribution-${jBPM.version}-bin.zip
# or:
#<SNAPSHOT>
#   jBPM.version=${snapshot.version}
#   jBPM.url=https://hudson.jboss.org/hudson/job/jBPM/lastSuccessfulBuild/artifact/jbpm-distribution/target/jbpm-${jBPM.version}-bin.zip
jBPM.version=${release.version}
jBPM.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/drools/droolsjbpm-bpms-distribution/${jBPM.version}/droolsjbpm-bpms-distribution-${jBPM.version}-bin.zip

# the version of jBPM Console you want to use
# and the associated URL you want to get it from
# for example:
#<RELEASE>
# for AS7:
jBPM.console.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/kie/kie-wb-distribution-wars/${jBPM.version}/kie-wb-distribution-wars-${jBPM.version}-jboss-as7.war
# for EAP 6.4:
#   jBPM.console.url=http://repository.jboss.org/nexus/content/groups/public-jboss/org/kie/kie-wb-distribution-wars/${jBPM.version}/kie-wb-distribution-wars-${jBPM.version}-eap6_4.war
# for WildFly8:
#   jBPM.console.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/kie/kie-wb-distribution-wars/${jBPM.version}/kie-wb-distribution-wars-${jBPM.version}-wildfly8.war
# or:
#<SNAPSHOT>
#   jBPM.console.url=https://hudson.jboss.org/hudson/job/kie-wb-distributions/lastSuccessfulBuild/artifact/kie-wb/kie-wb-distribution-wars/target/kie-wb-${jBPM.version}-wildfly8.war

# the version of jBPM and Drools Eclipse plugin you want to use
# and the associated URL you want to get the dependencies from
# for example:
#<RELEASE>
#   droolsjbpm.eclipse.version=${release.version}
#   droolsjbpm.eclipse.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/drools/org.drools.updatesite/${droolsjbpm.eclipse.version}/org.drools.updatesite-${droolsjbpm.eclipse.version}.zip
# or:
#<SNAPSHOT>
#   droolsjbpm.eclipse.version=${snapshot.version}
#   droolsjbpm.eclipse.url=https://hudson.jboss.org/hudson/job/droolsjbpm-tools/lastSuccessfulBuild/artifact/drools-eclipse/org.drools.updatesite/target/org.drools.updatesite-${droolsjbpm.eclipse.version}.zip
droolsjbpm.eclipse.version=${release.version}
droolsjbpm.eclipse.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/drools/org.drools.updatesite/${droolsjbpm.eclipse.version}/org.drools.updatesite-${droolsjbpm.eclipse.version}.zip

# the home of your eclipse installation
# will be used to deploy the Eclipse plugin to
eclipse.home=./eclipse
eclipse.clean.workspace=true

# the home of your JBoss AS installation
# for example, for AS7:
jboss.server.version=as-7.1.1.Final
jboss.home=./jboss-${jboss.server.version}
jboss.download.url=http://download.jboss.org/jbossas/7.1/jboss-${jboss.server.version}/jboss-${jboss.server.version}.zip
jboss.server.conf.dir=${jboss.home}/standalone/configuration
jboss.server.deploy.dir=${jboss.home}/standalone/deployments
jboss.server.data.dir=${jboss.home}/standalone/data
jboss.clean.repository=true
#   IMPORTANT: make sure to also set the H2.version property (below) to 1.3.161
# or for EAP 6.4
#   jboss.server.version=eap-6.4.0
#   jboss.home=./jboss-eap-6.4
#   jboss.download.url=### you need to manually download the eap 6.4.0 zip and put it in the lib folder ###
#   jboss.server.conf.dir=${jboss.home}/standalone/configuration
#   jboss.server.deploy.dir=${jboss.home}/standalone/deployments
#   jboss.server.data.dir=${jboss.home}/standalone/data
#   jboss.clean.repository=true
# or for Wildfly8
#   jboss.server.wildfly.version=8.1.0.Final
#   jboss.server.version=wildfly-${jboss.server.wildfly.version}
#   jboss.home=./${jboss.server.version}
#   jboss.download.url=http://download.jboss.org/wildfly/${jboss.server.wildfly.version}/${jboss.server.version}.zip
#   jboss.server.conf.dir=${jboss.home}/standalone/configuration
#   jboss.server.deploy.dir=${jboss.home}/standalone/deployments
#   jboss.server.data.dir=${jboss.home}/standalone/data
#   jboss.clean.repository=true
jboss.war.type=${jboss.server.version}

# jboss.port.offset=0
# org.uberfire.nio.git.daemon.port=9418
# org.uberfire.nio.git.ssh.port=8001

# the version of Dashboard Builder you want to use
# and the associated URL you want to get it from
# for example:
#<RELEASE>
# for AS7:
dashboard.version=${release.version}
dashboard.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/jbpm/dashboard/jbpm-dashboard-distributions/${dashboard.version}/jbpm-dashboard-distributions-${dashboard.version}-jboss-as7.war
# for EAP 6.4:
#   dashboard.version=${release.version}
#   dashboard.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/jbpm/dashboard/jbpm-dashboard-distributions/${dashboard.version}/jbpm-dashboard-distributions-${dashboard.version}-eap6_4.war
# for Wildfly8:
#   dashboard.version=${release.version}
#   dashboard.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/jbpm/dashboard/jbpm-dashboard-distributions/${dashboard.version}/jbpm-dashboard-distributions-${dashboard.version}-wildfly8.war
# or:
#<SNAPSHOT>
#   dashboard.version=${snapshot.version}
#   dashboard.url=https://hudson.jboss.org/hudson/job/jbpm-dashboard/lastSuccessfulBuild/artifact/jbpm-dashboard-distributions/target/jbpm-dashbuilder-${dashboard.version}-wildfly8.war

# data base related properties
db.driver.jar=${install.home}/db/driver/${db.driver.jar.name}
db.driver.module.dir=${jboss.home}/modules/${db.driver.module.prefix}/main/
# default is H2
# H2.version=1.3.168
# db.name=h2
# db.driver.jar.name=h2-${H2.version}.jar
# db.driver.download.url=http://repo1.maven.org/maven2/com/h2database/h2/${H2.version}/h2-${H2.version}.jar
#other options are:
#mysql
#  db.name=mysql
#  db.driver.module.prefix=com/mysql
#  db.driver.jar.name=mysql-connector-java-5.1.18.jar
#  db.driver.download.url=https://repository.jboss.org/nexus/service/local/repositories/central/content/mysql/mysql-connector-java/5.1.18/mysql-connector-java-5.1.18.jar
#postgresql
db.name=postgresql
db.driver.module.prefix=org/postgresql
db.driver.jar.name=postgresql-9.3-1103.jdbc4.jar

Agora, vamos executar o instalador e esperar (bastante):

ant install.demo

Enquanto você espera a instalação finalizar, vamos configurar o BD:

  • Crie um novo banco de dados chamado jbpm
  • Vá até a pasta “/opt/jbpm-installer/db/ddl-scripts/postgres/”
  • Execute o script postgresql-jbpm-schema.sql e na sequência quartz_tables_postgres.sql

Quando a instalação finalizar, abra o arquivo “/opt/jbpm-installer/jboss-as-7.1.1.Final/bin/standalone.conf”, na linha 50, e altere as configurações como na linha abaixo:

-Xmx1024m -XX:MaxPermSize=512m

e na linha 52:

JAVA_OPTS="$JAVA_OPTS -Djboss.server.default.config=standalone-full.xml"

Abra o arquivo “/opt/jbpm-installer/jboss-as-7.1.1.Final/standalone/configuration/standalone-full.xml”, localize a seção datasource e adicione:

<datasource jta="true" jndi-name="java:jboss/datasources/jbpmDS" pool-name="jbpmDS" enabled="true" use-java-context="true" use-ccm="true">
    <connection-url>jdbc:postgresql://localhost:5432/jbpm</connection-url>
    <driver-class>org.postgresql.Driver</driver-class>
    <driver>postgresql</driver>
    <pool>
        <min-pool-size>2</min-pool-size>
        <max-pool-size>100</max-pool-size>
    </pool>
    <security>
        <user-name>postgres</user-name>
        <password>postgres</password>
    </security>
    <validation>
        <validate-on-match>false</validate-on-match>
        <background-validation>false</background-validation>
        <background-validation-millis>1</background-validation-millis>
    </validation>
    <statement>
        <prepared-statement-cache-size>64</prepared-statement-cache-size>
        <share-prepared-statements>true</share-prepared-statements>
    </statement>
</datasource>

E na seção drivers, acrescente:

<driver name="postgresql" module="org.postgresql">
    <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
</driver>

Se tudo estiver correto, você já pode iniciar o JBoss:

$ cd /opt/jbpm-installer/jboss-as-7.1.1.Final/bin/
$ ./standalone.sh -b 0.0.0.0

Se apareceu “Deployed” no terminal, você já pode acessar o jbpm-console: http://localhost:8080/jbpm-console

Espero que tudo tenha dado certo!

Um abraço e até o próximo post!

Guia: Substituir Windows 8.0 Pré-Instalado

Essa semana, meu antigo notebook veio a falecer e eu precisei comprar um meio que emergencialmente para terminar alguns freelas que estavam com prazos bem apertados.

Eu sou usuário linux mas ainda mantenho uma partição com Windows para alguns trabalhos específicos (exigência de cliente e/ou tecnologia, etc. ) . Como não fui com a cara do Windows 8, resolvi formatar a máquina e instalar meu Ubuntu + Win 7 e assim deu-se inicio ao meu final de semana terror.

O problema é o UEFI, sucessor de togakure da boa e velha BIOS. Por causa dele, eu não conseguia simplesmente mudar a prioridade de BOOT para CD/DVD já que o Windows 8 não reinicia de verdade, ele hiberna, então quando você pressiona Del, F1, F10 ou seja lá qual for a tecla que te levaria para o setup no boot, não acontece nada … você continua indo parar no vírus Windows 8.

Ok, vamos então para a receita de bolo para remover ele e instalar seu sistema operacional preferido.

DESATIVAR O FAST BOOT NO WINDOWS 8

Abra o painel de controle e vá até as opções de energia.
No menu do lado esquerdo, escolha a opção “Alterar o funcionamento dos botões de energia” e em seguida, clique em “Alterar configurações não disponíveis no momento”.
Na parte inferior da tela, desmarque a opção “Ligar inicialização rápida”.

ACESSAR A BIOS

Ainda no Windows 8, vá até as opções de desligamento e segure a tecla shift e clique em reiniciar. Isso vai fazer com que você entre nas configurações do UEFI.

Se tudo deu certo até o momento, você estará agora olhando para a tela do UEFI, que é mais ou menos assim:

Clique na opção “Troubleshoot”, depois em “Advanced Options” e por fim “UEFI Firmware Settings”. Pronto, o computador irá reiniciar e provavelmente você não terá que pressionar nenhuma tecla para entrar na BIOS, já vai entrar direto.

Já na boa e velha BIOS, procure as opções de Boot (cada fabricante tem um layout diferente, por isso não tenho como dizer onde exatamente está) e habilite o Boot Legacy e altere as prioridade de boot entre UEFI e legacy, deve ter uma opção: Boot Legacy First.

Na mesma tela, selecione a ordem de prioridade de boot para CD/DVD ou se você vai realizar uma instalação via USB, selecione o dispositivo correspondente. Tudo isso fica antes do seu HD que contém o Windows 8. Em alguns casos, também é necessário desativar o Secure Boot – Não foi o meu caso mas se for necessário, provavelmente se encontra na aba Security.

Reinicie com o CD/DVD de instalação do novo Sistema e tudo vai funcionar como esperado. Se você vai ficar com apenas 1 sistema operacional, seus problemas acabaram e você já pode ser feliz \o/.

* A partir de agora, sempre que precisar entrar na BIOS, basta pressionar a tecla de função normalmente como antigamente durante o boot.

DUAL BOOT – INSTALAR LINUX

Para instalar seu linux (em meu caso o Ubuntu), basta dar o boot pelo Live CD ou USB (lembre-se, você deve alterar a prioridade do boot na BIOS para que ele inicie pelo dispositivo e não pelo HD) e seguir as instruções de instalação.

Eis que você chega na parte de selecionar a partição de instalação e o instalador não reconhece a partição onde você instalou o outro sistema operacional e mostra o disco inteiro vazio. Pois é, mais uma novidade 🙂 – O GPT. O GPT é o novo formato de tabela de partição, sucessor da MBR. E o que acontece é que as vezes, você instala um sistema com MBR e ficam “resíduos” do GTP no disco, dai a ferramenta de partição entende que trata-se de um disco em GPT e lá não tem nada. 

Saia da instalação e entre no modo “Try Ubuntu”, acesse o terminal e execute a ferramenta gdisk. Sintaxe: gdisk /dev/sda

ATENÇÃO – Muito cuidado a partir daqui.

O gdisk irá identificar que o disco possui MBR e GPT e pergunta como você deseja trabalhar, escolha MBR Only.
Tecle “x” para entrar no modo expert
Tecle “z” para apagar os dados da GPT e confirme com “y”
Tecle “n” para a pergunta “Blanking the MBR”. Cuidado para não responder “y” aqui.

Pronto, saia do gdisk e abra o gparted ou qualquer outra ferramenta de particionamento que desejar. 
A partir desse momento, você já vai conseguir ver a(s) partição(ões) que contém o outro sistema instalado. Crie as partições linux que desejar e reinicie computador.

Pronto, siga o processo de instalação normalmente.

Referências:

http://askubuntu.com/questions/221835/installing-ubuntu-on-a-pre-installed-windows-8-64-bit-system-uefi-supported

http://www.tecmundo.com.br/como-fazer/29536-windows-8-o-que-e-o-modo-de-inicializacao-rapida-e-como-desabilita-lo.htm

http://askubuntu.com/questions/249642/gpt-partition-table-warning-message-during-install-of-ubuntu

Impressora HP: Impressão extremamente lenta

Sintomas: Impressora não realiza a impressão (Linux) ou imprime de forma extremamente lenta, imprimindo 1 faixa de cada vez (uns 15 ou 20 segundos de intervalo entre uma impressão e outra – Linux e Windows 7).

Diagnóstico: Provavelmente um dos cartuchos está com problema. Remova 1 cartucho de cada vez, mande um documento para a fila de impressão e verifique se a impressão voltou ao normal. Se sim, o cartucho com defeito é o que foi retirado.

Plus: No Linux, baixe a ferramenta gerenciamento de impressão da HP e o driver hplip no site: http://hplipopensource.com/hplip-web/index.html

Pronova Rockey2 + Java

Estou em um novo projeto que foi necessário implementar licença de software utilizando tokens usb. Um amigo me indicou os tokens da Pronova (pronova.com.br) por ser simples de implementar e relativamente seguros. A diferença é que ele usou .NET e meu projeto é em Java e em Java sempre tem uma pegadinha do malandro 🙂

Lá vai eu pegar o sample do java que vem no cd de instalação e fazer os testes no eclipse. Segui as instruções (sic) do arquivo leia-me e apanhei feito mala velha.

Sempre que executava, me retornava o erro: java.lang.unsatisfiedlinkerror ou não encontrava o pacote “rockey2”.

Usei o DJ Decompiler para saber qual era o pacote que estava na tal classe “JRockey2.class” e não tinha pacote nenhum definido. Setei o pacote como sendo rockey2 e passou a apresentar o erro de classe duplicada.

Depois de muitas tentativas, achei o JNA (Java Native Access) e meus problemas acabaram. Joguei fora a classe JRockey2 que vem no SDK e criei uma interface como mostra os exemplos na wiki do JNA apontando para a dll Rockey2 e não a JRockey2.

Vamos a solução:

1. Baixe o jna.jar e platform.jar em https://github.com/twall/jna#download

2. Inclua essas libs no seu classpath

3. Se ainda não colocou, coloque as dlls do SDK na pasta C:\WINDOWS\System32

4. Criei seu wrapper, o meu ficou assim:

package com.wordpress.tidoc.security;

import com.sun.jna.Library;
import com.sun.jna.Native;

public interface JRockey2 extends Library
{
	JRockey2 INSTANCE = (JRockey2) Native.loadLibrary("Rockey2", JRockey2.class);

    public int RY2_Find();

    public int RY2_Open(int i, int j, int ai[]);

    public void RY2_Close(int i);

    public int RY2_GenUID(int i, int ai[], byte abyte0[], int j);

    public int RY2_Read(int i, int j, byte abyte0[]);

    public int RY2_Write(int i, int j, byte abyte0[]);

    public static final int AUTO_MODE = 0;
    public static final int HID_MODE = -1;
    public static final int ROCKEY2_DISABLE_WRITE_PROTECT = 0;
    public static final int ROCKEY2_ENSABLE_WRITE_PROTECT = 1;
    public static final int RY2ERR_SUCCESS = 0;
    public static final int RY2ERR_NO_SUCH_DEVICE = 0xa0100001;
    public static final int RY2ERR_NOT_OPENED_DEVICE = 0xa0100002;
    public static final int RY2ERR_WRONG_UID = 0xa0100003;
    public static final int RY2ERR_WRONG_INDEX = 0xa0100004;
    public static final int RY2ERR_TOO_LONG_SEED = 0xa0100005;
    public static final int RY2ERR_WRITE_PROTECT = 0xa0100006;
    public static final int RY2ERR_OPEN_DEVICE = 0xa0100007;
    public static final int RY2ERR_READ_REPORT = 0xa0100008;
    public static final int RY2ERR_WRITE_REPORT = 0xa0100009;
    public static final int RY2ERR_SETUP_DI_GET_DEVICE_INTERFACE_DETAIL = 0xa010000a;
    public static final int RY2ERR_GET_ATTRIBUTES = 0xa010000b;
    public static final int RY2ERR_GET_PREPARSED_DATA = 0xa010000c;
    public static final int RY2ERR_GETCAPS = 0xa010000d;
    public static final int RY2ERR_FREE_PREPARSED_DATA = 0xa010000e;
    public static final int RY2ERR_FLUSH_QUEUE = 0xa010000f;
    public static final int RY2ERR_SETUP_DI_CLASS_DEVS = 0xa0100010;
    public static final int RY2ERR_GET_SERIAL = 0xa0100011;
    public static final int RY2ERR_GET_PRODUCT_STRING = 0xa0100012;
    public static final int RY2ERR_TOO_LONG_DEVICE_DETAIL = 0xa0100013;
    public static final int RY2ERR_UNKNOWN_DEVICE = 0xa0100020;
    public static final int RY2ERR_VERIFY = 0xa0100021;
    public static final int RY2ERR_UNKNOWN_ERROR = 0xa010ffff;
}

5. Por último, faça a chamada em seu código assim:

int iRetcode = JRockey2.INSTANCE.RY2_Find();

]

Para quem tiver afim de conhecer mais sobre o JNA: http://en.wikipedia.org/wiki/Java_Native_Access e http://twall.github.com/jna/3.5.1/javadoc/

Abrassss

SQL Server: Migrando dados entre schemas diferentes

Fala pessoal! Depois de um longo tempo sem postar nada … estou de volta!!

Recentemente participei do projeto de integração entre 4 sistemas e unificação de suas bases de dados. Nessa base, nós dividimos as tabelas de alguns dos módulos específicos utilizando os schemas do SQL Server.

Vamos lá! O cenário é o seguinte: Temos bases diferentes onde o único schema é o dbo. Ao unificarmos as bases, deseja-se separar alguns objetos com schemas próprios (diferentes do dbo). Não consegui encontrar nenhuma ferramenta free que fizesse o trabalho completo e no meu caso e acredito que no caso de muitos, é complicado pagar um preço relativamente alto pra usar uma ferramento 1 ou 2 vezes apenas. Por esse motivo adotei essa solução.

Vou partir do principio que a nova base já está com a estrutura pronta e só é necessário importar os dados da base antiga.

1º Passo é gerar o script com os dados. Um espécie de “backup” … comum em outros SGBDs como PostgreSQL e MySQL.
Para tal, Clique com o botão direito na base que deseja exportar os dados e escolha a opção Tasks > Generate Scripts, como mostra a imagem abaixo:

Como só interessam os dados, escolha apenas as tabelas que deseja exportar. Na próxima tela, marque as opções “save to file”, “single file” e clique em “Advanced”. Nessa tela, você deverá mudar as propriedades: “Schema qualify object names” para “false”, “Script USE DATABASE” para “false” e por último “Types of data to script” para “data only”, como mostra a imagem abaixo:

Mas porque retirar o nome do schema e o “USE DATABASE”? Se o arquivo gerado for muito grande, maior que 2 GB por exemplo, você terá dificuldade para altera-lo em um editor de textos depois e lembre-se que você quer mudar de schema e não continuar com o dbo e a base destino também é diferente. Ah, eu poderia mudar o schema direto na minha base antiga e já exportar certinho? Claro que pode, mas como ainda trata-se da base de produção, quanto menos modificações, melhor … por isso prefiro alterar apenas o script que não causa nenhum impacto na estrutura atual.

Feito isso, pode gerar o script. A depender do tamanho da base, vai demorar um pouco.

2º Passo, depois do script gerado, nós vamos desativar temporariamente todas constraints e triggers. Para tal, você irá precisar rodar os seguintes comandos SQL:

EXEC sp_msforeachtable "ALTER TABLE ? DISABLE TRIGGER ALL"
GO

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT ALL"
GO

3º Passo, existe um detalhe muito importante agora, como usar o schema se não tem nenhuma referencia no script? O pulo do gato está no default schema do usuário que você irá utilizar na importação. Defina o default schema para o desejado  antes de executar o script de importação.

Agora você tem duas opções: Rodar pelo Management Studio ou pelo linha de comando com o sqlcmd.exe. Se o script for muito grande, você terá que usar o sqlcmd.
Sintaxe: sqlcmd.exe -S <host> -U <usuario> -P <senha> -d <banco destino> -b -i <caminho para o script> -o <log de saída>

Novamente, a depender do tamanho da base, o processo pode levar horas.
Se tudo deu certo até aqui, você já pode habilitar novamente as triggers e contraints:

EXEC sp_msforeachtable "ALTER TABLE ? ENABLE TRIGGER ALL"
GO

EXEC sp_msforeachtable "ALTER TABLE ? CHECK CONSTRAINT ALL"
GO

4º Passo, se tudo deu certo, vai no barzinho mais próximo e pede uma gelada!! \o/
Abrassssss galera!

Dica rápida: PHP + BYTEA

Fala galera! Estava aqui tentando exibir imagens armazenadas em um campo bytea do PostgreSQL e apanhei feito mala velha usando o par de funções pg_escape_bytea e pg_unescape_bytea.

Consegui achar a solução em um comentário no manual do PHP: “To prevent any problems with encoding you could use hexadecimal or base64 input to save and retrieve data to the database”

Usei base64_encode/base64_decode e tudo funcionou perfeitamente. Então, se você está tentando usar pg_escape_bytea($content) e pg_unescape_bytea($content) mude para base64_encode($content) para inserir no banco e base64_decode($content) para exibir no browser.

Valeu Mike-RaWare!

Para quem quiser ver o post: http://php.net/manual/en/function.pg-escape-bytea.php

Forçar o WebBrowser Control a usar IEX(7,8 ou 9)

Desenvolvi um aplicativo que possui um navegador integrado com webbrowser control que insistia em renderizar as páginas como IE7. O IE instalado na máquina, estava renderizando normalmente como IE8 sem estar usando o modo de compatibilidade. Pesquisando com um amigo aqui do trampo, descobrimos que o webcontrol rendereza por padrão como IE7 e precisamos modificar o registro do windows para força-lo a usar o IE8 ou IE9 se for o caso.

Para, tal .. abra o regedit e localize a chave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION e adicione um valor DWORD com o nome do seu aplicativo, browser.exe por exemplo e coloque o valor 7000 em decimal para rodar como IE7, 8000 para rodar como IE8 e 9000 para rodar como IE9.

Existem outros modos de compatibilidade, veja aqui o material oficial da Microsoft.

Abrasss