Sunday, November 27, 2011

OSGi - Automated, unit and integration tests with JUnit


Article to show how to build automated integration tests with JUnit in a OSGi environment

OSGi is a brilliant architecture. Amazing softwares with complex architectures and hundred of components, like Eclipse Platform, are possible to build thanks to the OSGi architecture.

Test is essencial for software development, and continuos integration is what every profitful enterprise needs, because, when earlier the error is discovered, it's cheaper to fix it.

How does we can test the interfaces and behaviors of a encapsulated OSGi component? The answer is on this page.

Introduction

For CBD (Componente Based Development) and SOA, OSGi is a very good choice. In a lot of enterprises, the biggest problem is how to develop a system that fits all needs of all the customers. Some enterprises solve this with a kind of generic application that has hundred of parameters where you can customize the behavior and UI at runtime. So, this is not the best approach, it's a very expensive way. With OSGi, complex applications, like Eclipse, can be made in a cheap and reusable way, and this is what we look for.

There are several ways to test OSGi components, next it'll be demonstrated one of them. To understand what is being discussed, first you must to know these technologies. All used technologies are referenced with links at the bottom of the article. 

iPOJO and JUnit4OSGi


As in the project page
iPOJO is a service component runtime aiming to simplify OSGi application development. It natively supports ALL the dynamism of OSGi. Based on the concept of POJO, application logic is developed easily. Non-functional properties are just injected in the component at runtime.
iPOJO project is a set of some subprojects. What interest us for now is the JUnit4OSGi framework, that allowing the execution of JUnit tests in an OSGi environment.

To test your application, just follow these steps:
The fragment that will test the host bundle
  1. Prepare the OSGi environment. Put the JUnit4OSGi and JUnit bundles in the right folder ("plugin" folder if equinox, for example). Note that in JUnit4OSGi framework are two test runners, one graphical and other that show the results on the command line, choose one of them. The JUnit 4 is not supported by iPOJO for now, so, we must to use JUnit 3.
  2. You must to have at least two bundles. One bundle is the normal implementation, that solves a problem. Other bundle, is a fragment bundle that has just the JUnit testes. You need to create a Fragment bundle referencing the bundle you want to test. To do this, just put Fragment-Host: <host bundle symbolic name> in the MANIFEST.MF file of the fragment bundle. The fragment bundle will see all classes of the host bundle, even that are not declarated public in the manifest file.
  3. In the fragment bundle, create the JUnit Test cases and a normal JUnit Test suite.
  4. In the host bundle, inform the "Test-Suite" parameter. Ex.: Test-Suite: com.edpichler.test.MySuite.
To run the tests, start the OSGi environment and go to the GUI of the Test Runner you choosed, and start the tests. If you choosed a command line test runner, the tests will start automatically.

See a example running in this example on GitHub.

Troubleshooting

If you are under Mac OS X, maybe have some problems to run the Swing Test Runner. This is because some dead lock problem in SWT/AWT native implementation related here.
Solution: Just put this additional argument to run without problems: --launcher.secondThread

References

  1. RCP Quick Start Blog. Accessed in 29, november 2010.
    RCP Quick Start Blog
  2. Apache IPojo Framework. Accessed in 29, november 2010.
    Apache IPojo Framework
  3. CBD on Wikipedia. Accessed in 29, november 2010.
    Component Based Development
  4. GitHub, Address Service Component project. Accessed in 29, november 2010.
    GitHub, Address Service Component project
  5. JUnit Framework. Accessed in 20, november 2010.
    JUnit Framework.
  6. Apache Felix. Accessed in 29, november 2010.
    Apache Felix
  7. OSGi Alliance. Accessed in 23, november 2010.
    OSGi Alliance

Running Swing OSGi applications under Mac OS X


Circumventing the problem and running Swing OSGi applications on Mac OS X

Some people has faced with problems when trying to run a Java Swing application under Mac OS X. This short article will explain how to solve this.

The community discussed in some sites about the problem of running Swing OSGi app under Mac OS X:

After reading the posts of the Eclipse Equinox commiters, and noticed that this doesn't happens in other operation systems,  we can conclude this is a problem of the Mac OS X JVM implementation. While we don't have no solution, the work around to this problem seems to be quite simple. Just add the argument "--launcher.secondThread"  remove the "wsargument (if there is) and your Swing application will run perfectly. 

