Netbeans não reconhece o JPA metamodel gerado no código fonte

Problema apresentado

Bug 218658 – Generated Sources for JPA metamodel are not recognized in source packages

Bug 178108 – IDE does not generate metamodel classes for managed JPA entities

problema-netbeans-jpa-metamodel

 

Solução

  1. Clique com o botão direito sobre o projeto e escolha “Propriedades”;
  2. No lado esquerdo selecione “Bibliotecas”;
  3. No lado direito remova as ocorrências que encontrar de “EclipseLink (JPA 2.1)” e “EclipseLink-ModelGen (JPA 2.1)” das duas abas “Compilar” e “Processador” e clique em “Ok”;
  4. Abra seu arquivo “persistence.xml” (esta é a parte mais importante, sem ela não dará certo), faça qualquer alteração (mesmo que seja um espaço no fim do arquivo, pois queremos que o Netbeans saiba que houve uma alteração neste arquivo) e salve.
  5. Repita os passos 1 e 2;
  6. No lado direito inclua na aba “Processador” primeiro a biblioteca “EclipseLink (JPA 2.1)” e depois a “EclipseLink-ModelGen (JPA 2.1)” e clique em “Ok”;
  7. Aguarde o Netbeans fazer a indexação (acompanhe a mensagem do rodapé) e tudo voltará a funcionar.

 

Explicação

  • No cache gerado adequadamente para um projeto que utiliza JPA metamodel temos:
    • ${DEFAULT_CACHEDIR_ROOT}/8.1/index/s###/java/15/classes -> *.sig, *_.sig e *.rapt
    • ${DEFAULT_CACHEDIR_ROOT}/8.1/index/s###/java/15/sources -> *_.java
  • No cache defeituoso de um projeto que utiliza JPA metamodel temos:
    • ${DEFAULT_CACHEDIR_ROOT}/8.1/index/s###/java/15/classes -> *.sig
    • ${DEFAULT_CACHEDIR_ROOT}/8.1/index/s###/java/15/sources -> empty
Unindo a solução com a explicação cheguei a conclusão de que o cache só é gerado adequadamente quando o Netbeans identifica alguma alteração no persistence.xml. Isso se dá quando o arquivo ${DEFAULT_USERDIR_ROOT}/8.1/var/filehistory/##/some-folder/some-DATA-file-thats-represents-persistence.xml-file é atualizado / alterado. Neste momento o Netbeans faz a geração adequada dos arquivos de cache eliminando o problema.

 

Como fazer o problema acontecer

Aparentemente o problema só ocorre com projetos Web.

  1. Utilize uma instalação nova do Netbeans ou exclua os diretórios de usuário e cache;
  2. Abra um projeto limpo (sem os diretórios build e dist) que utilize metamodel em seu código;
  3. Aguarde a indexação (acompanhe pelo rodapé) do Netbeans e veja o problema ocorrer.

 

Versões testadas

  • 7.1;
  • 7.3.1;
  • 8.1;
  • dev-20160729-e0576ad941f3

Prevenindo o Logjam Attack no Glassfish 3.1.2.2

Desde o update 39 do Firefox muitas pessoas passaram a receber a tela de erro abaixo quando tentam acessar endereços utilizando https.

erro-diffie-hellman-firefox-39

 

Isso se deve a uma grande falha (Logjam Attack) descoberta no método de troca de chaves chamado Diffie-Hellman. O Firefox foi o primeiro a recusar o acesso a sites com este problema e os demais como Chrome e Internet Explorer virão logo em seguida.

Para testar se seu servidor está vulnerável clique aqui, e na caixa onde diz “Teste A Server” digite o endereço de seu site e clique em Go.

 

Se o resultado for como o da imagem abaixo está tudo certo e nada precisa ser feito!

 

site-ok

 

Caso o resultado não seja positivo (barra azul) e se pareça com um dos abaixo você infelizmente terá um trabalhinho 🙁

 

site-quase-ok-2 site-quase-ok site-com-problemas

 

O primeiro passo é verificar se o Java está reconhecendo os conjuntos criptográficos que precisaremos utilizar (eles tem o prefixo TLS_ECDH). A maneira mais fácil de verificar é copiando o código abaixo e salva-lo em seu servidor com o nome de Ciphers.java

import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import javax.net.ssl.SSLServerSocketFactory;

public class Ciphers
{
 public static void main(String[] args)
 throws Exception
 {
 SSLServerSocketFactory ssf = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();

 String[] defaultCiphers = ssf.getDefaultCipherSuites();
 String[] availableCiphers = ssf.getSupportedCipherSuites();

 TreeMap ciphers = new TreeMap();

 for(int i=0; i<availableCiphers.length; ++i )
 ciphers.put(availableCiphers[i], Boolean.FALSE);

 for(int i=0; i<defaultCiphers.length; ++i )
 ciphers.put(defaultCiphers[i], Boolean.TRUE);

 System.out.println("Default\tCipher");
 for(Iterator i = ciphers.entrySet().iterator(); i.hasNext(); ) {
 Map.Entry cipher=(Map.Entry)i.next();

 if(Boolean.TRUE.equals(cipher.getValue()))
 System.out.print('*');
 else
 System.out.print(' ');

 System.out.print('\t');
 System.out.println(cipher.getKey());
 }
 }
}

