sexta-feira, 2 de maio de 2014

Dividir arquivos grandes no windows ou linux

Hoje precisava alterar um arquivo .SQL de 1,2GB e não conseguia abri-lo.

Então tive que dividi-lo.

No linux é só você rodar o comando

split -b 30720k nome_do_arquivo_grande.sql

E ele vai dividir o arquivo grande em arquivos de 30MB, você pode alterar o tamanho, alterando o comando acima.

No windows, você pode usar o mesmo comando, mas para isso precisa instalar o MobaXTerm ( http://mobaxterm.mobatek.net/ )

Após instalar, é só ir até a pasta do arquivo (a unidade C fica em /mnt/c/) e rodar o comando split:

cd /mnt/c/pasta_onde_esta_o_arquivo_grande
split -b 30720k nome_do_arquivo_grande.sql

Fonte: http://www.vivaolinux.com.br/dica/Como-dividir-arquivos-grandes-(split)

Abraços!
Adriano Schmidt

Renomear arquivo com caracteres especiais no linux

Pessoal, estava apanhando aqui para um arquivo cujo nome tinha caracteres especiais: (ConfiguraçoÌes_de_Acesso).pdf

Renomeá-lo não foi fácil. Consegui essa proeza rodando comando "ls -i" que exibe uma espécie de id do arquivo:

[user@MAQUINA01 PASTA]$ ls -i
5835097 Arquivo01.sql
5835105 (ConfiguraçoÌes_de_Acesso).pdf
5835101 Log_01.txt

E com o id do arquivo usei o comando abaixo para renomeá-lo:

[user@MAQUINA01 PASTA]$ find . -inum 5835105 -exec mv {} Configuracoes_de_Acesso.pdf \;

Pronto, arquivo renomeado :)

Fonte: http://www.unix.com/tips-and-tutorials/198879-how-manage-file-names-special-characters.html

Abraços!
Adriano Schmidt

quarta-feira, 16 de abril de 2014

show_sql=true não exibe os parâmetros

Após setar o show-sql como true no meu persistence.xml no meu projeto que roda no JBoss EAP 6.2 (ou Jboss AS7, ou WildFly) as queries apareceram no log, mas o valor dos parâmetros não. Aparecia somente assim:

21:10:03,314 INFO  [stdout] (http-/0.0.0.0:8080-3) Hibernate: select exemplo0_.COL_X from EXEMPLO exemplo0_ where exemplo0_.COL_Y =?

Para fazer os valores aparecerem entrei no arquivo standalone.xml do meu JBoss e fui no subsystem logging (esse arquivo tem várias tags subsystem, uma delas tem o name logging)

Então, junto com os outros loggers adicionei o logger abaixo:

<logger category="org.hibernate.type.descriptor.sql.BasicBinder">
     <level name="TRACE"/>
</logger>

Após reiniciar o JBoss, o log ficou assim:

21:15:04,234 INFO  [stdout] (http-/0.0.0.0:8080-3) Hibernate: select exemplo0_.COL_X from EXEMPLO exemplo0_ where exemplo0_.COL_Y =?
21:15:04,234 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] (http-/0.0.0.0:8080-3) binding parameter [1] as [BIGINT] - 600

Fonte: http://stackoverflow.com/questions/9159752/how-to-get-jdbc-binding-parameters-from-hibernate-in-jboss-7

segunda-feira, 31 de março de 2014

"A melhor tecnologia é a que eu domino!"

Hoje venho divagar sobre a questão: "Devo usar a tecnologia que domino mais ou o a mais adequada ao projeto?"

Essa é uma decisão difícil e alguns fatores devem ser considerados.

Cada tecnologia tem suas vantagens e desvantagens..
JSF tem as suas.. Flex tem as suas.. HTML5 tem as suas.. PHP tem as suas..
Cada tecnologia tem situações em que ela se encaixa melhor..

Muitas empresas decidem usar tecnologias com base na experiência dos desenvolvedores, é uma decisão comum e muitas vezes assertiva... mas algumas vezes isso não se conjectura como melhor escolha e é necessário tomar outra decisão...

Uma grande empresa que trabalhei desenvolveu muitos sistemas em Flex.. e agora está reescrevendo tudo... (Não quero julgar esse caso em específico, só estou dando um exemplo).

