// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Guia de Início Rápido do Desenvolvimento de Java Card
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Guia de Início Rápido do Desenvolvimento de Java Card - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Guia de Início Rápido do Desenvolvimento de Java Card

image::images/java-smart-card-sm.jpg[]

_Contribuição de Tim Boudreau, mantido por Ruth Kusterer_

O Java Card é uma plataforma interessante para trabalhar com - um JVM que executa em link:http://en.wikipedia.org/wiki/Smart_card[+smart cards+] e pequenos dispositivos que cabem na palma da mão. O Java Card 3.0, vem em dois tipos:

*Clássico*::: É o mesmo que as versões anteriores do Java Card. A plataforma é extremamente limitada. Por exemplo, o  ``java.lang.String``  não existe, não tem nenhum método  ``java.lang.Object.hashCode()``  e nenhum número de ponto flutuante.
*Estendido*::: Cartões inteligentes novos e mais potentes—este é novo no Java Card 3.0. Ele suporta uma implementação muito mais completa da Plataforma Java. Provavelmente, a melhor coisa sobre o suporte nativo para Servlets é que você pode realmente gravar uma aplicação Web utilizando APIs familiares, que podem ser executados em um cartão inteligente!





== Requisitos

*Para concluir este tutorial, são necessários os seguintes recursos e softwares:*

image::../../../images_www/articles/68/netbeans-stamp.gif[title="O conteúdo desta página aplica-se ao NetBeans IDE 6.8 e 6.9"]

|===
|Software ou Recurso |Versão Necessária 

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |6.8 

|link:http://java.sun.com/javacard/downloads/index.jsp[+Java Card SDK+] |3.02 

|Plug-in Java Card para NetBeans |1.3 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Java Development Kit+] (JDK) |Versão 6 
|===


== Configurando o Ambiente do Projeto

Como um cartão inteligente não tem uma interface de usuário, é necessário um leitor de cartão inteligente para ler e gravar os dados nos cartões ou utilizar um emulador incluído na Implementação de Referência do Java Card (RI). Este tutorial utilizará o emulador.

*Observação:* o plug-in do Java Card funciona em qualquer sistema operacional, mas o emulador de Implementação de Referência do Java Card está disponível somente para Windows. Entretanto, é possível configurá-lo como uma Plataforma Java em outros sistemas operacionais ao apontar o NetBeans para uma instalação do RI em uma partição Windows nos sistemas Mac ou Linux, mas não é possível executar projetos utilizando essa configuração.


=== Instalando Plug-ins no NetBeans IDE

1. Faça o Download e Instale o NetBeans IDE 6.8.
2. Após a instalação, vá para o menu Ferramentas > Plug-ins.
3. Em Plug-ins Disponíveis existem dois plug-ins relacionados ao Java Card: Java Card e Pacote de Runtime do Java Card.
* O Java Card é o plug-in que adiciona o suporte ao projeto Java Card para o NetBeans IDE.
* O Pacote de Runtime Java Card 3.0.2 é necessário somente se você não possuir uma cópia da Implementação de Referência do Java Card instalada.

image::images/install-javacard-plugins.png[]

4. É necessário reiniciar o IDE após a instalação dos plug-ins para continuar as etapas do tutorial a seguir.


=== Registrando a Plataforma do Java Card

Caso você faça o download do Pacote de Runtime do Java Card 3.0.2 do Gerenciador de Plug-in, o Java Card SDK já estará configurando como uma plataforma. Entretanto, caso a plataforma tenha sido transferida por download e instalada pelo link:http://java.sun.com/javacard/devkit/[+java.sun.com+] é possível utilizar o menu Ferramentas > Plataformas Java para adicionar a Plataforma do Java Card ao IDE da mesma forma que é feito o registro de qualquer plataforma Java.

image::images/installPlatform.png[]

Após a configuração da Plataforma Java Card, ela é listada na guia Serviços no IDE. Se a guia Serviços não estiver visível, selecione no menu Windows > Serviços.

image::images/services-tab.png[]

Uma "plataforma" pode conter vários "dispositivos". Um projeto é implantado para um dispositivo em uma plataforma específica.


