O Open Medical Record System (OpenMRS), criado em 2004, é um projeto colaborativo de software livre para desenvolver software de apoio à prestação de assistência médica em países em desenvolvimento. É um aplicativo da web que permite projetar um sistema de prontuários médicos customizado, mesmo sem conhecimento de programação. Mas é necessário ter conhecimento de análise médica e de sistemas. O OpenMRS fornece a capacidade de incluir ou substituir módulos de pacote configurável. Também dispõe de funções de customização flexíveis. As plataformas para os projetos OpenMRS são o Apache Tomcat e MySQL.
Neste artigo, aprenderemos a migrar o OpenMRS para IBM DB2 e IBM WebSphere Application Server. Instruções passo a passo mostrarão como migrar do MySQL para DB2 e como importar o projeto para seu ambiente de desenvolvimento. Saiba como fazer as modificações necessárias para o DB2 e WebSphere Application Server, e a implementar o arquivo EAR.
As seguintes versões de produto se aplicam a este artigo:
- DB2 versão 9.7
- WebSphere Application Server versão 7.0.0.17
- OpenMRS versão 1.7.2.
Algumas informações deste artigo talvez não se apliquem a versões mais recentes desses produtos.
Para acompanhar este artigo, supõe-se que o leitor tenha OpenMRS implementado em MySQL e Tomcat. Para obter ajuda com a implementação, consulte Installing OpenMRS.
Migrar o banco de dados de MySQL para DB2
A primeira tarefa é preparar o banco de dados. Antes da migração, execute as seguintes etapas.
- O usuário atual deve ter privilégios de DB2AMNS para o banco de dados DB2.
Para obter o privilégio, execute o seguinte script para incluir o usuário atual no grupo de administradores do DB2.
net localgroup DB2ADMNS %username% /add net localgroup DB2USERS %username% /add
- Crie um banco de dados DB2 chamado Openmrs e confirme se o usuário atual tem permissões para esse banco de dados. Para isso, clique com o botão direito do mouse no banco de dados Openmrs no DB2 Control Center para ver os privilégios do usuário, como mostrado na Figura 1.
Figura 1. Privilégios do banco de dados do usuário
- Prepare os arquivos JAR de driver JDBC do MySQL e DB2. Os arquivos JAR de driver encontram-se no diretório de instalação do seu banco de dados.
- No MySQL, o nome do driver provavelmente é mysql-connector-java-5.1.7-bin.jar
- No DB2 haverá dois arquivos JAR: db2jcc.jar e db2jcc_license_cu.jar
- Confirme se o seu driver JDBC do DB2 é posterior à versão 3.0. Verifique a versão executando o comando
java com.ibm.db2.jcc.DB2Jcc -version. A Figura 2 mostra o resultado de amostra.
Figura 2. Versão do driver JDBC
Para usar o OpenMRS é preciso ter o banco de dados em MySQL. Para alcançar a meta de migração, é preciso ter uma ferramenta de migração de dados. A IBM Data Movement Tool pode ajudar nas tarefas de migração de dados. (Consulte Recursos para obter mais informações sobre essa ferramenta.)
Execute estas etapas para migrar os dados de demonstração do OpenMRS de MySQL para DB2:
- Abra a interface com o usuário da IBM Data Movement Tool, como mostrado na Figura 3.
- Selecione o banco de dados de origem MySQL e preencha as propriedades dele com base na sua configuração.
- Selecione JDBC Drivers, in my environment, MySQL version
5.0 e o driver de conector JDBC será mysql-connector-java-5.1.7-bin.jar.
Clique em Connect to MySQL para verificar se a conexão funciona. Depois disso, selecione o banco de dados openmrs.
- Preencha as propriedades do banco de dados DB2.
- Escolha JDBC Drivers para DB2. O arquivo JAR encontra-se no seu diretório de instalação de DB2 (por exemplo, C:\Arquivos de Programas\IBM\SQLLIB\java\).
Dois arquivos JAR serão necessários: db2jcc.jar e db2jcc_license_cu.jar (o arquivo JAR de licença).
Figura 3. Configuração da propriedade de movimentação de dados
(Veja uma versão ampliada da Figura 3.)
Clique em Connect to DB2 para verificar se a conexão funciona. Se a instância for visível na sua estação de trabalho, poderá continuar a movimentação de dados. Após clicar em Extract DDL/Data, aparecerão as mensagens de informação da ferramenta na guia View File , como mostrado na Figura 4.
Figura 4. Extrair DDL e os dados
Localize um arquivo chamado db2gen.cmd no diretório de saída sob o diretório de instalação da ferramenta. Nesse ponto, é possível extrair os scripts para fazer a implementação de banco de dados. Clique em Deploy DDL/Data. O console deve se parecer à Figura 5. Compare as contagens de linhas para verificar se algum dado não foi executado corretamente.
Figura 5. Implementar objetos de dados
Também é possível alterar as propriedades de migração alterando os valores do arquivo IBMExtract.properties, que é o diretório-raiz da IBM Data Movement Tool.
Importar o projeto para o ambiente de desenvolvimento
São necessárias algumas modificações de código para migrar o OpenMRS para DB2 e WebSphere Application Server. A primeira etapa é importar o código de origem para seu ambiente de desenvolvimento. O ambiente de desenvolvimento deve fornecer a capacidade de desenvolver projetos em Java EE. O Eclipse é uma boa opção. Faça o download do código de origem do OpenMRS. (A versão 1.7.2 foi usada neste artigo.)
Certifique-se de que seu JRE seja posterior à versão 1.4. Para verificar a versão do seu JRE, execute o comando java -version , como mostrado na Figura 6..
Figura 6. Verificação da versão de JRE
Modificar o projeto para WebSphere Application Server
Para garantir que o código possa ser executado em WebSphere Application Server, é preciso desenvolver o projeto como arquivo EAR e implementar o arquivo EAR no WebSphere Application Server.
Incluir o arquivo de implementação
Para permitir que o projeto seja desenvolvido em arquivo EAR, inclua o arquivo de implementação J2EE application.xml nele.
No diretório de metadados, inclua uma pasta chamada META-INF, que contenha o appliction.xml que será o descritor de implementação ao implementar esse arquivo EAR no WebSphere Application Server. Ele diz ao WebSphere Application Server qual é o módulo da web do aplicativo e a raiz de contexto dele. O conteúdo do arquivo XML é mostrado na Listagem 1.
Listagem 1. Arquivo XML
<?xml version="1.0" encoding="UTF-8"?> <application id="Application_ID" version="1.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd"> <display-name>openmrsEAR</display-name> <module> <web> <web-uri>openmrs.war</web-uri> <context-root>openmrs</context-root> </web> </module> </application> |
Após incluir o arquivo, seu ambiente de desenvolvimento deve se parecer à Figura 7.
Figura 7. Importar projeto para o Eclipse
Modificar a configuração de propriedade de JSP
O projeto inclui um servlet chamado jsp
configurado em web.xml, como mostrado na Listagem 2.
Listagem 2. Servlet jsp
<servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.withjstl</url-pattern> </servlet-mapping> |
A solicitação URL com o sufixo withjstl será manipulada por esse servlet jsp
, mas o que é o servlet jsp
? No Tomcat, é possível localizar esse servlet jsp
configurado em web.xml, sob o diretório tomcat-root/conf/, como mostrado na Listagem 3.
Listagem 3. Servlet jsp em web.xml
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
|
Mais importante ainda, a solicitação withjstl será manipulada pela classe JspServlet , definida no núcleo jasper do Tomcat. Mas se não houver a mesma classe no WebSphere Application Server, como o aplicativo poderá gerenciar essa solicitação da web? Para resolver o problema, é possível incluir uma configuração no web.xml do projeto.
- Abra o arquivo web.xml e localize o elemento <jsp-config> nele.
- Como mostra a Listagem 4, inclua o elemento
<jsp-property-group>como filho dentro do elemento<jsp-config>.
Listagem 4.<jsp-property-group><jsp-property-group> <url-pattern>*.withjstl</url-pattern> </jsp-property-group>
O grupo de propriedades JSP é definido ao nomear o grupo e especificar os padrões de URL. Ao incluir esse elemento, os padrões de URL são manipulados como arquivo JSP se um recurso corresponder a withjstl.
Como se vê na pasta src, o código de origem tem duas pastas filho: api e web. Durante a implementação, as classes da pasta api serão compactadas em um arquivo JAR chamado openmrs-api-version.subversion-.jar. Para migrar esse projeto para um banco de dados em DB2, é preciso um conector JDBC para DB2.
Use as seguintes etapas para colocar o driver JDBC de DB2 no projeto.
- Crie uma nova subpasta chamada db2 sob a pasta lib do projeto.
- Copie os drivers JDBC de DB2 para a pasta db2 e inclua-os no caminho de classe.
- Inclua o caminho de driver de banco de dados em lib.properties incluindo as linhas da Listagem 5 em lib.properties (o arquivo que fornece ao Ant a configuração de variável lib JAR durante o desenvolvimento).
Listagem 5. Incluir em lib.properties# # DB2 Java Connector # database.dir=${lib.dir}/db2
Modificar a configuração de hibernação
Substitua hibernate.default.properties pelo que se encontra na Listagem 6.
Listagem 6. Propriedades de hibernação
# Default (overridable) with runtime properties file # Connection Properties --> hibernate.connection.username=your db2 user name hibernate.connection.password=your db2 password hibernate.connection.driver_class=com.ibm.db2.jcc.DB2Driver hibernate.connection.url=jdbc:db2://localhost:50000/OpenMRS # Hibernate specific connection/debug properties hibernate.show_sql=true hibernate.format_sql=true hibernate.lazy=true hibernate.dialect=org.hibernate.dialect.DB2Dialect # Hibernate specific connection pool properties hibernate.c3p0.max_size=50 hibernate.c3p0.min_size=0 hibernate.c3p0.timeout=100 hibernate.c3p0.max_statements=0 hibernate.c3p0.idle_test_period=3000 hibernate.c3p0.acquire_increment=1 # Hibernate debugging options hibernate.generate_statistics=true hibernate.cache.use_structured_entries=true # Shouldn't need to override these properties hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider hibernate.connection.provider_class=org.hibernate.connection.C3P0ConnectionProvider hibernate.connection.release_mode=after_transaction hibernate.jdbc.use_get_generated_keys=false |
Nesse sistema, a hibernação mapeará as tabelas do banco de dados relacional com classes de entidade de acordo com o arquivo *.hbm.xml, de modo que sua operação nos objetos transportará as tabelas correspondentes do banco de dados. A estratégia de geração de chave primária de hibernação inclui o seguinte.
- Assigned
- Especifica o novo valor da chave primária paro o aplicativo.
- Increment
- A nova chave primária será gerada pela hibernação por meio do modo de incremento durante a operação.
- Native
- A chave primária gerará usando diferentes estratégias de acordo com diferentes bancos de dados.
- UUID
- Identificador exclusivo universal.
- Foreign
- Usa uma chave estrangeira de algumas outras tabelas.
- Sequence
- Usa o mecanismo de sequência para gerar a chave primária fornecida por um banco de dados específico, como Oracle. O método de geração da chave primária em OpenMRS é
identity.
É possível visualizar a configuração no arquivo de configuração de mapeamento de hibernação. A Listagem 7 mostra o exemplo PatientIdentifier.hbm.xml.
Listagem 7. PatientIdentifier.hbm.xml
<id name="patientIdentifierId" type="int" column="patient_identifier_id" unsaved-value="0"> <generator class="identity" /> </id> |
Identity usará o mecanismo de geração de chave primária fornecido pelo banco de dados; o valor da chave primária é completamente gerenciado pelo banco de dados. A Listagem 8 mostra o código que estará visível na classe IdentityGenerator
no pacote de hibernação em org.hibernate.id.
Listagem 8. Classe
IdentityGenerator
public InsertGeneratedIdentifierDelegate getInsertGeneratedIdentifierDelegate(
PostInsertIdentityPersister persister,
Dialect dialect,
boolean isGetGeneratedKeysEnabled) throws HibernateException {
if ( isGetGeneratedKeysEnabled ) {
return new GetGeneratedKeysDelegate( persister, dialect );
}
else if ( dialect.supportsInsertSelectIdentity() ) {
return new InsertSelectDelegate( persister, dialect );
primary key generation mechanism }
else {
return new BasicDelegate( persister, dialect );
}
}
|
A propriedade hibernate.jdbc.use_get_generated_keys
permite usar JDBC3 PreparedStatement.getGeneratedKeys() para recuperar chaves geradas de forma nativa após a inserção. A propriedade exige um driver JDBC posterior à versão 3 e JRE posterior à versão 4. Se essa propriedade não for incluída, aparecerá a exceção: "The database returned no natively generated identity value."
Modificar a configuração do tempo de execução do projeto
Para modificar o ambiente de tempo de execução do projeto, há duas tarefas básicas.
- Modifique context.xml
O aplicativo verificará se pode se conectar ao banco de dados e, se este está vazio, na primeira vez em que o aplicativo é executado. O arquivo context.xml é a configuração que o aplicativo usa para o processo de verificação.
No tempo de execução, o aplicativo:
- Executará a instrução selecionada para verificar se os dados do usuário estão no banco de dados.
- Determinará se a inicialização é necessária.
Modifique o arquivo para incluir as informações da Listagem 9 para que o sistema possa se conectar ao banco de dados. Confirme se o usuário de DB2 tem privilégios para acessar e operar o banco de dados.
Listagem 9. context.xml<?xml version="1.0" encoding="UTF-8"?> <Context antiJARLocking="true" reloadable="false" useHttpOnly="false"> <Resource name="jdbc/OpenMRS" auth="Container" type="javax.sql.DataSource" factory="org.apache.commons.dbcp.BasicDataSourceFactory" validationQuery="SELECT * FROM users" url="jdbc:db2://localhost:50000/OpenMRS" driverClassName="com.ibm.db2.jcc.DB2Driver" username="your db2 user name" password="your db2 password" maxWait="3000" maxIdle="100" maxActive="10" /> </Context>
- Desative o filtro de atualização
O filtro de atualização configurado no arquivo web.xml verificará a atualização de banco de dados executando alguns comandos de MySQL. Para migrar o projeto para DB2, desative esse filtro de atualização. É possível apenas excluir o filtro, mas é melhor prática colocá-lo entre comentários (<!-- -->), como mostrado na Listagem 10.
Listagem 10. Desativar filtro<!--filter> <filter-name>UpdateFilter</filter-name> <filter-class>org.openmrs.web.filter.update.UpdateFilter</filter-class> </filter> <filter-mapping> <filter-name>UpdateFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping-->
Inclua openmrs-runtime.properties, uma configuração de propriedade de tempo de execução, no seu aplicativo. Como mostra a Listagem 11, o aplicativo OpenMRS será conectado ao banco de dados usando a configuração desse arquivo no tempo de execução.
Listagem 11. openmrs-runtime.properties#Auto generated by OpenMRS initialization wizard #Fri Apr 08 15:53:48 CST 2011 module.allow_web_admin=true connection.url=jdbc:db2://localhost:50000/openmrs connection.username=your db2 user name connection.password=your db2 password auto_update_database=false
Para confirmar se o aplicativo pode usar o driver JDBC para DB2, é preciso fazer algumas modificações nos drivers de conexão com o banco de dados.
Substitua o método verifyConnection da classe InitializationFilter , que se encontra no pacote org.openmrs.web.filter.initialization, pelo mostrado na Listagem 12..
Listagem 12. Substitua
verifyConnection
private boolean verifyConnection(String connectionUsername, String connectionPassword,
String databaseConnectionFinalUrl) {
try {
Class.forName("com.ibm.db2.jdbc.DB2Driver").newInstance();
DriverManager.getConnection(databaseConnectionFinalUrl, connectionUsername,
connectionPassword);
return true;
}
catch (Exception e) {
errors.add("User account " + connectionUsername + " does not work. "
+ e.getMessage()
+ " See the error log for more details");
// TODO internationalize this
log.warn("Error while checking the connection user account", e);
return false;
}
}
|
Substitua o método loadDatabaseDriver da classe DatabaseUtil , que se encontra no pacote org.openmrs.util, pelo código da Listagem 13.
Listagem 13. Substitua
loadDatabaseDriver
public static void loadDatabaseDriver(String connectionUrl) throws
ClassNotFoundException {
if (connectionUrl.contains("mysql"))
Class.forName("com.mysql.jdbc.Driver");
else if (connectionUrl.contains("hsqldb"))
Class.forName("org.hsqldb.jdbcDriver");
else if (connectionUrl.contains("postgresql"))
Class.forName("org.postgresql.Driver");
else if (connectionUrl.contains("oracle"))
Class.forName("oracle.jdbc.driver.OracleDriver");
else if (connectionUrl.contains("jtds"))
Class.forName("net.sourceforge.jtds.jdbc.Driver");
else if (connectionUrl.contains("sqlserver"))
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
else
Class.forName("com.ibm.db2.jdbc.DB2Driver");
}
|
Para evitar que o DB2 execute comandos incompatíveis, substitua o método updatesRequired da classe DatabaseUpdater , que se encontra no pacote org.openmrs.util, pelo código da Listagem 14.
Listagem 14. Substitua
updatesRequired
public static boolean updatesRequired() throws Exception {
log.debug("checking for updates");
return false;
}
|
Para evitar inicialização indesejados durante a primeira execução do aplicativo, substitua o método initializationRequired da classe InitializationFilter , que se encontra no pacote org.openmrs.web.filter.initialization. A Listagem 15 mostra um exemplo.
Listagem 15. Substitua
initializationRequired
public static boolean initializationRequired() {
return false;
}
|
Neste ponto, o código de projeto funcionará com o banco de dados DB2. Contudo, para migrar para o WebSphere Application Server é preciso desenvolver o projeto em um arquivo EAR. É possível desenvolver o arquivo EAR com a ajuda de Ant. Inclua um destino chamado "ear" no arquivo build.xml de ant. No arquivo EAR, um arquivo WAR e um descritor de implementação de aplicativo da web são necessários. Inclua esse alvo, como mostrado na Listagem 16.
Listagem 16. Incluir alvo
<target name="ear" depends="package-web" description="build ear">
<ear destfile="${dist.dir}/${webapp.name}.ear"
appxml="${metadata.dir}/META-INF/application.xml">
<fileset dir="${dist.dir}" includes="*.war"/>
<fileset dir="${metadata.dir}/META-INF"/>
</ear>
</target>
|
Implementar o arquivo EAR no WebSphere Application Server
Durante a inicialização do aplicativo, há um erro que envolve os filtros em execução fora de ordem. A ordem errada cria um erro de tempo de execução onde o contexto é utilizado de forma errada quando ainda não foi configurado. Para resolver o problema, é preciso um fix patch para seu WebSphere Application Server:
- 7.0.0-WS-WASSDK-FP0000017.pak
- 7.0.0-WS-WAS-FP0000017.pak
Faça o download da correção adequada para seu sistema operacional.
Modificar as propriedades customizadas
Se, neste ponto, seu arquivo EAR for implementado, aparecerão erros "403 Forbidden" no painel firebug Net, como mostrado na Figura 8.
Figura 8. Erros 403 Forbidden
O erro ocorre quando não se tem privilégios para acessar certos recursos da web. O aplicativo de exemplo retorna alguns recursos do diretório WEB-INF. No WebSphere Application Server, os recursos sob esse diretório estão protegidos, de modo que não se tem privilégios. Para resolver o problema, inclua uma propriedade na sua propriedade customizada do WebSphere Application Server.
- Abra o link Servers no Integrated Solutions Console do WebSphere Application Server.
- Clique nos tipos de servidor WebSphere application servers.
- Clique no nome do seu servidor (o exemplo usa server1) e depois em Web container -> Custom properties.
- Inclua uma nova propriedade chamada
ExposeWEBINFonDispatche configure Value como true, conforme mostrado na Figura 9.
Figura 9. Propriedades customizadas do servidor, WebSphere Application Server
A propriedade ExposeWEBINFonDispatch deve ser configurada como true para permitir que uma solicitação de despacho (encaminhar ou incluir) acesse um arquivo estático a partir do diretório WEB-INF do aplicativo.
Agora, a migração está concluída. Consulte a próxima seção se encontrar problemas.
No processo de migração, talvez sejam encontrados erros similares aos descritos abaixo. Analise o log de erro e o fenômeno de erro para localizar a causa-raiz dele. Essa é a melhor maneira de resolver um erro.
| Erro | Sugestão |
|---|---|
| Erro de conexão com o banco de dados | Verifique se o usuário tem os privilégios necessários e se ele pode acessar o esquema do banco de dados. Verifique se seu driver JDBC corresponde à versão do banco de dados; a conexão não funcionará com versões diferentes. |
| BUILD FAILED C:\Documents\openmrs-trunk\build.xml:150: Unable to find a javac compiler;com.sun.tools.javac.Main is not on the classpath | Talvez JAVA_HOME não aponte para JDK. Atualmente, ele está configurado em C:\Arquivos de Programas\Java\jre6. Copie C:\Arquivos de Programas\Java\jdk1.6.0_10\lib\tools.jar para C:\Arquivos de Programas\Java\jre6\lib\ext. |
| Não é possível carregar o moduleXX | Faça o download dos módulos correspondentes no diretório de implementação da pasta WEB-INF \ bundledModules. Localize os módulos na lista OpenMRS Module Repository . |
| Não há ContextLoaderListener registrado | O mais provável é que o aplicativo não consiga carregar os arquivos de propriedade de tempo de execução no ambiente. Tente copiar esse arquivo para seu diretório-raiz webapps. |
| Descrição | Nome | Tamanho | Método de download |
|---|---|---|---|
| Sample code for this article | openmrsear.zip | 37 MB | HTTP |
Informações sobre métodos de download
Aprender
- OpenMRS Trunk: Saiba mais sobre esse projeto.
- OpenMRS Module Repository: Obtenha todos os nomes e descrições dos módulos.
- Software de banco de dados IBM DB2: Saiba como ele oferece desempenho líder de mercado, escala e confiabilidade na sua escolha de plataforma de Linux®, UNIX®
e Windows® a z/OS.
- "IBM Data Movement Tool" (developerWorks, nov. de 2010): Apresenta uma ferramenta muito simples e poderosa para mover dados de várias fontes com facilidade.
(Clique aqui para abrir a versão desse artigo em chinês.)
- Apache Ant: Saiba mais sobre essa ferramenta de linha de comando e biblioteca Java cuja missão é impulsionar os processos descritos em arquivos de criação como alvos e pontos de extensão interdependentes.
- Segmentos de mercado no developerWorks : Obtenha os recursos técnicos específicos do segmento de mercado mais recentes para desenvolvedores. Explore outros artigos sobre o segmento de mercado de assistência médica.
- eventos técnicos e webcasts do developerWorks: Mantenha-se atualizado em relação à tecnologia nessas sessões.
- developerWorks no Twitter: Inscreva-se hoje para seguir os tweets do developerWorks.
- Podcasts do developerWorks: Ouça entrevistas e discussões interessantes para desenvolvedores de software.
Obter produtos e tecnologias
- Installing OpenMRS: Instale e configure o OpenMRS do início ao fim.
- Obtenha o WebSphere Application Server Java SDK 1.6 SR9 FP1 . A Fix Central fornece correções e atualizações para o software, hardware e sistema operacional do seu sistema.
- Obtenha o IBM WebSphere Application Server Versão 7.0.0 Fix Pack 17. A Fix Central fornece correções e atualizações para o software, hardware e sistema operacional do seu sistema.
-
Faça o download do código de origem do OpenMRS svn . A versão 1.7.2 foi usada neste artigo.
- Avalie o software IBM por meio do método mais adequado para você; downloads, avaliações e nuvem.
Discutir
-
Fórum de OpenMRS: Converse com outros desenvolvedores.
-
Fórum de desenvolvedor do IBM WebSphere
-
Fórum do IBM DB2
- A comunidade do developerWorks: Conecte-se a outros usuários do developerWorks enquanto explora os blogs, fóruns, grupos e wikis voltados para desenvolvedores.