Nesta mesma empresa iríamos desenvolver um sistema de ponto eletrônico e controle de acesso (catracas)... na época estava surgindo o JSF2.. todo mundo falou pra usar o JSF 1.2 até porque haviam outros sistemas em JSF 1.2 na equipe.. eu contrariei o que as pessoas falaram e desenvolvi em JSF 2... recebi muitas críticas por isso, mas permaneci firme porque sabia que era o mais acertado.. esses outros sistemas já existentes usavam Spring e eu coloquei EJB/JPA no projeto mesmo que ninguém na equipe conhecia isso... Usei JBoss ao invés de Tomcat... Enfim, a arquitetura mudou bastante em relação aos projetos existentes.
Seis meses depois.. todos os sistemas desenvolvidos em JSF 1.2 e Spring foram reescritos em JSF 2 e EJB...

Em outra empresa, entrei em um cliente e começamos a usar o Git ao invés de SVN.. fui muito criticado por causa disso pelos desenvolvedores que apenas conheciam SVN... e hoje está mais que provado que foi a melhor escolha...

Em um projeto novo que está começando agora e estou envolvido surgiu a discussão HTML5xJSF... Queriam utilizar JSF pois a equipe atual domina mais esta tecnologia.. Caso seja escolhido HTML5 muita gente vai criticar, no primeiro problema que alguém tiver vai reclamar e vai falar "Se fosse JSF já estaria pronto", porém, com JSF também teríamos problemas..

Entendo que no início a produtividade seja mais baixa com HTML5, porém em pouco tempo isto mudará.

Neste projeto em específico acredito que não devemos usar JSF só por que conhecemos mais, não seria a melhor escolha para esse projeto pois JSF foi criado para sistemas corporativos.. enterprise... Para um número não muito grande de usuários simultâneos. Que não é o cenário do novo projeto.

Claro que outros fatores como prazo, orçamento, se os envolvidos querem pensar a curto ou longo prazo, abertura a assumir riscos, entre outros, vão influenciar na escolha também, mas escolher a tecnologia mais adequada deve pelo menos entrar nas discussões.

Enfim, a frase "A melhor tecnologia é a que eu domino" é muito comum, porém, nem sempre funciona.

quarta-feira, 12 de março de 2014

JBoss x Tomcat

Por que usar JBoss ao invés de Tomcat?

Primeiramente é bom explicar que o Tomcat é um Web Container (contém engines para Servlet e JSP), já o JBoss é um Application Server (container para a plataforma JEE, contém um Web Container, porém tem um EJB container e outras engines).

Para aplicações simples você consegue utilizar um Web Container, para aplicações com mais tecnologias (EJB por exemplo), você até consegue usar um Web Container, porém, terá que adicionar muitas bibliotecas e configurações nele. Em um Application Server tudo é nativo.

Em 2010 por exemplo, fazia muito sentido utilizar apenas um Web Container para uma aplicação simples pois os Application Servers eram muito pesados, consumiam muitos recursos computacionais, demoravam para iniciar e eram difíceis de manter, porém os Application Servers em 2014 não tem mais estes problemas. A própria Apache, criadora do Tomcat, criou seu próprio Application Server chamado TomEE para ser usado no lugar do Tomcat. (http://tomee.apache.org/apache-tomee.html)

Os Application Servers trabalham com profiles, que define o que será carregado, o profile mais leve dos Application Servers é como um Web Container, por isso, não existe mais a necessidade de se trabalhar com Tomcat em projetos novos, a não ser que você queira manter padrão com outras aplicações da empresa ou algo assim, porém, essa decisão traria muitas outras dificuldades para o desenvolvimento e controle da infraestrutura de uma aplicação JEE.

Abraços!
Adriano Schmidt

sábado, 8 de março de 2014

Instalando JRockit no RHEL

Sempre em ambientes de produção em clientes costumo usar a JDK JRockit, ela é melhor para ambientes de missão crítica pois utiliza melhor a memória, garbage collector, entre outras coisas...

Mais detalhes em: http://www.oracle.com/technetwork/middleware/jrockit/overview/index.html

Para instalar é muito simples:

* Baixe o JRockit
http://www.oracle.com/technetwork/middleware/jrockit/downloads/index.html

* Vá até a pasta onde está o instalador (arquivo .bin) (troque o /app pelo caminho onde está o .bin que você baixou)
$ cd /app

* Dê permissão de execução para esse arquivo (coloque o nome do arquivo que você baixou)
$ sudo chmod +x jrockit-jdk1.6.0_45-R28.2.7-4.1.0-linux-x64.bin

* Execute o .bin
$ sudo ./jrockit-jdk1.6.0_45-R28.2.7-4.1.0-linux-x64.bin

* Então é só ir apertando enter, ou caso queira mudar diretório de instalação, instalar os fontes da JDK entre outras coisas é só ir escolhendo, caso contrário é só apertar enter até o final.

Caso tenha alguma dúvida sobre o "sudo", ele serve para você poder executar um comando como se você fosse o usuário root, o seu usuário deve ter permissão para poder usar o "sudo".

Enfim, é isso! : )