Digite o comando abaixo para compilar o aplicativo que usaremos.

javac Ciphers.java

Agora digite o comando abaixo para executar o aplicativo.

java Ciphers

Neste momento será exibida uma lista com todos os conjuntos criptográficos reconhecidos pelo Java. Se aparecerem itens com o prefixo “TLS_ECDH” você está com sorte e pode ir direto para a configuração do Glassfish, caso contrário será necessário habilitar estes conjuntos criptográficos.

Os conjuntos necessários estão marcados pela zona vermelha.

conjuntos-criptograficos

 

Antes de habilitarmos os conjuntos criptográficos necessários precisamos verificar qual é o security provider que sua versão de Java está utilizando. Para isso edite o arquivo ${java.home}/lib/security/java.security.

Apenas para exemplificar, em alguns servidores que tenho este arquivo está localizado em:

/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.85.x86_64/jre/lib/security/java.security.

Dentro do arquivo procure pelo trecho abaixo:

# the NSS security provider was not enabled for this build; it can be enabled
# if NSS (libnss3) is available on the machine. The nss.cfg file may need
# editing to reflect the location of the NSS installation.
security.provider.10=sun.security.pkcs11.SunPKCS11 ${java.home}/lib/security/nss.cfg

Se a ultima linha estiver descomentada, significa que você está utilizando o NSS como security provider, caso contrário você está utilizando o JCE.

Se estiver utilizando o NSS será necessário atualiza-lo para a ultima versão através do comando (no meu caso utilizo CentOs) abaixo:

yum update nss

Caso utilize o JCE baixe o “Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 7” aqui. No meu caso utilizo o Java 7.

Extraia os dois arquivos “local_policy.jar” e “US_export_policy.jar” para a pasta ${java.home}/lib/security/ sobrescrevendo os antigos.

Legal, estamos quase -lá 🙂

Execute novamente o aplicativo que criamos com o comando abaixo para termos certeza que os conjuntos criptográficos necessários foram instalados corretamente:

java Ciphers

Agora é a hora de configurarmos o Glassfish para não permitir que ele utilize os conjuntos criptográficos vulneráveis.

Em seu painel do Glassfish Admin vá em:
1) Configurações -> server-config -> Configurações de Rede -> Listeners de Rede -> http-listener-2
2) Clique na aba SSL.
3) No primeiro item desabilite o SSL3 se estiver habilitado. Este item nem é necessário para resolver este problema, mas ele impede outra vulnerabilidade conhecida como “Poodle”.

ssl3-desativado

 

4) Deixe os conjuntos criptográficos “Conjuntos Criptográficos Diffie-Hellman Temporários Disponíveis:” apenas com estes três do lado esquerdo conforme mostra a imagem abaixo para desabilita-los.

 

conjuntos-criptograficos-desabilitados

 

Pronto, agora basta executar o teste novamente e assegurar-se que tudo deu certo!

 

Um grande abraço e até a próxima 😉

 

Referências:

The Logjam Attack

List ciphers used by JVM

Disabling the use of ephemeral DH keys in mailboxd

Logs do GlassFish 3.1 inundados com WSP5018

Durante semanas procurei respostas para o famoso (porque todos na internet perguntam como resolver, mas não encontrei em nenhum lugar a resposta) WSP5018 que inundava a muito tempo o log do meu GlassFish 3.1.

Em português:

[#|2013-12-16T21:27:17.320-0200|INFO|glassfish3.1.2|com.sun.metro.policy|_ThreadID=56;_ThreadName=Thread-2;|WSP5018: configuração de WSIT carregada do arquivo: file:/opt/glassfishv3/glassfish/domains/domain1/applications/MinhaAplicacao/WEB-INF/classes/META-INF/wsit-client.xml.|#]

Em inglês:

[#|2013-12-16T21:27:17.320-0200|INFO|glassfish3.1.2|com.sun.metro.policy|_ThreadID=56;_ThreadName=Thread-2;|WSP5018: Loaded WSIT configuration from file:/opt/glassfishv3/glassfish/domains/domain1/applications/MyApplication/WEB-INF/classes/META-INF/wsit-client.xml.|#]

Hoje fui trabalhar me sentindo sortudo e acreditem ou não realmente era meu dia de sorte 🙂 Resolvi umas 300 buchas que estavam me tirando o sono a algum tempo e então pensei “Será? Será que consigo encontrar a solução do log WSP5018?”.

Sim, consegui encontrar!

Este log aparece porque você utiliza algum tipo de webservice em sua aplicação hospedada pelo GlassFish que por sua vez utiliza o Metro para incorporar a utilização de webservices.

O arquivo de logs é inundado porque o nível de log para este módulo do Metro vem como INFO (pelo menos para mim) e o que vamos fazer é altera-lo para WARNING para recebermos apenas logs “mais importantes”.

No painel administrativo de seu GlassFish vá até “Configurações -> server-config -> Definições de Logger -> Níveis de Log”.

Clique no botão “Adicionar Logger” e na nova linha que surgirá coloque “com.sun.metro.policy” em Nome do Logger, “WARNING” em Nível de Log e depois clique em salvar.

Pronto! Imediatamente sem precisar reiniciar o GlassFish os logs pararam de ser gerados.

Um grande abraço e até a próxima saga.