== Entendendo os Tipos de Projeto do Java Card

Selecione Arquivo > Novo Projeto no menu e clique na categoria Java Card. Existem vários tipos de projetos Java Card que podem ser criados. Todos eles são construídos com o link:http://ant.apache.org/[+Apache Ant+], assim como projetos Java SE do NetBeans.

image::images/choose-project-type.png[]

Projetos Applet clássicos criam um applet Java Card tradicional para dispositivos menores, assim como applets utilizados no Java Card 2.0 e posterior. Projetos de biblioteca clássicos são como projetos Applet clássicos, mas sem o applet: é algum código que você espera que esteja no dispositivo e que pode ser compartilhado entre applets.

Projetos Biblioteca e Applet estendidos utilizam o API estendido no Java Card 3.0, então é possível utilizar java.lang.String e assim por diante. O classpath de inicialização será diferente para projetos Clássicos e Estendidos, então, por exemplo, a funcionalidade completar código não mostrará java.lang.String em projetos Clássicos, mas mostrará em projetos Estendidos.

image::images/create-applet-app.png[]

Projetos de Aplicações Web são provavelmente a funcionalidade mais legal do Java 3.0 Card. Você obtém o esqueleto de um projeto com um Servlet implementado, e caso você tenha acesso completo ao API do Servlet. É muito mais fácil trabalhar dessa maneira do que com uma das aplicações em estilo de Applet, pois não é necessário nenhum código especial no cliente para interagir com uma aplicação executada em um dispositivo, apenas um Web browser! É possível testar as aplicações localmente utilizando a Implementação de Referência e um Web browser de área de trabalho.

image::images/create-web-app.png[]


== Trabalhando Com um Projeto

Para este tutorial foi criado um novo Projeto Web.

No novo projeto Web, Digite "Aplicação Web Card" como nome do projeto e defina o local do projeto para o diretório NetBeansProject. Clique em Finalizar e o projeto aparecerá na guia Projeto.

Clique com o botão direito do mouse no nó do projeto na guia Projetos e selecione Propriedades no menu de contexto. Na seção Executar da janela Propriedades do Projeto, é possível alterar a plataforma e o dispositivo que o projeto implanta. Clique em Fechar para salvar suas alterações.

Trabalhar em uma aplicação Web Java Card é como trabalhar em qualquer outra aplicação Web implantada em um contêiner do servlet. Pressione o botão Executar na barra de ferramentas para executar a amostra do Hello World. Durante a execução de uma aplicação Web Java Card, uma janela do Web browser é aberta, mostrando a saída do servlet:  ``Hello do webapplication1.MyServlet`` .

image::images/editor.png[]

Quando você executa projetos do tipo applet, o NetBeans IDE oferece duas interfaces úteis: linha de comandos de saída e a console Java Card. Utilize a console para interagir com o applet: é possível enviar dados em hexadecimal e ler as respostas.

Dica: o RI contém mais projetos de amostra que estão prontos para serem abertos e executados no NetBeans IDE.

image::images/run-customizer.png[]


== Utilizando Funcionalidades Especiais de Plug-in

O Java Card envolve dois pedaços de arcana que não são encontrados em outras plataformas Java:

*Identificadores de Aplicação (AID)*:: Esses são identificadores únicos que se parecem com //aid//720A75E082/0058AEFC20. A primeira parte do hexadecimal é um ID de vendedor (é possível obter uma na link:http://iso.org/[+Organização Internacional para Padronização (ISO)+]); a segunda parte é um valor único apresentado. AIDs são utilizados para identificar classes de applet, pacotes Java (apenas projetos de applet &amp; clássico e biblioteca clássica) e instâncias únicas de applets (é possível implantar a mesma aplicação várias vezes em um dispositivo: o AID da instância é utilizado para selecionar qual applet receberá informações).
*scripts APDU*:: Estes são scripts que enviam dados para um applet. Isso envolve uma quantidade exorbitante de hexadecimais escritos, o script precisa selecionar uma instância de applet específica e, em seguida, envia dados para ela. É possível utilizar a console Java Card em vez de enviar um script pré-gravado.