Abraço!!!
Adriano Schmidt

domingo, 9 de fevereiro de 2014

Criar Schema Oracle

Pessoal..

Hoje tive que fazer uma atividade simples, criar um schema no oracle, porém era necessário saber a sintaxe, saber um pouco sobre tablespaces e também dar os grants corretos.

Assim sendo, resolvi documentar aqui para caso alguém tenha que fazer algo semelhante:

Segue abaixo uma sugestão de script para criar os databases. Não esqueça de alterar nome_schemad, nome_schema, caminho_sevidor_datafiles:

CREATE TABLESPACE nome_schemad  
DATAFILE ‘caminho_servidor_datafiles\nome_schemad.DBF' SIZE 100M AUTOEXTEND ON
/

CREATE USER nome_schema IDENTIFIED BY nome_schema
DEFAULT TABLESPACE nome_schemad TEMPORARY TABLESPACE TEMP
/
grant connect, resource, create any view, create any synonym, create any table, create database link to nome_schema
/


Ou mais simples ainda usando a TABLESPACE users:

CREATE USER nome_schema IDENTIFIED BY nome_schema
DEFAULT TABLESPACE users TEMPORARY TABLESPACE TEMP
/
grant connect, resource, create any view, create any synonym, create any table, create database link to nome_schema
/

A senha é o que vem depois do IDENTIFIED BY, caso queira pode mudar.

É isso aí, abraços!!
Adriano Schmidt

sexta-feira, 7 de fevereiro de 2014

Marvel Java

Oi pessoal :)

A Marvel lançou o http://developer.marvel.com/ com uma API RESTful para você acessar imagens, histórias, dados entre outras coisas da Marvel.



Você pode usar isso em seu site, em jogos, num app pra celular, num aplicativo pra TV digital ou onde sua criatividade deixar :P

Fiz um client Java só para brincar, chamei ele de JMarvelRestClient, caso queiram executar aí é só criar um projeto java, um pacote br.com.localhost8080.test e colar a classe abaixo e alterar para usar suas próprias chaves no método mountUrlRest!!! Para obter as chaves é só se cadastrar lá no http://developer.marvel.com/

Nessa classe tem o client Rest e tem um método para converter uma string para MD5 para a autenticação.

A saída da execução desta classe está lá no final deste artigo. Até lá :P

package br.com.localhost8080.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Date;

/**
 * Java Client for the Marvel Rest API
 */
public class JMarvelRestClient {

 /**
  * Call a Rest from Marvel just for test
  */
 public static void main(String[] args) {
  HttpURLConnection conn = null;
  try {
   URL url = new URL(JMarvelRestClient.mountRestUrl());

   conn = (HttpURLConnection) url.openConnection();
   conn.setRequestMethod("GET");
   conn.setRequestProperty("Accept", "application/json");

   if (conn.getResponseCode() != 200) {
    throw new RuntimeException("Failed: HTTP error code: " + conn.getResponseCode());
   }

   BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));

   String output = null;
   String retornoRest = "";
   while ((output = br.readLine()) != null) {
    retornoRest += output;
   }
   System.out.println("\nRest Return: " + retornoRest);

