No próprio jdk existe uma ferramenta chamada wsimport que é utilizada para traduzir um arquivo Web Services Description Language (WSDL) file, gerando os arquivos necessários (JAX-WS portable artifacts) para um cliente de web service, e permitindo que o cliente acesse este web service publicado.
A ferramenta wsimport está disponível em $JDK/bin.
Como exemplo, vamos usar o endereço do web service dos correios.
Para gerar as classes, o comando ficaria:
wsimport -keep -verbose https://apps.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente?wsdl
Mostrando postagens com marcador Java. Mostrar todas as postagens
Mostrando postagens com marcador Java. Mostrar todas as postagens
sexta-feira, 3 de fevereiro de 2017
Gerando classes a partir de um WSDL
sexta-feira, 23 de setembro de 2016
Recuperando a versão do jdk que gerou o class
Utilize o seguinte comando no terminal:
javap -verbose NomeDoArquivoClass | grep "major"
Normalmente, o que se deseja é a major version. Dos quais os possíveis valores são:
Java 1.2 - version46
Java 1.3 - version 47
Java 1.4 - version 48
Java 5 - version 49
Java 6 - version 50
Java 7 - version 51
Java 8 - version 52
javap -verbose NomeDoArquivoClass | grep "major"
Normalmente, o que se deseja é a major version. Dos quais os possíveis valores são:
Java 1.2 - version46
Java 1.3 - version 47
Java 1.4 - version 48
Java 5 - version 49
Java 6 - version 50
Java 7 - version 51
Java 8 - version 52
quarta-feira, 27 de abril de 2016
Retirando acentos e caracteres especiais de uma string
Para isso é preciso utilizar a classe Normalizer antes de realizar o replace dos caracteres:
String string = "ÚÇÁºT";
string = Normalizer.normalize(string, Normalizer.Form.NFD);
string = string.replaceAll("[^\\p{ASCII}]", "");
Marcadores:
acentos,
caracteres especiais,
Java,
replace,
string,
substituir
terça-feira, 20 de novembro de 2012
Lendo parâmetros da máquina virtual Java com Spring
Para esta tarefa, usei a versão 2.5 do spring.
Primeiramente, para passar um parâmetro para a JVM onde a aplicação será executada, use, por exemplo:
Na aplicação, vamos atentar para o cabeçalho do applicationContext:
Então, temos um database.properties para cada tipo de ambiente.
Guardei estes arquivos com pastas nomeadas pelo ambiente em uso, que foram criadas no diretório WEB-INF. Para a pasta dev, temos:
Depois disso, para usar o valor da propriedade no arquivo, basta usar a notação ${propriedade}:
Primeiramente, para passar um parâmetro para a JVM onde a aplicação será executada, use, por exemplo:
-Denvironment=dev
Na aplicação, vamos atentar para o cabeçalho do applicationContext:
Como exemplo de leitura, vamos usar o caso de ambientes de execução da aplicação. Onde temos valores de conexão distintos para uma base de dados.
Então, temos um database.properties para cada tipo de ambiente.
Guardei estes arquivos com pastas nomeadas pelo ambiente em uso, que foram criadas no diretório WEB-INF. Para a pasta dev, temos:
jdbc.url=jdbc:oracle:thin:@localhost:1521:base jdbc.usernme=admin jdbc.password=adminPara ler este arquivo pelo spring, teremos que criar um bean:
/WEB-INF/config/${environment}/database.properties
Depois disso, para usar o valor da propriedade no arquivo, basta usar a notação ${propriedade}:
quinta-feira, 12 de maio de 2011
Execução de comandos de forma síncrona
"Esse post é escrito com a colaboração de "@ed_sobrinho".
Essa implementação não supriu a necessidade porque era preciso tratar como chamada síncrona, ou seja, era necessário aguardar a conclusão da exportação para ler o arquivo de Log. O que não estava acontecendo.
O Ed enfrentou uma situação onde ele precisava executar uma exportação de uma base de dados Oracle para um arquivo. Para saber o resultado da exportação (sucesso/erro), seria necessário ler um arquivo de log gerado pela própria rotina de exportação.
A primeira tentativa foi feita com a classe Runtime do Java:
public static void main(String[] args) {
String command = "cmd.exe /c EXP <usuario>/<senha>@<instancia> file=<caminho_do_arquivo_do_dump>.dmp log=<caminho_do_arquivo_do_log>_log.log owner=<owner> STATISTICS=NONE";
try {
Runtime.getRuntime().exec(command);
} catch (IOException e) {
e.printStackTrace();
}
}Essa implementação não supriu a necessidade porque era preciso tratar como chamada síncrona, ou seja, era necessário aguardar a conclusão da exportação para ler o arquivo de Log. O que não estava acontecendo.
Então, através da biblioteca da Apache Commons Exec, o Ed obteve esse sucesso. O código ficou assim:
public static void main(String[] args) {
String command = "cmd.exe /c EXP <usuario>/<senha>@<instancia> file=<caminho_do_arquivo_do_dump>.dmp log=<caminho_do_arquivo_do_log>_log.log owner=<owner> STATISTICS=NONE";
CommandLine cmdLine = CommandLine.parse(command);
DefaultExecutor executor = new DefaultExecutor();
executor.setExitValue(1);
try {
executor.execute(cmdLine);
} catch (Exception e) {
e.printStackTrace();
}
}
segunda-feira, 17 de janeiro de 2011
Assinatura Digital de Documentos
Fiz este pequeno projeto para auxiliar na tarefa de assinatura digital de documentos.
O projeto consiste de DispatchActions, Servlets e Applets.
Os testes foram feitos com o token EPASS2000 da Pronova. Onde o funcionamento depende de dois arquivos principais: pkcs11.cfg (arquivo de configuração) e ngp11v211.dll.
Aqui eu separo os elementos do projeto em várias partes, caso o link de download fique quebrado.
Applet
O módulo de applet está com as classes SignatureManager e TokenSignerApplet.
Servlet
Struts
O projeto consiste de DispatchActions, Servlets e Applets.
Os testes foram feitos com o token EPASS2000 da Pronova. Onde o funcionamento depende de dois arquivos principais: pkcs11.cfg (arquivo de configuração) e ngp11v211.dll.
Aqui eu separo os elementos do projeto em várias partes, caso o link de download fique quebrado.
Applet
O módulo de applet está com as classes SignatureManager e TokenSignerApplet.
package br.com.certificacao;
import java.applet.Applet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Provider;
import java.security.Security;
import java.security.cert.Certificate;
import java.util.Enumeration;
/**
* Classe responsável por gerenciar a assinatura contida em
* um token. É necessário efetuar o login no dispositivo
* antes de utilizá-lo.
*/
public class SignatureManager {
private KeyStore keyStore;
private char[] PIN;
private final String CONFIG_DIR_NAME = "C:\\assinatura\\";
private final String CONFIG_FILE_NAME = "pkcs11.cfg";
private final String WINDOWS_DIR_NAME = "C:\\Windows\\System32\\";
private final String DLL_FILE_NAME = "ngp11v211.dll";
private String arquivoDLLApp = "";
public void createTokenFiles(String urlApp){
criarDiretorio();
criarDLL(urlApp);
createConfigFile();
}
private void criarDiretorio(){
try {
File dir = new File(CONFIG_DIR_NAME);
if (!dir.exists()){
dir.mkdirs();
}
}catch (Exception e) {
}
}
private void createConfigFile(){
try {
File file = new File(CONFIG_DIR_NAME + CONFIG_FILE_NAME);
file.createNewFile();
FileWriter writer = new FileWriter(file);
writer.write("name = PKCS11\n");
writer.write("library = " + arquivoDLLApp + "\n");
writer.write("slot = 1\n");
writer.write("disabledMechanisms = {\n");
writer.write(" CKM_SHA1_RSA_PKCS\n");
writer.write("}\n");
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Metodo que verifica a situação da DLL do Token e-Pass da Pronova.
* Verifica se a DLL já está criada na pasta Windows\System32.
* Se o arquivo não existir, cria uma cópia na pasta apontada pela variável CONFIG_DIR_NAME.
*
* @param urlApp
*/
private void criarDLL(String urlApp){
try {
File dllWindows = new File(WINDOWS_DIR_NAME + DLL_FILE_NAME);
if (dllWindows.exists()){
arquivoDLLApp = WINDOWS_DIR_NAME + DLL_FILE_NAME;
}else{
arquivoDLLApp = CONFIG_DIR_NAME + DLL_FILE_NAME;
URL url = new URL(urlApp+ "DLLServlet");
HttpURLConnection connectionGet = (HttpURLConnection) url.openConnection();
connectionGet.setRequestProperty("Request-Method", "GET");
connectionGet.setDoInput(true);
connectionGet.setDoOutput(false);
connectionGet.connect();
// imprime o numero do resultado
System.out.println("Resultado: "+ connectionGet.getResponseCode()+ "/"+ connectionGet.getResponseMessage());
InputStream input = connectionGet.getInputStream();
File file = new File(arquivoDLLApp);
file.createNewFile();
FileOutputStream output = new FileOutputStream(file);
int b = 0;
while (-1 != ((b = input.read()))) {
output.write(b);
}
output.close();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @param password representa o PIN informado pelo usuário
* @return true se houve sucesso no login ou false se ocorreu
* algum erro
*/
public boolean login(String password, Applet applet)throws Exception{
boolean status = true;
try {
PIN = password.toCharArray();
//A configuracao do provider eh possivel diante de tres opcoes:
//1.Configuracao do java.security
// p. ex:security.provider.10=sun.security.pkcs11.SunPKCS11 D:\\desenvolvimento\\projetos\\funasa\\pkcs11.cfg
//2.Pedindo para o usuario fornecer o arquivo de configuracao, através de um uploader (argh!!)
//3.Manualmente, no codigo da applet
//Foi escolhida a forma manual.
Provider p = new sun.security.pkcs11.SunPKCS11(CONFIG_DIR_NAME + CONFIG_FILE_NAME);
Security.addProvider(p);
keyStore = KeyStore.getInstance("PKCS11");
keyStore.load(null, PIN);
}catch(Exception e){
throw new Exception(e);
}
return status;
}
/**
* @return chain representa o certificado armazenado no token
*/
public Certificate[] getCertificate(){
Certificate[] chain = null;
try {
Enumeration aliasesEnum = keyStore.aliases();
while (aliasesEnum.hasMoreElements()){
String alias = aliasesEnum.nextElement();
if(keyStore.isKeyEntry(alias)){
chain = keyStore.getCertificateChain(alias);
break;
}
}
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
return chain;
}
/**
* @return privateKey representa a chave privada armazenada no Token
*/
public PrivateKey getPrivateKey() {
PrivateKey privateKey = null;
try {
Enumeration aliasesEnum = keyStore.aliases();
while (aliasesEnum.hasMoreElements()){
String alias = aliasesEnum.nextElement();
if(keyStore.isKeyEntry(alias)){
privateKey = (PrivateKey)keyStore.getKey(alias, PIN);
keyStore.getCertificateChain(alias);
break;
}
}
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
return privateKey;
}
}
package br.com.certificacao;
import java.applet.Applet;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Calendar;
import javax.swing.JOptionPane;
import netscape.javascript.JSObject;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfSignatureAppearance;
import com.lowagie.text.pdf.PdfStamper;
public class TokenSignerApplet extends Applet {
private static final long serialVersionUID = 4023705496194390163L;
private static final String PIN_CODE_PARAM = "pinCodeField";
private static final String NOME_PARAM = "nomeField";
private static final String APP_URL_PARAM = "appUrlField";
private static final String SIGN_BUTTON_CAPTION_PARAM = "signButtonCaption";
private Button mSignButton;
private SignatureManager manager = new SignatureManager();
/**
* Cria e inicializa a interface grafica da applet.
*/
public void init() {
criarArquivoToken();
String signButtonCaption = this.getParameter(SIGN_BUTTON_CAPTION_PARAM);
mSignButton = new Button(signButtonCaption);
mSignButton.setLocation(0, 0);
Dimension appletSize = this.getSize();
mSignButton.setSize(appletSize);
mSignButton.setBackground(new Color(190, 1, 1));
mSignButton.setForeground(new Color(255,255,255));
mSignButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
assinaStream();
}
});
this.setLayout(null);
this.add(mSignButton);
}
public void assinaStream(){
JSObject browserWindow = JSObject.getWindow(this);
JSObject mainForm = (JSObject)browserWindow.eval("document.forms[0]");
String pinCodeParam = getParameter(PIN_CODE_PARAM);
JSObject pinCodeField = (JSObject)mainForm.getMember(pinCodeParam);
String pinCode = (String)pinCodeField.getMember("value");
String nomeParam = getParameter(NOME_PARAM);
JSObject nomeField = (JSObject)mainForm.getMember(nomeParam);
String nome = (String)nomeField.getMember("value");
String appParam = this.getParameter(APP_URL_PARAM);
JSObject appField = (JSObject) mainForm.getMember(appParam);
String appUrl = (String) appField.getMember("value");
try{
//Chama o servlet para leitura do pdf.
String urlArquivoServlet = appUrl + "/ArquivoServlet";
URL url = new URL(urlArquivoServlet);
HttpURLConnection connectionGet = (HttpURLConnection)url.openConnection();
connectionGet.setRequestProperty("Request-Method", "GET");
connectionGet.setDoInput(true);
connectionGet.setDoOutput(false);
connectionGet.connect();
//Stream de LEITURA de dados do pdf
InputStream input = connectionGet.getInputStream();
SignatureManager manager = new SignatureManager();
if(manager.login(pinCode, this)){
java.security.PrivateKey key = manager.getPrivateKey();
java.security.cert.Certificate certificate[] = manager.getCertificate();
try{
PdfReader pdfReader = new PdfReader(input);
//Monta a conexao com o Servlet para escrever o arquivo assinado digitalmente
HttpURLConnection connectionPost = (HttpURLConnection)url.openConnection();
connectionPost.setRequestProperty("Content-Type", "application/pdf");
connectionPost.setDoOutput(true);
connectionPost.connect();
OutputStream output = connectionPost.getOutputStream();
//Assina PDF
PdfStamper stamper = PdfStamper.createSignature(pdfReader, output, '\0');
PdfSignatureAppearance signAppearance = stamper.getSignatureAppearance();
signAppearance.setCrypto(key, certificate, null, PdfSignatureAppearance.WINCER_SIGNED);
signAppearance.setReason("Empresa S/A");
signAppearance.setLocation("Sao Paulo - SP");
signAppearance.setSignDate(Calendar.getInstance());
signAppearance.setCertificationLevel(1);
stamper.close();
BufferedReader rd = new BufferedReader(new InputStreamReader(connectionPost.getInputStream()));
String line;
while((line = rd.readLine()) != null){
System.out.println(line);
}
output.close();
input.close();
rd.close();
//chamada de uma funcao javascript no jsp
browserWindow.call("chamaAction", new Object[] {nome});
}
catch(Exception e){
e.printStackTrace();
}
} else{
JOptionPane.showMessageDialog(this, "Erro ao assinar documento.");
}
input.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void criarArquivoToken(){
try {
JSObject browserWindow = JSObject.getWindow(this);
JSObject mainForm = (JSObject) browserWindow.eval("document.forms[0]");
String appParam = this.getParameter(APP_URL_PARAM);
JSObject appField = (JSObject) mainForm.getMember(appParam);
String app = (String) appField.getMember("value");
manager.createTokenFiles(app);
}catch (Exception e) {
e.printStackTrace();
}
}
}
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<html>
<head>
<title>Teste Token Signer Applet</title>
</head>
<body>
<script type="text/javascript">
function chamaAction(tarefa){
var forward = "./certificacao.do?method=doFimCertificacao" +
"&idTarefa=" + tarefa;
doSubmit(forward);
}
</script>
<form>
<input type="hidden" name="appUrl" value=${pageContext.request.contextPath}>
Código PIN:
<input type="text" width="100" size=80 name="pinCode">
<br>
Nome:
<input type="text" width="100" size=80 name="nome" value=${nome_request}>
</form>
<object
classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
codebase="http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=5,0,0,5"
width="130" height="25" name="TokenSignerApplet">
<param name="code" value="br.com.certificacao.TokenSignerApplet">
<param name="archive" value="TokenSignerApplet.jar , ./certificacao/bcprov-jdk14-138.jar , ./certificacao/iText-2.0.8.jar">
<param name="mayscript" value="true">
<param name="type" value="application/x-java-applet;version=1.5">
<param name="scriptable" value="false">
<param name="signButtonCaption" value="Assinar Documento">
<param name="appUrlField" value="appUrl">
<param name="pinCodeField" value="pinCode">
<param name="nomeField" value="nome">
<comment>
<embed
type="application/x-java-applet;version=1.5"
code="br.com.certificacao.TokenSignerApplet"
archive="TokenSignerApplet.jar , ./certificacao/bcprov-jdk14-138.jar , ./certificacao/iText-2.0.8.jar"
width="130" height="25" scriptable="true"
pluginspage="http://java.sun.com/products/plugin/index.html#download"
appUrlField="appUrl"
pinCodeField="pinCode"
signButtonCaption="Assinar Documento"
nomeField="nome">
</embed>
</comment>
</object>
</body>
</html>
Servlet
package br.com.servlet;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet que gerencia o armazenamento do arquivo assinado.
*
* @author marcelo.garcia
*
*/
public class ArquivoServlet extends HttpServlet {
private static final long serialVersionUID = 4102000674926121528L;
/**
* Recupera um arquivo e envia para o cliente (por ex. um applet)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ArquivoServlet - doGet");
lerArquivo(request, response);
}
/**
* Recebe o arquivo assinado e grava em disco no servidor.
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ArquivoServlet - doPost");
try {
InputStream input = request.getInputStream();
File file = new File("D:\\temp\\ResumoServletCriado.pdf");
file.createNewFile();
FileOutputStream output = new FileOutputStream(file);
int b = 0;
while (-1 != ((b = input.read()))) {
output.write(b);
}
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Recupera um arquivo pdf
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
private void lerArquivo (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ArquivoServlet - lerArquivo");
try {
response.setContentType("application/pdf");
InputStream is = new FileInputStream("D:\\temp\\Resumo.pdf");
geraOutput(response, is);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Gera saída do arquivo PDF gerado
*
* @param response
* @param is
* @throws IOException
*/
private void geraOutput(HttpServletResponse response, InputStream is) throws IOException {
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
try {
response.setCharacterEncoding("iso-8859-1");
int c;
while ((c = is.read()) != -1) {
byte[] b = new byte[1];
b[0] = (byte)c;
out.write(b);
}
} finally {
if (is != null)
is.close();
if (out != null){
out.flush();
out.close();
}
}
}
}
package br.com.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet que controla a DLL do token da pronova.
*
* @author marcelo.garcia
*/
public class DLLServlet extends HttpServlet {
private static final long serialVersionUID = -3363073130063055864L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("DO-post");
try {
InputStream url = this.getServletContext().getResourceAsStream("\\dll\\ngp11v211.dll");
OutputStream output = response.getOutputStream();
int b = 0;
while (-1 != ((b = url.read()))) {
output.write(b);
}
output.close();
url.close();
} catch (IOException e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
doGet(request, response);
}
}
Struts
package br.com.struts;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
/**
*
* @author marcelo.garcia
* @version 1.0
*/
public class ActionCertificacao extends DispatchAction {
public ActionForward doInicioCertificacao(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
System.out.println("Metodo inicial da certificacao");
return mapping.findForward("token");
}
/**
* Metodo que finaliza o processo de assinatura digital.
* Chamado por uma funcao javascript no token.jsp.
*
* @param mapping
* @param actionForm
* @param request
* @param response
* @return
* @throws IOException
* @throws ServletException
*/
public ActionForward doFimCertificacao(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
System.out.println("Metodo final da certificacao ");
return null;
}
}
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
path="/certificacao"
type="br.com.struts.ActionCertificacao"
parameter="method"
scope="request"
name="formCertificacao"
validate="false">
Marcadores:
Applet,
Assinatura Digital,
Java,
PDF
sexta-feira, 14 de janeiro de 2011
Descompilação de códigos Java
Uma ferramenta muito útil e simples para descompilar códigos java é conhecida como JAD, que pode ser baixada gratuitamente na Net.
Basicamente, você usará duas formas de descompilação:
1. Para descompliar um único arquivo, use o comando:
Com isso, será criado o arquivo Pessoa.java
2. Para descompilar vários arquivos organizados em pacotes, use o comando:
Jad descompilará todos os .class considerando as subpastas de "bin" e criará os respectivos .java organizados em subpastas dentro de "src".
Por exemplo, se você tiver a seguinte hierarquia de pastas "bin/com/br/Pessoa.class" (Uma classe Pessoa em uma pacote "com.br"), então o arquivo descompilado será "src/com/br/Pessoa.java".
Basicamente, você usará duas formas de descompilação:
1. Para descompliar um único arquivo, use o comando:
jad -sjava Pessoa.class
Com isso, será criado o arquivo Pessoa.java
2. Para descompilar vários arquivos organizados em pacotes, use o comando:
jad -o -r -sjava -dsrc bin/**/*.class
Jad descompilará todos os .class considerando as subpastas de "bin" e criará os respectivos .java organizados em subpastas dentro de "src".
Por exemplo, se você tiver a seguinte hierarquia de pastas "bin/com/br/Pessoa.class" (Uma classe Pessoa em uma pacote "com.br"), então o arquivo descompilado será "src/com/br/Pessoa.java".
quinta-feira, 6 de janeiro de 2011
Recuperando conexão de banco no Tomcat
A configuração de conexão a um banco de dados no Tomcat pode ser feita usando o context.xml. Este arquivo deve ser armazenado na pasta META-INF do projeto web.
Exemplo do arquivo context.xml:
O método para recuperar a conexão é:
private static Connection getConnection() {
try {
InitialContext initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup("jdbc/dataSourceName");
Connection conexao = ds.getConnection();
return conexao;
} catch (Exception e) {}
return null;
}
terça-feira, 8 de junho de 2010
Merge de propriedades
Olá pessoal,
Fiz esse pequeno utilitário para sincronizar os métodos get e set de dois objetos.
Fiz isso objetivando atender um caso de atualização de cadastro, evitando fazer cansativos get de um objeto seguido do set para outro objeto destino do valor.
Vocês podem usar a vontade e se houver algum melhoramento, por favor comuniquem.
Código da classe
Fiz esse pequeno utilitário para sincronizar os métodos get e set de dois objetos.
Fiz isso objetivando atender um caso de atualização de cadastro, evitando fazer cansativos get de um objeto seguido do set para outro objeto destino do valor.
Vocês podem usar a vontade e se houver algum melhoramento, por favor comuniquem.
Código da classe
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
*
* @author Marcelo Garcia
*
*/
public class MergeProperties {
/**
* Realiza o merge dos valores do objeto origem para o objeto destino.
*
* Os metodos que sao capturados pelo algoritmo sao metodos GET e
* que nao possuem parametro.
*
* Os valores sao capturados a partir dos metodos GET existentes na
* classe origem. Isso quer dizer que caso o destino seja uma subclasse
* de origem, os seus metodos nao serao reconhecidos.
* Somente valores nao nulos sao passados de origem para destino.
* Campos string vazios e numericos zerados sao permitidos.
*
* @param
* @param destino: Recebera os valores de origem
* @param origem: Objeto cujas propriedades serao transferidas para o destino
* @return o objeto modificado
*/
public staticC mergeProperties(C destino, C origem) {
Method[] metodos = origem.getClass().getMethods();
String nomeMetodo;
String nomeMetodoSemGet;
try {
for (Method metodo : metodos) {
nomeMetodo = metodo.getName();
nomeMetodoSemGet = nomeMetodo.substring(3,nomeMetodo.length());
//Testa se é um método get
if (!nomeMetodo.substring(0,3).equals("get"))
continue;
if (metodo.getParameterTypes().length != 0)
continue;
Object valor = metodo.invoke(origem);
if (valor == null)
continue;
//Captura o metodo SET de acordo com o tipo de retorno do metodo GET
Method metodoSET = destino.getClass().getMethod("set"+nomeMetodoSemGet, metodo.getReturnType());
if (metodo != null)
metodoSET.invoke(destino, valor);
}
}
catch (NoSuchMethodException e) {
System.out.println("Metodo nao encontrado.");
}
catch (InvocationTargetException e) {
System.out.println("Chamada de metodo incorreta.");
}
catch (IllegalAccessException e) {
System.out.println("Metodo inacessivel.");
}
catch (IllegalArgumentException e) {
System.out.println("Argumentos incorretos.");
}
return destino;
}
}
sexta-feira, 28 de maio de 2010
Assinatura de Applets
Primeiramente, é preciso gerar o arquivo com o applet que será assinado digitalmente. Para isso, use o comando:
jar -cvf TokenSignerApplet.jar br\com\certificacao\*.class
O próximo passo é gerar o arquivo de assinatura para o applet. Use o comando:
keytool -genkey -alias signFiles -keystore certificado.jks -keypass !secret -dname "CN=Company Name" -storepass !secret
Finalmente, assine o applet com o comando:
jarsigner -keystore certificado.jks -storepass !secret -keypass !secret TokenSignerApplet.jar signFiles
jar -cvf TokenSignerApplet.jar br\com\certificacao\*.class
O próximo passo é gerar o arquivo de assinatura para o applet. Use o comando:
keytool -genkey -alias signFiles -keystore certificado.jks -keypass !secret -dname "CN=Company Name" -storepass !secret
Finalmente, assine o applet com o comando:
jarsigner -keystore certificado.jks -storepass !secret -keypass !secret TokenSignerApplet.jar signFiles
sexta-feira, 18 de dezembro de 2009
Serializador Java para JSON - Parte I
JSON é uma forma de transferência de dados que está sendo utilizado bastante atualmente. Possui um formato bastante que deixa o conjunto de dados bastante enxuto.
Desenvolvi estas classes baseadas na biblioteca FlexJson: http://flexjson.sourceforge.net/ . Fiz algumas alterações que deixou a biblioteca bem menor. Mas, minha motivação principal foi que eu pudesse utilizar a biblioteca na versão 1.4 do Java. Ao todo, a biblioteca ficou com apenas quatro classes: ChainedIterator, ChainedSet, JSONSerializer, ObjectVisitor. Vou colocar o código de todas elas, e também um exemplo de uso.
Código da classse ChainedIterator
Desenvolvi estas classes baseadas na biblioteca FlexJson: http://flexjson.sourceforge.net/ . Fiz algumas alterações que deixou a biblioteca bem menor. Mas, minha motivação principal foi que eu pudesse utilizar a biblioteca na versão 1.4 do Java. Ao todo, a biblioteca ficou com apenas quatro classes: ChainedIterator, ChainedSet, JSONSerializer, ObjectVisitor. Vou colocar o código de todas elas, e também um exemplo de uso.
Código da classse ChainedIterator
import java.util.Iterator;Código da classe ChainedSet
import java.util.Iterator;
import java.util.Set;
public class ChainedIterator implements Iterator {
Iterator[] iterators;
int current = 0;
public ChainedIterator(Set sets) {
Object[] arraySets = sets.toArray();
iterators = new Iterator[sets.size()];
for( int i = 0; i < sets.size(); i++ ) {
iterators[i] = ((Set)arraySets[i]).iterator();
}
}
public boolean hasNext() {
if( iterators[current].hasNext() ) {
return true;
} else {
current++;
return current < iterators.length && iterators[current].hasNext();
}
}
public Object next() {
return iterators[current].next();
}
public void remove() {
iterators[current].remove();
}
}
import java.util.Set;Código da classe JSONSerializer
import java.util.HashSet;
import java.util.Iterator;
import java.util.Collection;
import java.util.TreeSet;
public class ChainedSet implements Set {
Set parent;
Set child;
public ChainedSet(Set parent) {
this.parent = parent;
this.child = new HashSet();
}
public int size() {
return this.child.size() + parent.size();
}
public boolean isEmpty() {
return this.child.isEmpty() && parent.isEmpty();
}
public boolean contains(Object o) {
return child.contains(o) || parent.contains(o);
}
public Iterator iterator() {
Set sets = new TreeSet();
sets.add(child);
sets.add(parent);
return new ChainedIterator(sets);
}
public Object[] toArray() {
Object[] carr = child.toArray();
Object[] parr = parent.toArray();
Object[] combined = new Object[ carr.length + parr.length ];
System.arraycopy( carr, 0, combined, 0, carr.length );
System.arraycopy( parr, 0, combined, carr.length, parr.length );
return combined;
}
public Object[] toArray(Object[] a) {
throw new IllegalStateException( "Not implemeneted" );
}
public boolean add(Object o) {
return child.add( o );
}
public boolean remove(Object o) {
return child.remove( o );
}
public boolean containsAll(Collection c) {
return child.containsAll(c) || parent.containsAll(c);
}
public boolean addAll(Collection c) {
return child.addAll( c );
}
public boolean retainAll(Collection c) {
return child.retainAll( c );
}
public boolean removeAll(Collection c) {
return child.removeAll( c );
}
public void clear() {
child.clear();
}
public Set getParent() {
return parent;
}
}
import java.util.ArrayList;Código da classe ObjectVisitor
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JSONSerializer {
public final static char[] HEX = "0123456789ABCDEF".toCharArray();
List pathExpressions = new ArrayList();
Map transformations = new HashMap();
public JSONSerializer() {
}
public String serialize( String rootName, Object target ) {
return new ObjectVisitor().visit( rootName, target );
}
public String serialize( Object target ) {
return new ObjectVisitor().visit( target );
}
public String prettyPrint( Object target ) {
return new ObjectVisitor( true ).visit( target );
}
public String prettyPrint( String rootName, Object target ) {
return new ObjectVisitor( true ).visit( rootName, target );
}
}
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
public class ObjectVisitor {
protected StringBuffer builder;
protected boolean prettyPrint = false;
private int amount = 0;
private boolean insideArray = false;
protected ObjectVisitor() {
builder = new StringBuffer();
}
public ObjectVisitor(boolean prettyPrint) {
this();
this.prettyPrint = prettyPrint;
}
public String visit( Object target ) {
json( target );
return builder.toString();
}
public String visit( String rootName, Object target ) {
beginObject();
string(rootName);
add(':');
json( target );
endObject();
return builder.toString();
}
private void numberToString(Number n) {
if (n != null && testValidity(n)) {
String s = n.toString();
if (s.indexOf('.') > 0 && s.indexOf('e') < 0 && s.indexOf('E') < 0) {
while (s.endsWith("0")) {
s = s.substring(0, s.length() - 1);
}
if (s.endsWith(".")) {
s = s.substring(0, s.length() - 1);
}
}
add(s);
}else{
add("0");
}
}
private boolean testValidity(Object o) {
if (o != null) {
if (o instanceof Double) {
if (((Double)o).isInfinite() || ((Double)o).isNaN()) {
return false;
}
} else if (o instanceof Float) {
if (((Float)o).isInfinite() || ((Float)o).isNaN()) {
return false;
}
}
}
return true;
}
private void json(Object object) {
if (object == null) add("null");
else if (object instanceof Class)
string( ((Class)object).getName() );
else if (object instanceof Boolean)
bool( ((Boolean) object) );
else if (object instanceof String)
string(object);
else if (object instanceof Character)
string(object);
else if (object instanceof Number)
numberToString((Number) object);
else if (object instanceof Map)
map( (Map)object);
else if (object.getClass().isArray())
array( object );
else if( object instanceof Date)
date( (Date)object );
else if (object instanceof Collection)
array(((Collection) object).iterator() );
else
bean( object );
}
private void map(Map map) {
beginObject();
Iterator it = map.keySet().iterator();
boolean firstField = true;
while (it.hasNext()) {
Object key = it.next();
int len = builder.length();
add( key, map.get(key), firstField );
if( len < builder.length() ) {
firstField = false;
}
}
endObject();
}
private void array(Iterator it) {
beginArray();
while (it.hasNext()) {
if( prettyPrint ) {
addNewline();
}
addArrayElement( it.next(), it.hasNext() );
}
endArray();
}
private void array(Object object) {
beginArray();
int length = Array.getLength(object);
for (int i = 0; i < length; ++i) {
if( prettyPrint ) {
addNewline();
}
addArrayElement( Array.get(object, i), i < length - 1 );
}
endArray();
}
private void addArrayElement(Object object, boolean isLast ) {
int len = builder.length();
json( object );
if( len < builder.length() ) { // make sure we at least added an element.
if ( isLast ) add(',');
}
}
private void bool(Boolean b) {
add( b.booleanValue() ? "true" : "false" );
}
private void string(Object obj) {
add('"');
CharacterIterator it = new StringCharacterIterator(obj.toString());
for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {
if (c == '"') add("\\\"");
else if (c == '\\') add("\\\\");
else if (c == '\b') add("\\b");
else if (c == '\f') add("\\f");
else if (c == '\n') add("\\n");
else if (c == '\r') add("\\r");
else if (c == '\t') add("\\t");
else if (Character.isISOControl(c)) {
unicode(c);
} else {
add(c);
}
}
add('"');
}
private void date(Date date) {
builder.append( date.getTime());
}
private ChainedSet visits = new ChainedSet( Collections.EMPTY_SET );
protected void bean(Object bean) {
if( !visits.contains( bean ) ) {
visits = new ChainedSet( visits );
visits.add( bean );
beginObject();
try {
Class klass = bean.getClass();
Method[] methods = klass.getMethods();
boolean firstField = true;
for (int i = 0; i < methods.length; i += 1) {
Method method = methods[i];
if (Modifier.isPublic(method.getModifiers())) {
String name = method.getName();
String key = "";
boolean invoke = false;
if (name.startsWith("get")) {
invoke = true;
key = name.substring(3);
} else if (name.startsWith("is")) {
key = name.substring(2);
invoke = true;
}
if (key.length() > 0){
key = String.valueOf(key.charAt(0)).toLowerCase() + key.substring(1);
}
if (invoke) {
Object value = method.invoke(bean, (Object[])null);
if( !visits.contains( value ) ) {
add(key, value, firstField);
firstField = false;
}
}
}
}
} catch( Exception e ) {
}
endObject();
visits = (ChainedSet) visits.getParent();
}
}
protected boolean addComma(boolean firstField) {
if ( !firstField ) {
add(',');
} else {
firstField = false;
}
return firstField;
}
protected void beginObject() {
if( prettyPrint ) {
if( insideArray ) {
indent( amount );
}
amount += 4;
}
add( '{' );
}
protected void endObject() {
if( prettyPrint ) {
addNewline();
amount -= 4;
indent( amount );
}
add( '}' );
}
private void beginArray() {
if( prettyPrint ) {
amount += 4;
insideArray = true;
}
add('[');
}
private void endArray() {
if( prettyPrint ) {
addNewline();
amount -= 4;
insideArray = false;
indent( amount );
}
add(']');
}
protected void add( char c ) {
builder.append( c );
}
private void indent(int amount) {
for( int i = 0; i < amount; i++ ) {
builder.append( " " );
}
}
private void addNewline() {
builder.append("\n");
}
protected void add( Object value ) {
builder.append( value );
}
protected void add(Object key, Object value, boolean prependComma) {
int start = builder.length();
addComma( prependComma );
addAttribute( key );
int len = builder.length();
json( value );
if( len == builder.length() ) {
builder.delete( start, len ); // erase the attribute key we didn't output anything.
}
}
private void addAttribute(Object key) {
if( prettyPrint ) {
addNewline();
indent( amount );
}
builder.append("\"");
builder.append( key );
builder.append( "\"" );
builder.append( ":" );
if( prettyPrint ) {
builder.append(" ");
}
}
private void unicode(char c) {
add("\\u");
int n = c;
for (int i = 0; i < 4; ++i) {
int digit = (n & 0xf000) >> 12;
add(JSONSerializer.HEX[digit]);
n <<= 4;
}
}
}
Serializador Java para JSON - Parte II
Na Parte I do post sobre JSON, postei o código da biblioteca. Nesta parte dois, está um exemplo de uso, que é formado por uma classe principal (TesteJson) e pelas classes Person e PhoneNumber para ilustrar o uso de objetos para a escrita do código JSON.
Código da classe PhoneNumber
Código da classe Person
Código da classe TesteJson
Código da classe PhoneNumber
public class PhoneNumber {
private int code;
private String number;
public PhoneNumber() {
}
public PhoneNumber(int code, String number) {
this.code = code;
this.number = number;
}
//Métodos GET e SET.....
}
Código da classe Person
import java.util.Date;
import java.util.List;
public class Person {
private String firstName;
private String lastname;
private int idade;
private boolean casado;
private Boolean solteiro;
private Long altura;
private Integer numero;
private PhoneNumber phone;
private PhoneNumber fax;
private Date data;
private List phones;
private PhoneNumber[] arrayPhones;
public Person() {}
public Person(String fn, String ln) {
this.firstName = fn;
this.lastname = ln;
}
// Métodos GET e SET........
}
Código da classe TesteJson
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import json.serializer.JSONSerializer;
public class TesteJson {
public static void main(String[] args) {
Person joe = new Person("Joe", "Wayne");
PhoneNumber phoneJoe = new PhoneNumber(321, "5565-987");
PhoneNumber fax = new PhoneNumber(123, "9999-999");
PhoneNumber[] arrayPhones = new PhoneNumber[2];
arrayPhones[0] = phoneJoe;
arrayPhones[0] = fax;
List phones = new ArrayList();
phones.add(phoneJoe);
phones.add(fax);
joe.setPhone(phoneJoe);
joe.setFax(fax);
joe.setData(Calendar.getInstance().getTime());
joe.setIdade(12);
joe.setAltura(new Long(120));
joe.setArrayPhones(arrayPhones);
joe.setPhones(phones);
joe.setAltura(new Long(120));
joe.setCasado(true);
joe.setSolteiro(new Boolean(false));
joe.setNumero(new Integer(53));
Person moe = new Person("Bart", "Simpson");
PhoneNumber phone = new PhoneNumber(321, "5565-987");
moe.setPhone(phone);
moe.setFax(new PhoneNumber(321, "9999-999"));
moe.setData(Calendar.getInstance().getTime());
List collection = new ArrayList();
collection.add(joe);
collection.add(moe);
JSONSerializer serial = new JSONSerializer();
String strJoe = serial.serialize(joe);
System.out.println(strJoe);
serial = new JSONSerializer();
strJoe = serial.serialize(collection);
System.out.println(strJoe);
}
}
Assinar:
Postagens (Atom)