terça-feira, 9 de novembro de 2010

Configurando o GitHub no Eclipse


Após martelar um tempinho, concluímos a configuração do Eclipse para trabalhar com Git.

Este post aborda apenas esta parte de configuração. Para melhor entender como funciona essa questão de repositório distribuído, leia documentos em http://git-scm.com/.

Para este tutorial, usei o Eclipse Helios SR1 e instalei o EGit no Eclipse Marketplace.

Seguem os passos da configuração:

1. Criar RSA Key no Eclipse, tanto a private como a public.

2. Criar uma conta e um projeto no GitHub (https://github.com/)

3. Armazenar a sua chave pública na área administrativa do projeto. Você pega a chave pública gerada no Eclipse.

4. Clonar o repositório remoto.


5. Definir o endereço do repositório. Este endereço está na aba SSH do painel do projeto no GitHub.
6. Selecionar um branch. Neste caso, não temos nada comitado porque o projeto é novo.


7. Definir o espaço do repositório local.


8. Selecionar o repositório e finalizar.



9. Criar um novo projeto para trabalhar ou importar algum existente.

10. O resultado final é este:


quarta-feira, 3 de novembro de 2010

Configurando do JBoss 6 para Eclipse Helios

Foram utilizadas as seguintes versões dos programas:
JBoss 6.0.0 - M5
Helios - SR1
JBoss Tools - 3.2.0
JBossAS Tools - 2.2.0.v20101016-0359-H111-Beta1

Seguir os passos:

1. Help > Install New Software.
2. Usar 'Work with' com http://download.jboss.org/jbosstools/updates/development/
3. Na lista de resultados, marcar apenas 'JBossAS Tools' em 'All JBoss Tools'.
4. Next, etc, Finish.

Pronto. Reinicie o eclipse e o plugin de controle de servidor já estará disponível.

quinta-feira, 15 de julho de 2010

ClassNotFoundException em Applet

Algumas vezes, nos deparamos com o seguinte erro ao abrir um applet em um navegador:

load: class br.com.certificacao.TokenSignerApplet.class not found.
java.lang.ClassNotFoundException: br.com.certificacao.TokenSignerApplet.class
at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: open HTTP connection failed:http://192.168.0.5:8082/certificaApp/br/com/certificacao/TokenSignerApplet/class.class
at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
... 7 more
Exception: java.lang.ClassNotFoundException: br.com.certificacao.TokenSignerApplet.class
load: class br.com.certificacao.TokenSignerApplet.class not found.
java.lang.ClassNotFoundException: br.com.certificacao.TokenSignerApplet.class
at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: open HTTP connection failed:http://192.168.0.5:8082/certificaApp/br/com/certificacao/TokenSignerApplet/class.class
at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
... 7 more
Exception: java.lang.ClassNotFoundException: br.com.certificacao.TokenSignerApplet.class



No meu caso, sofri com isso usando o Internet Explorer. Se isso acontecer com você, tente as seguintes situações:
  1. Utilizar outro browser ( ou outra versão do seu browser);
  2. Tentar desabilitar o uso de proxy (pode ser que o proxy esteja barrando alguma coisa relacionada ao uso de applets, neste caso, você terá que solicitar ao gerente da rede um ajuste no proxy);
  3. Trocar a ordem dos parâmetros java_code e java_archive , deixando o java_archive antes.
    <param name="java_archive" value="TokenSignerApplet.jar, bcprov-jdk14-138.jar, iText-2.0.8.jar">

    <param name="java_code" value="br.com.certificacao.TokenSignerApplet.class">

    <param name="java_codebase" value="<%="http://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()%>">

terça-feira, 13 de julho de 2010

Código de applet para assinatura digital

Este simples código demonstra como disponibilizar uma applet que lê um token para assinar um documento digitalmente.
Merecem destaque as seguintes informações:

  • Os arquivos bcprov-jdk14-138.jar e iText-2.0.8.jar são utilizados para assinar o pdf gerado.
  • O arquivo TokenSignerApplet.jar contem a classe da applet
  • O parâmetro java_codebase é importante de configurar para não dar erro na localização dos arquivos com as classes.
<object
classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
codebase="" width="130" height="25" name="TokenSignerApplet">
<param name="java_code" value="br.com.certificacao.TokenSignerApplet.class">
<param name="java_codebase" value="<%="http://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()%>">
<param name="java_archive" value="TokenSignerApplet.jar , bcprov-jdk14-138.jar , 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="pinCodeField" value="pinCode">
<comment>
<embed
type="application/x-java-applet;version=1.5"
java_code="br.com.ebiz.funasawf.web.certificacao.TokenSignerApplet.class"
java_codebase="<%="http://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()%>"
java_archive="TokenSignerApplet.jar , bcprov-jdk14-138.jar , iText-2.0.8.jar"
width="130" height="25" scriptable="true"
pluginspage="http://java.sun.com/products/plugin/index.html#download"
pinCodeField="pinCode"
signButtonCaption="Assinar Documento"
</embed>
<noembed>
Smart card signing applet can not be started because
Java Plugin 1.5 or newer is not installed.
</noembed>
</comment>
</object>

quinta-feira, 17 de junho de 2010

Recuperar os parametros de uma requisição HTTP

Segue um exemplo de um método que recupera um enumeration dos parametros de uma requisição:

private void getParameters(HttpServletRequest request){
Enumeration e = request.getParameterNames();

while (e.hasMoreElements()) {
String parameterName = (String) e.nextElement();

String[] parametervalues = request.getParameterValues(parameterName);
}
}

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


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 static C 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

quinta-feira, 7 de janeiro de 2010

Configurar JBoss como serviço através do JavaServiceWrapper


Despois de descompactar o arquivo, faça o seguinte:
  • Configurar os seguintes arquivos e diretórios. Onde YOURCONFIG, normalmente será default
copy WRAPPER_HOME\bin\Wrapper.exe %JBOSS_HOME%\bin\Wrapper.exe
copy WRAPPER_HOME\lib\Wrapper.DLL %JBOSS_HOME%\lib\Wrapper.DLL
copy WRAPPER_HOME\lib\wrapper.jar %JBOSS_HOME%\lib\wrapper.jar
mkdir %JBOSS_HOME%\server\YOURCONFIG\wrapper
  • Criar o arquivo wrapper.conf em %JBOSS_HOME%\server\YOURCONFIG\wrapper com o seguinte conteúdo. Edite e/ou comente o que for necessário.
wrapper.java.command=D:/Java/jdk1.5.0_14/bin/java

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp

wrapper.java.classpath.1=%JBOSS_HOME%/lib/wrapper.jar
wrapper.java.classpath.2=%JAVA_HOME%/bin/java/lib/tools.jar
wrapper.java.classpath.3=./run.jar

wrapper.java.library.path.1=%JBOSS_HOME%/lib

# these are the JAVA_OPTS
wrapper.java.additional.1=-server
# enviroment variables - define the ones that match your desired environment
wrapper.java.additional.2=-Denviromnment.variable=value
# memory parameters - define the ones that match your desired environment
wrapper.java.additional.3=-Xms64m
wrapper.java.additional.4=-Xmx96m
# If you need serialization suppport
wrapper.java.additional.5=-Dsession.serialization.jboss=true

wrapper.app.parameter.1=org.jboss.Main
# Parameters to be passed to the application (Jboss)
# Define server name (configuration) - If you need a config that is different than the "default" or need to run multiple configs
wrapper.app.parameter.2=-c YOURCONFIG
# Define listening IP - If you have more than one IP or want to indicate to listen on a specific IP
wrapper.app.parameter.3=-b aaa.bbb.ccc.ddd
# wrapper log location
wrapper.logfile=%JBOSS_HOME%/server/YOURCONFIG/log/wrapper.log

# You must not change below parameters without first uninstall the service
# service name
wrapper.ntservice.name=JbossYOURCONFIG
# service display name
wrapper.ntservice.displayname=JBoss Server YOURCONFIG

  • Teste o serviço:
cd %JBOSS_HOME%\bin\
wrapper.exe -c %JBOSS_HOME%\server\YOURCONFIG\wrapper\wrapper.conf
  • Instale o serviço:
cd %JBOSS_HOME%\bin\

wrapper.exe -i %JBOSS_HOME%\server\YOURCONFIG\wrapper\wrapper.conf

  • Desinstale o serviço: 

cd %JBOSS_HOME%\bin\
wrapper.exe -r %JBOSS_HOME%\server\YOURCONFIG\wrapper\wrapper.conf
 
Aviso: Certifique-se que a variável de ambiente JBOSS_HOME está configurada corretamente. (run.bat faz isto, mas wrapper não!)