Example of the arguments configured on the Eclipse IDE

Versions

  • Mac OS X Snow Leopard 
  • Eclipse Equinox 3.5

Autenticação com certificados digitais (Portuguese)



Um estudo sobre o necessário para fazer autenticações com certificados digitais, em qualquer tecnologia.

Este guia apresenta as configurações necessárias para fazer uma autenticação com certificado digital em aplicações Web.

Requisitos

Para a implementação da funcionalidade, é necessário antes entender como funciona:
  • Certificados digitais
  • Secure Socket Layer (SSL)
  • Configuração do SSL no seu servidor Web.

Implementação 


Para que a aplicação web valide o certificado digital do cliente, deve ser feito o seguinte:

  1. Configurar o Internet Information Services (IIS) para utilizar conexão segura (SSL) com autenticação do cliente (para ele requisitar certificado digital do browser do usuário).
  2. Customizar no IIS as ACs (Autoridades Certificadoras) confiáveis. O certificado digital fornecido pelo cliente deverá ter sido emitido por alguma entidade certificadora confiável que está cadastrada no servidor Web.
  3. Criar uma aplicação Web e fazer o deploy no IIS. Ao estabelecer a conexão, o SSL irá requisitar um certificado cliente. A implementação do SSL irá verificar se o certificado digital fornecido é válido perante as ACs confiáveis cadastradas no servidor. Uma vez validadas, a aplicação web poderá consultar os dados do certificado digital da sessão do usuário e cruzar com dados de seu repositório.

Se o usuário tiver um certificado digital válido instalado no browser, quando acessar a página irá aparecer uma janela para que ele confirme se é dono digitando sua senha. Se o usuário tiver apenas certificados digitais emitidos por CAs que não estão registradas no servidor, ou então, se não tiver nenhum certificado digital, dependendo da configuração, não conseguirá acessar a página. 

A configuração da obrigatoriedade do certificado digital na autenticação pode variar. Existem três tipos de comportamentos que podem ser definidos no SSL do servidor:

  1. Não exige certificados digitais do cliente.
  2. Exige certificados digitais do cliente.
  3. Informar certificados digitais de forma opcional.

No terceiro caso, se o usuário não possuir certificado digital, ou então se possuir mas não quiser usar, irá conseguir acessar a página normalmente. A conexão também continuará sendo segura da mesma forma, pois o browser irá gerar uma chave aleatória, conforme é documentado na especificação do SSL.

Documentos e-CPF e e-CNPJ

Para ler o número dos documentos do e-CPF e e-CNPJ, basta a aplicação capturar os dados do certificado digital da sessão e ler os valores que estão em hexadecimal nos campos otherName do certificado digital.  



O ICP-Brasil, define onde encontra-se os números dos documentos no certificado digital quando:

Pessoa física: o campo que guarda o número do CPF é o otherName com o identificador OID de valor 
2.16.76.1.3.1 com o valor no formato:
  • Data de nascimento do titular no formato ddmmaa;
  • Cadastro de Pessoa Física (CPF) do titular;
  • Número de Identificação Social - NIS (PIS, PASEP ou CI);
  • Ndo Registro Geral (RG) do titular;
  • Siglas do órgão expedidor do RG e respectiva UF;


Pessoa jurídica
: o campo que guarda o número do CNPJ é o otherName com o identificador OID de valor OID 2.16.76.1.3.3.

Para detalhes de outros campos, veja o 'Requisito I.10" na especificação do e-Cpf e e-Cnpj, publicado emhttp://www.iti.gov.br/twiki/pub/Homologacao/Documentos/MCT6_Vol_I.pdf sessão "2.1 Requisitos gerais de certificação digital."

Veja também