Embora essas duas coisas sejam um pouco complicadas, os plug-ins do NetBeans fazem o que podem para abstrair a complexidade de lidar com elas, como a seguir:

* Quando você cria um projeto, valores razoáveis para o AID do Applet, AID de Pacote Clássico e um AID da Instância são gerados automaticamente.

* Quando você seleciona a guia Applets na caixa de diálogo Propriedades do Projeto, o projeto digitaliza o classpath para todas as subclasses do applet Java Card que localizar:

image::images/customize-applets-pre.png[]

* Uma vez localizadas, a caixa de diálogo permite selecionar quais applets são realmente implantados e personalizar os valores do AID utilizados, os parâmetros implantados e assim por diante. O IDE valida todos os dados inseridos, dificultando a inserção de dados inválidos:

image::images/customize-applets.png[]

* Se desejar implantar duas instâncias do mesmo applet, é possível configurar isso também; entretanto, para casos simples onde deseja apenas implantar uma instância de applet, não é necessário pensar sobre isso:

image::images/customize-instances.png[]

* Para testar applets em execução, não é necessário escrever um script APDU inteiro. É possível utilizar a console embutida para interagir com os applets implantados diretamente:

image::images/open-console.png[]

image::images/shell.png[]

* O "AID do pacote" para projetos Clássicos (permitidos para conter somente um pacote Java) também é tratado pelo IDE, mas é personalizável.

image::images/create-project-package-aid.png[]

* Parte de todos os valores de AID no seu projeto será um ID de vendedor de ISO designado (chamado RID). Para início rápido, o IDE gerará um valor aleatório para o RID, o que é bom para o desenvolvimento e teste. Caso tenha um RID oficial, é possível inseri-lo em Ferramentas > Opções para utilizá-lo em todos os novos projetos. Clique no botão Gerar em Propriedades do Projeto para atualizar os valores nos projetos existentes.

image::images/global-rid.png[]


== Integrando SDKs de Terceiros

Atualmente, as ferramentas suportam somente a Implementação de Referência do Java Card 3.0.2, mas têm um API extensível para cartões de vendedores integrados. As definições de dispositivos e plataforma são simplesmente arquivos de Propriedades, que são importados pelo script construtor.

A implantação é feita por meio de um grupo de tarefas Ant fornecido pelo vendedor de cartão. Isso significa que o projeto criado pode ser executado fora do IDE, pois não existe nenhum bloqueio. Os códigos-fonte para as tarefas Ant que são parte do RI do Java Card podem ser transferidas por download no link:http://kenai.com/projects/javacard[+portal do projeto Java Card+], assim como projetos de amostra prontos do NetBeans.

Você é um vendedor de cartões que criou as ferramentas de implantação Java Card? Contate o autor link:mailto:tboudreau@sun.com[+Tim Boudreau+] para obter detalhes sobre link:http://wiki.netbeans.org/JavaCardPlatformIntegration[+como integrar seu cartão+]! A integração pode ser feita em vários níveis, dependendo de quanto suporte você deseja fornecer dentro do IDE para o cartão.

link:/about/contact_form.html?to=6&subject=NetBeans%20Java%20Card%20Development%20Quick%20Start%20Guide[+Enviar Feedback neste Tutorial+]



== Links Relacionados

* Muito do crédito desses módulos vai para link:http://blogs.oracle.com/javacard/[+Anki Nelaturu+] e o resto da equipe do Java Card.
* link:http://java.sun.com/javacard[+Portal oficial do Sun Java Card+]: notícias, kits de desenvolvimento, referência, especificações, FAQ.
* link:http://kenai.com/projects/javacard/pages/Home[+Portal do projeto Java Card+]: fontes, projetos de amostra, fóruns, documentação.
* link:http://wiki.netbeans.org/JavaCardPlatformIntegration[+Integração da Plataforma para vendedores de Cartão+]
* link:http://java.sun.com/developer/technicalArticles/javacard/javacard-servlets/[+Implantando Servlets em Cartões Inteligentes: Servidores da Web Portáteis com Java Card 3.0+]