   JMarvelRestClient.mountImageUrl(retornoRest);
  } catch (MalformedURLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   conn.disconnect();
  }

 }

 /**
  * Mount the URL with keys and hash
  */
 private static String mountRestUrl() {
  Long timeStamp = new Date().getTime();
  String privateKey = "PUT_HERE_YOUR_PRIVATE_KEY";
  String apikey = "PUT_HERE_YOUR_PUBLIC_KEY";
  String hash = JMarvelRestClient.generateHash(timeStamp + privateKey + apikey);

  String urlCompleta = "http://gateway.marvel.com/v1/public/comics/12?ts=" + timeStamp + "&apikey=" + apikey + "&hash=" + hash;

  System.out.println("Rest URL: " + urlCompleta);

  return urlCompleta;
 }

 /**
  * Makes a magic that transforms your string in MD5 hash
  */
 private static String generateHash(String string) {
  MessageDigest md = null;
  try {
   md = MessageDigest.getInstance("MD5");
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
  }
  md.update(string.getBytes());
  byte[] bytes = md.digest();

  StringBuilder s = new StringBuilder();
  for (int i = 0; i < bytes.length; i++) {
   int parteAlta = ((bytes[i] >> 4) & 0xf) << 4;
   int parteBaixa = bytes[i] & 0xf;
   if (parteAlta == 0) {
    s.append('0');
   }
   s.append(Integer.toHexString(parteAlta | parteBaixa));
  }
  return s.toString();
 }

 /**
  * Master workaround to get a JSON attribute, you must do this correctly, I did this because it is more funny :)
  */
 private static void mountImageUrl(String total) {
  int inicio = total.lastIndexOf("\"thumbnail\":{\"path\":\"");
  int fim = total.indexOf("\",\"extension\":\"");
  String ss = total.substring(inicio, fim).substring(21) + "/portrait_xlarge.jpg";

  System.out.println("\nUse this URL to see the image returned by Rest: " + ss);
 }

}
Oi de novo :) Aqui está a saída desse meu código. Usei um [...] pra ficar um pouco menor.
Rest URL: http://gateway.marvel.com/v1/public/comics/12?ts=1391742038152&apikey=0458f299a5570e88176c0cd08be6a592&hash=37d71302dc8fcbb7a67fab5c25dadc71