References

  1. SERPRO. Política de Certificação da Autoridade Certificadora do SERPRORFB. Acessado em 07 de junho de 2010.
    https://ccd.serpro.gov.br/acserprorfb/docs/pcserprorfbA3_v2.1.pdf
  2. APACHE.ORG. Apache Tomcat Configuration Reference. Acessado em 02 de junho de 2010.
    http://tomcat.apache.org/tomcat-5.5-doc/config/http.html
  3. CERTISIGN. Por dentro da certificação digital. Acessado em 01 de junho de 2010.
    http://www.certisign.com.br/certificacao-digital/por-dentro-da-certificacao-digital
  4. DEVMEDIA. Autenticação de usuários com Certificado digital. Acessado em 07 de junho de 2010.
    http://www.devmedia.com.br/articles/viewcomp.asp?comp=9495&hl=
  5. IBM. Como funciona o SSL. Acessado em 06 de junho de 2010.
    http://publib.boulder.ibm.com/tividd/td/TRM/GC32-1323-00/pt_BR/HTML/admin231.htm
  6. MICROSOFT. X.509 Technical Supplement. Acessado em 07 de junho de 2010.
    http://msdn.microsoft.com/en-us/library/ff647097.aspx
  7. MICROSOFT. Brokered Authentication: X.509 PKI. Acessado em 07 de junho de 2010.
    http://msdn.microsoft.com/en-us/library/aa480565.aspx
  8. CERPRO. Certificação digital. Acessado em: 02 de junho de 2010.
    http://www.serpro.gov.br/servicos/certificacao_digital
  9. UNIFESP. Infra-estrutura de Chave Pública (PKI) – O Diferencial da VeriSign. Acessado em 07 de junho de 2010.
    http://telemedicina.unifesp.br/pub/Document/Programming/PublicKey/CertiSign/chave_publica_pki/introduction.html
  10. UOL. HOW STUFF WORKS. Como funciona o certificado digital. Acessado em Acessado em 07 de junho de 2010.
    http://informatica.hsw.uol.com.br/certificado-digital.htm
  11. UOL. IMASTERS. TCP/IP Certificados Digitais e segurança. Acessado em 06 de junho de 2010.
    http://imasters.uol.com.br/artigo/3174/seguranca/tcpip_parte_19_certificados_digitais_e_seguranca/
  12. VASSILEV, Apostol; HUTCHINSON, Michael. Authentication Framework for Smart Cards. Texas, USA. 2010.
  13. WIKIPEDIA. ICP-BRASIL. Acessado em 08 de junho de 2010.
    http://pt.wikipedia.org/wiki/ICP-BRASIL
  14. WIKIPEDIA. X.509. Acessado em 05 de junho de 2010.
    http://en.wikipedia.org/wiki/X.509

Exporting an Oracle XE Database



To export a dump file of the database, you need to use the expdp application. In Oracle XE on Windows, the executable is located in the folder "c:\oraclexe\app\oracle\product\10.2.0\server\BIN".

Just execute the expdp typing:

expdp usurname/password@XE directory=my_folder  dumpfile=myFile.dmp

Note that XE is the default SID name of Oracle XE. To connect to servers in your network, you need to configure other SID names in the TSNAMES.ORA file.

The directory to export the dump file can be a shared folder.

To import the dump file, there is the impdp application.

*Update


When importing, you can remap your table schema to a new user, to do this see about the REMAP_SCHEMA parameter. Ex.:


impdp myUser/password@xe dumpfile=banco.dmp REMAP_SCHEMA=(oldUser:myUser


When importing, maybe Oracle throw an error he can't find the Tablespace. Just create one and try importing again.

Wednesday, November 23, 2011

Drag and Drop of complex custom objects in Java


There are a lot of ways to accomplish this task. Here I'll show the custom way, that intends to work in any kind of swing component with minimum changes.

Here we have two JPanels, one of them has a custom JLabel that holds an Animal object. When we drag the JLabel, we want to transfer copying the animal to the other JPanel.

Basically, to do DnD (drag and drop) we have to create a Drag source, a Drag Target and a Transferable object:



Acess the example code clicking above on the link.(Gist powered)
https://gist.github.com/840867



Note that, most of the time, you need to do more easy tasks with DnD, like transfering simple Strings between components. There are easier ways to do that with the Java Swing default DnD implementations. See the references.





References

  1. Zet Code. Accessed in 23 February 2011.
    Zet Code
  2. Java tutorials. Accessed in 23 February 2011.
    http://download.oracle.com/javase/tutorial/uiswing/dnd/intro.html