Rest Return: {"code":200,"status":"Ok","etag":"e41c5cc5be95cd99d46ec56146f1051099c9abb5","data":{"offset":0,"limit":20,"total":1,"count":1,"results":[{"id":12,"digitalId":4089,"title":"Ultimate Spider-Man (2000) #68","issueNumber":68,"variantDescription":"","description":"SUPERSTARS PART 3 Johnny Storm still doesn't have a high school
[...]
Torch","type":"interiorStory"}],"returned":2},"events":{"available":0,"collectionURI":"http://gateway.marvel.com/v1/public/comics/12/events","items":[],"returned":0}}]}}

Use this URL to see the image returned by Rest: http://i.annihil.us/u/prod/marvel/i/mg/f/90/4bc6b6e773bde/portrait_xlarge.jpg
Pelo Rest recebemos uma URL de uma imagem (mais detalhes em http://developer.marvel.com/documentation/images)

Bom, é isso, qualquer dúvida posta aí que tentarei ajudar!

Fontes:
http://www.mkyong.com/webservices/jax-rs/restfull-java-client-with-java-net-url/
http://codare.net/2007/02/02/java-gerando-codigos-hash-md5-sha/

Abraços!
Adriano Schmidt

quinta-feira, 6 de fevereiro de 2014

There is a process already using the admin port 4848

Pessoal, hoje ao startar o GlassFish no linux (RHEL) tive o seguinte erro:

There is a process already using the admin port 4848 -- it probably is another instance of a GlassFish server


E não tinha outro GlassFish na máquina... então verifiquei o iptables (sudo iptables -L) e tava vazio, dei até um (sudo iptables -F)
para limpar tudo por segurança..

Verifiquei o selinux, mas tava desabilitado também...

Para resolver abri o arquivo /etc/hosts (vi /etc/hosts) e adicionei após a primeira linha:

127.0.0.1 NOMEDAMAQUINA

E resolveu meu problema, GlassFish iniciou certinho!

Para saber o nome da máquina é só usar o comando hostname (hostname)

Fonte: http://www.devmedia.com.br/forum/erro-ao-iniciar-o-glassfish-3-no-ubuntu-server-9-04/134959

Abraço pessoal!!!
Adriano Schmidt

sexta-feira, 31 de janeiro de 2014

JBoss JAAS LDAP Tutorial

Pessoal.. tive que configurar um ambiente JBoss EAP6/AS7 + JAAS + LDAP/AD e apanhei bastante pra conseguir, então resolvi fazer um artigo aqui no blog em formato de tutorial pra documentar o passo-a-passo e ajudar quem tiver que fazer o mesmo.

Primeiro eu segui um tutorial e não deu certo: http://middlewaremagic.com/jboss/?p=378

Não sei o motivo ainda, mas não foi de jeito nenhum.

Depois segui o tutorial do Mauricio Magnani e deu tudo certo! http://jbossdivers.wordpress.com/2012/02/12/utilizando-ldap-login-module-no-jboss-as-7-1/

No tutorial do Mauricio ele usou o openldap no linux, eu utilizei o Apache Directory Studio no Windows (tem pra linux e mac também) para criar meu servidor de LDAP/AD. Esse software é baseado no eclipse e falicita muito o trabalho com LDAP/AD, permite criar servidores, criar usuários, adicionar atributos, tudo pela interface gráfica. É lindo : ) Muito fácil de usar!

Na sua empresa/cliente talvez você já tenha um servidor de LDAP/AD, então você teria que usar ele, mas sugiro criar o server na sua máquina para testar, e depois que estiver tudo funcionando, é só apontar para o LDAP/AD da sua empresa/cliente.

* Instale o Apache Directory Studio
Baixe o Apache Directory Studio, instale, e inicie ele.
http://directory.apache.org/studio/downloads.html

* Crie Server LDAP local
Entre na aba "LDAP Servers" (Caso ela não aparece: Window > Show View > LDAP Servers)
Botão direito > New > New Server
Escolha "ApacheDS 2.0.0
Clique em "Finish"
Inicie o servidor

* Conecte-se no server criado
Entre na aba "Connections"
Botão direito > New Connection
Em "Connection Name" coloque "localhost"
Em "Hostname" coloque "localhost"
Em "Port" coloque "10389"
Clique em next
Em "Bind DN ou user" coloque "uid=admin,ou=system"
Em "Bind password" coloque "secret"
Clique em "Check Authentication", tem que funcionar : )
Clique em "Finish"

*Crie um usuário
Entre na aba "LDAP Browser"
DIT > Root DSE > ou=system" > ou=users
Botão direito em "ou=users" > New > New Entry
Clique em "Create entry from strach"
Clique em "Next"
Em "Available object classes" escolha "inetOrgPerson"
Clique em "Next"
Em "RDN", no primeiro campo, coloque "uid"
Em "RDN", no segundo campo, coloque "user1"
Clique em "Next"
Em "cn" coloque "user1"
Em "sn" coloque "user1"
Botão direito > New Attribute
Em "Attribute type" coloque "userPassword"
Clique em "Finish"
Em "Enter New Password" coloque "secret"
Clique em "OK"
Clique em "Finish"

* Crie uma role
Entre na aba "LDAP Browser"
DIT > Root DSE > ou=system" > ou=groups
Botão direito em "ou=groups" > New > New Entry
Clique em "Create entry from strach"
Clique em "Next"
Em "Available object classes" escolha "groupOfNames"
Clique em "Next"
Em "RDN", no primeiro campo, coloque "cn"
Em "RDN", no segundo campo, coloque "General"
Clique em "Next"
No campo que vai aparecer coloque "uid=user1,ou=users,ou=system"
Clique em "OK"
Clique em "Finish"



* Instale o JBoss AS 7.1.1 ou o JBoss EAP 6.2 (Testei nestas duas versões e funcionou, nas demais versão do AS7 e EAP6 deve funcionar também)
Basta baixar o zip e descompactar
A JDK precisa estar configurada no JAVA_HOME e isso precisa estar no PATH
Rode o standalone.bat ou o standalone.sh do JBoss para verificar se está funcionando.

* Configure o standalone.xml
No subsystem de security adicione as seguintes linhas dentro da tag <security-domains>

<security-domain name="ldap_security_domain">
    <authentication>
        <login-module code="LdapExtended" flag="required">
            <!-- Nao alterar -->
            <module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>

            <!-- Deve ser colocado o IP e porta do LDAP -->
            <module-option name="java.naming.provider.url" value="ldap://localhost:10389"/>

            <!-- Nao alterar -->
            <module-option name="java.naming.security.authentication" value="simple"/>

            <!-- Deve ser colocado o usuário admin e senha -->
            <module-option name="bindDN" value="uid=admin,ou=system"/>
            <module-option name="bindCredential" value="secret"/>

            <!-- Deve ser colocado o diretorio onde estarao os usuarios -->
            <module-option name="baseCtxDN" value="ou=system"/>

            <!-- Deve ser colocado o atributo que representa o login do usuario -->
            <module-option name="baseFilter" value="(uid={0})"/>

            <!-- Deve ser colocado o diretorio onde estara o grupo com todos os usuarios -->
            <module-option name="rolesCtxDN" value="ou=groups,ou=system"/>

            <!-- Deve ser colocado o atributo do grupo que indica quais usuarios pertencem ao grupo -->
            <module-option name="roleFilter" value="(member={1})"/>

            <!-- Nao alterar -->
            <module-option name="roleAttributeID" value="cn"/>
            <module-option name="roleRecursion" value="-1"/>
            <module-option name="throwValidateError" value="true"/>
            <module-option name="searchScope" value="ONELEVEL_SCOPE"/>
        </login-module>
    </authentication>
</security-domain>


No subsystem de logging adicione as seguintes linhas junto com os demais loggers:

<logger category="org.jboss.security">
  <level name="TRACE"/>
</logger>

Isso serve para sair mais logs no server.log para ajudar a identificar problemas, depois que estiver tudo funcionando, altere de TRACE para WARN.

* Configure o seu projeto
No seu projeto em src/main/webapp/WEB-INF crie um arquivo chamado jboss-web.xml com o seguinte conteúdo:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
    <security-domain>java:/jaas/ldap_security_domain</security-domain>
</jboss-web>


No seu projeto em src/main/webapp/WEB-INF crie um arquivo chamado web.xml com o seguinte conteúdo:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 <display-name>NomeDoProjeto</display-name>

 <!-- JSF -->
 <servlet>
  <servlet-name>Faces Servlet</servlet-name>
  <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>Faces Servlet</servlet-name>
  <url-pattern>*.jsf</url-pattern>
 </servlet-mapping>
 <welcome-file-list>
  <welcome-file>index.jsf</welcome-file>
 </welcome-file-list>

 <!-- Security -->
 <!-- Aqui voce mexe para dar permissoes para diferentes pastas para roles diferentes -->
 <!-- Nesse exemplo eu permito que apenas usuario da role "General" possam acessar /protected/* -->
 <security-constraint>
  <web-resource-collection>
   <web-resource-name>Protected</web-resource-name>
   <url-pattern>/protected/*</url-pattern>
   <http-method>GET</http-method>
   <http-method>POST</http-method>
  </web-resource-collection>
  <auth-constraint>
   <role-name>General</role-name>
  </auth-constraint>
 </security-constraint>

 <login-config>
  <auth-method>FORM</auth-method>
  <realm-name>LDAP</realm-name>
  <form-login-config>
   <form-login-page>/Login.jsf</form-login-page>
   <form-error-page>/Login.jsf?invalidLogin=true</form-error-page>
  </form-login-config>
 </login-config>

 <security-role>
  <role-name>General</role-name>
 </security-role>

</web-app>


No seu projeto em src/main/webapp crie um arquivo chamado index.xhtml com o seguinte conteúdo:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">

 <h:body>
  <h:outputText value="Ola mundo" />
 </h:body>
</html>


No seu projeto em src/main/webapp crie um arquivo chamado Login.xhtml com o seguinte conteúdo:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">

<h:body>
 <form id="formLogin" action="j_security_check" method="post">

  <h:outputText value="LOGIN"/>

  <br/><br/>

  <h:panelGroup rendered="#{param['invalidLogin'] == 'true'}">
   <h:outputText value="Por favor utilize credenciais autorizadas." />
   <br/><br/>
  </h:panelGroup>

  <h:outputText value="Usuario: "/>
  <h:inputText id="j_username" required="true" />

  <br/><br/>
  
  <h:outputText value="Senha: "/>
  <h:inputSecret id="j_password" feedback="false" required="true"/>

  <br/><br/>

  <h:commandButton id="access_button" type="submit" value="Entrar"/>
 </form>
</h:body>
</html>


No seu projeto em src/main/webapp crie uma pasta chamada protected.
No seu projeto em src/main/webapp/protected crie um arquivo chamado ProtectedFile.xhtml com o seguinte conteúdo:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">

 <h:body>
  <h:outputText value="Arquivo protegido." />
 </h:body>
</html>

* Teste
Reinicie o JBoss e faça deploy da sua aplicação.

Acesse http://localhost:8080/nomeDoProjeto/index.jsf e você vai conseguir acessar normalmente.
Acesse http://localhost:8080/nomeDoProjeto/protected/ProtectedFile.jsf e você vai ser redirecionado para a tela Login.jsf
Entre com o usuário user1 com a senha secret e você vai ser direcionado para tela ProtectedFile.jsf


Pronto :D
Funciona que é uma beleza!!
E mais uma vez quero agradecer ao Mauricio Magnani pelo seu blog http://jbossdivers.wordpress.com/ que me ajudou nessa atividade.

Abraços!!
Adriano Schmidt