30 de agosto de 2007

Vaga na Senior Solution

Agradeço a abertura para divulgação de nossas das vagas e aproveito para lhe encaminhar o perfil que estamos procurando; caso tenha indicações, serão muito bem vindas.

Cargo

Analistas de Desenvolvimento Java PL ou SR

Empresa

Instituição Financeira

Local

São Paulo - SP

Prazo e modalidade de contratação

Indeterminado / PJ

Experiência

No mínimo 3 anos

Requisitos

Linguagens e Tecnologias: Domínio em JAVA (J2EE, TomCat, JBoss, JSP, Servlet, Struts, Spring, Hibernate, Ant, Eclipse, JSTL, Velocity, Xdoclet, Junit).
Bancos de Dados e Metodologias: Sybase, MS SQL Server;
Plataformas: Windows
Desejável: Certificação SUN, foramação superior

Diferencial: Conhecimento em Mercado Financeiro

Caso tenham indicações nos perfis citados, peço que encaminhem para o seguinte e-mail : natalia.ventura@seniorsolution.com.br com o Título: "JAVA "

Enquete: Qual Framework você gosta mais?

Bom essa enquete foi maior que a primeira, teve 87 votos.
Em primeiro lugar ficou JSF com 36%, em segundo lugar por incrível que pareça ficou com Struts 1.X, em terceiro lugar ficou Mentawaii, em quarto colocado outros frameworks, a quinta posição com Struts 2 e a sexta com VRaptor, por incrível que pareça, WebWork não teve votos, particularmente não conheço, será que é tão ruim assim para nenhuma das 87 pessoas gostar dele? rs
Bom vamos para mais enquetes aqui no Java Anywhere.

27 de agosto de 2007

JUST JAVA 2007

Pessoal só pra lembrar a JustJava está chegando e vai ser um evento muito rico em informações e aprendizado. Quem puder ir não pense 2 x, faça a inscrição (descontos especiais para universitários) http://www.sucesusp.org.br/eventos2007/justjava07/. Nós do Java Anywhere estaremos lá presenciando esse maravilhoso evento e fazendo uma matéria completa dos 3 dias para vocês.Um de nossos membros Eduardo Bregaida, estará ministrando a palestra de produtividade com JavaServer Faces.Conto com a presença de todos Javeiros. Prepare seu notebook e sua mochila e vamos nessa. Um grande abraço e fiquem com Deus!

The Developer's Conference 2007

A Globalcode está lançando uma nova conferência totamente focada em Java Enterprise Edition que acontecerá nos dias 14 e 15 de setembro e o SouJava também está apoiando mais esse evento este ano.
Com palestras diferenciadas preparadas por nosso núcleo técnico você poderá se atualizar com o que há de melhor para o desenvolvimento Web e não Web.
A grade foi organizada para compor uma sequencia ideal de assuntos sobre Java EE: UML, design patterns, ferramentas, persistência, EJB, user-interface, JSF, AJAX, integração, segurança e futuro.
Convidado Especial: Ed Burns, um dos maiores especialistas em JavaServer Faces e Ajax do mundo. Engenheiro da Sun dos Estados Unidos, líder da especificação JavaServer Faces no JCP.
http://www.thedevelopersconference.com.br/

23 de agosto de 2007

HiberObjects: Plugin do Eclipse para JPA

HiberObjects é um plugin para o Eclipse que permite criar as classes para persistência de dados usando a implementação do Hibernate para a Java Persistence API. Essas classes modelam-se visualmente e o plugin se encarrega de gerar as classes e os arquivos de configurações necessários. Também permite gerar as classes de testes (test units) com JUnit de forma automática.

Fonte: PortalJava

21 de agosto de 2007

Tutorial Facelets

Olá a todos, este é o primeiro tutorial que aborda o assunto de Facelets aqui no JavaWora. Acredito que todos que gostam de Java Server Faces estão super acostumados com a tecnologia, mas aqueles que usavam Struts e html puro, uma vez no mundo do JSF, uma das principais dificuldades (contornáveis é claro) era compreender a lógica das tags que de certa forma se distância do HTML convencional, o que eu até discordo em partes, afinal acho que um <html:text/> não se aproxima tanto de <input type=”text”/>, mas tudo bem, sabemos que da mesma forma aprender Struts não é uma tarefa das mais fáceis. Enfim vamos ao que interessa.

Um dos pontos que mais desagrada empresas que vão utilizar JSF é a distância do HTML convencional, portanto uma dificuldade de que designers possam efetuar atualizações, manutenções e coisas do gênero em uma página, pois bem, para “simplificar” toda essa dificuldade, foi desenvolvido uma tecnologia chamada de Facelets, aqueles que já viram o Tapestry verão muitas semelhanças, apontada como uma das inspiradoras para o Facelets.
No Tapestry utilizávamos a palavra chave jwcid (Java Web Component Id), para que o Framework substituísse aquele conteúdo por um componente desejado, e eis que apresento a palavra mágica do Facelets: jsfc (Java Server Faces Component). Não se engane isso não é uma cópia descarada, mas uma inspiração do primo de JSF, mas qual a mágica de tal palavrinha no caso de Facelets?O que ganhamos com isso?

Imagine o seguinte, você recebe a pagina HTML do designer, e você tem que alterar tudo aquilo, porque é tudo diferente do que você usa. Seus problemas acabaram! Basta você por uma palavrinha mágica em componentes, por exemplo:

<input type=”text”/>
Adicione:

<input type=”text” jsfc=”h:inputText” value=”#{cadastro.nome}”/>

Mágico, não acham? Um reaproveitamento de código maravilhoso e louvável. Outro ponto que nos interessa em reaproveitamento é a criação de um template, tiles é um bom framework mas deixa a desejar em alguns pontos. Com Facelets podemos definir um template declarativamente, de forma que a página sabe em qual template está inserida, reduzindo o esforço para descobrir seus componentes.
Para criar um template apenas devemos assinar os componentes da página por meio de <ui:insert name="menu"> dentre as tags do facelets, caso queiramos inserir o conteúdo de um html naquele tag na página que define o template, utilizamos então: <ui:include src="/templates/menu.xhtml"/>. No momento em que vamos utilizar um determinado template numa página, basta declará-lo: <ui:composition template="/templates/common.xhtml">, e inserir o que estmos sobrescrevendo por meio de <ui:define name="body">conteúdo</ui:define> no espaço delimitado pelas tags em conteúdo. Mais uma vez, simples, muito simples. O Facelets ainda possui componentização, Ájax integrado, dentre outras funcionalidades, mas vamos nos focar no core aqui, que é templates e reaproveitamento de html original.
O suporte de IDES ao Facelets ainda é fraco, o NetBeans possui um suporte, já no universo eclipse, temos o Exadel e agora o novíssimo Red Hat Developer Studio, os melhores na minha opinião. O exemplo deste tutorial foi desenvolvido com a implementação da Sun e no tomcat 5.5, no tomcat 6 algumas mudanças são necessárias. Os jars necessários são:

  • common-annotations.jar
  • commons-beanutils.jar
  • commons-collections.jar
  • commons-digester.jar
  • commons-logging.jar
  • el-api.jar
  • el-ri.jar
  • jsf-api.jar
  • jsf-facelets.jar
  • jsf-impl.jar
  • jsf-tlds.jar
  • jstl.jar
  • standard.jar





O web-xml necessário está na Figura 1. Criaremos três Classes para nossa lógica, são elas:

Listagem 1 – Login.java

package br.com.facelets.bean;
public class Login {
private String userName;
private String senha;
public Login() {
}
//sets e gets omitidos
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + ((senha == null) ? 0 : senha.hashCode());
result = PRIME * result + ((userName == null) ? 0 : userName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Login other = (Login) obj;
if (senha == null) {
if (other.senha != null)
return false;
} else if (!senha.equals(other.senha))
return false;
if (userName == null) {
if (other.userName != null)
return false;
} else if (!userName.equals(other.userName))
return false;
return true;
}
}



Listagem 2 – Cadastro.java

package br.com.facelets.bean;
import javax.faces.context.FacesContext;
import br.com.facelets.business.CadastroSaver;
public class Cadastro {
private String nome;
private String senha;
private String userName;
public String getLogin() {
return userName;
}
public void setLogin(String login) {
this.userName = login;
}
//sets e gets omitidos
public String salvar(){
Login login = new Login();
login.setUserName(userName);
login.setSenha(senha);
CadastroSaver.salvar(login, this);
return "ok";
}
public String logar(){
Login login = new Login();
login.setUserName(userName);
login.setSenha(senha);
Cadastro cadastro = CadastroSaver.busca(login);
if(cadastro!=null){
FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().put("user", cadastro);
return "ok";
}else{
FacesContext.getCurrentInstance().getExternalContext()
.getRequestMap().put("erro", "login/senha inválidos");
return "erro";
}
}
}



Listagem 3 – CadastroSaver.java

package br.com.facelets.business;
import java.util.Hashtable;
import br.com.facelets.bean.Cadastro;
import br.com.facelets.bean.Login;
public class CadastroSaver {
private static final Hashtable saver = new Hashtable();
public static void salvar(Login login,Cadastro cadastro){
saver.put(login, cadastro);
}
public static Cadastro busca(Login login){
return saver.get(login);
}
}


E agora o faces-config e as páginas propriamente ditas.
Listagem 4- faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org/2001/XInclude"
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-facesconfig_1_2.xsd">
<managed-bean>
<managed-bean-name>cadastro</managed-bean-name>
<managed-bean-class>br.com.facelets.bean.Cadastro</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>nome</property-name>
<property-class>java.lang.String</property-class>
<value/>
</managed-property>
<managed-property>
<property-name>login</property-name>
<property-class>java.lang.String</property-class>
<value/>
</managed-property>
</managed-bean>
<navigation-rule>
<from-view-id>/pages/dados.xhtml</from-view-id>
<navigation-case>
<from-outcome>ok</from-outcome>
<to-view-id>/pages/inputname.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/pages/login.xhtml</from-view-id>
<navigation-case>
<from-outcome>ok</from-outcome>
<to-view-id>/pages/greeting.xhtml</to-view-id>
<redirect/>
</navigation-case>
<navigation-case>
<from-outcome>erro</from-outcome>
<to-view-id>/pages/login.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<application>
<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
<resource-bundle>
<base-name>resources</base-name>
<var>msg</var>
</resource-bundle>
<message-bundle>resources</message-bundle>
</application>
</faces-config>





Listagem 5 – menu.xhtml

<!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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<body bgcolor="#ffffff">
<table style="border:1px solid #CAD6E0" align="center" cellpadding="0" cellspacing="0" border="0">
<tbody>
<tr>
<td colspan="2" valign="bottom" height="1" bgcolor="#CAD6E0">
<table>
<tr>
<td>
<a href="dados.jsf">Incluir dados</a>
</td>
</tr>
<tr>
<td>
<a href="login.jsf">Login</a>
</td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
</body>
</html>



Listagem 6 – common.xhtml

<!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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<span jsfc="f:loadBundle" basename="resources" var="msg"/>
<head>
<title>
<ui:insert name="pageTitle">JavaWora</ui:insert>
</title>
<style type="text/css">
body {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 14px;
}
.header {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 18px;
}
.bottom {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 9px;
text-align: center;
vertical-align: middle;
color: #8E969D;
}
</style>
</head>
<body bgcolor="#ffffff">
<table style="border:1px solid #CAD6E0" align="center" cellpadding="0" cellspacing="0" border="0" width="400">
<tbody>
<tr>
<td class="header" align="center" valign="middle" width="100%" bgcolor="#E4EBEB">
<ui:insert name="pageHeader">JavaWora Facelets</ui:insert>
</td>
</tr>
<tr>
<td height="1" width="100%" bgcolor="#CAD6E0"></td>
</tr>
<tr>
<td width="100%">
<table width="100%" style="height:150px" align="left" cellpadding="0"
cellspacing="0" border="0">
<tbody>
<tr>
<td align="center" width="10%" valign="middle">
<ui:insert name="menu">
<ui:include src="/templates/menu.xhtml"/>
</ui:insert>
</td>
<td align="center" width="75%" valign="middle">
<ui:insert name="body">Page Body</ui:insert>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td colspan="2" valign="bottom" height="1" width="100%" bgcolor="#CAD6E0"></td>
</tr>
</tbody>
</table>
</body>
</html>



Listagem 7 – cadastro.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
template="/templates/common.xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Cadastro</title>
</head>
<ui:define name="body">
<form jsfc="h:form" id="cadastro">
<table>
<tr>
<td>Nome*:</td>
<td>
<input type="text" jsfc="h:inputText" value="#{cadastro.nome}" id="nome" label="#{msg.lbl.nome}" required="true" requiredMessage="#{msg.erroRequired}"/>
</td>
<td><h:message for="nome" id="erroNome"></h:message> </td>
</tr>
<tr>
<td>login*:</td>
<td>
<input type="text" jsfc="h:inputText" value="#{cadastro.login}" id="login" label="#{msg.lbl.login}" required="true" requiredMessage="#{msg.erroRequired}"/>
</td>
<td><h:message for="login" id="erroLogin"></h:message> </td>
</tr>
<tr>
<td>senha*:</td>
<td>
<input type="text" jsfc="h:inputSecret" value="#{cadastro.senha}" id="senha" label="${msg.lbl.senha}" required="true" requiredMessage="#{msg.erroRequired}"/>
</td>
<td><h:message for="senha" id="erroSenha"></h:message> </td>
</tr>
<tr>
<td>Estado Civil:</td>
<td>
<select jsfc="h:selectOneMenu" value="#{cadastro.idEstado}" id="eCivil" label="#{msg.lbl.estadoCivil}">
<option jsfc="f:selectItem" itemValue="1" itemLabel="Casado"></option>
<option jsfc="f:selectItem" itemValue="2" itemLabel="Solteiro"></option>
<option jsfc="f:selectItem" itemValue="3" itemLabel="Divorciado"></option>
</select>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="Salvar" jsfc="h:commandButton" action="#{cadastro.salvar}"/>
</td>
</tr>
</table>
</form>
</ui:define>
</ui:composition>



Listagem 8 – inputname.xhtml

<!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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jstl/core">
<ui:composition template="/templates/common.xhtml">
<ui:define name="pageTitle">
Bem Vindo
</ui:define>
<ui:define name="pageHeader">
Home
</ui:define>
<ui:define name="body">
${msg.prompt}
</ui:define>
</ui:composition>
</html>



Listagem 9 – greeting.xhtml

<!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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<f:loadBundle basename="resources" var="msg" />
<ui:composition template="/templates/common.xhtml">
<ui:define name="body">
#{msg.greeting} <span jsfc="h:outputLabel" value="#{sessionScope.user.nome}"/>!
</ui:define>
</ui:composition>
</html>



Listagem 10 – login.xhtml



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
template="/templates/common.xhtml">
<ui:define name="body">
#{erro}
<form jsfc="h:form" id="login">
<table>
<tr>
<td>Login:</td><td><input jsfc="h:inputText" value="#{cadastro.login}" type="text"/></td>
</tr>
<tr>
<td>Senha:</td><td><input jsfc="h:inputSecret" value="#{cadastro.senha}" type="password"/></td>
</tr>
<tr>
<td colspan="2" align="center">
<input jsfc="h:commandButton" action="#{cadastro.logar}" type="submit" value="OK"/>
</td>
</tr>
</table>
</form>
</ui:define>
</ui:composition>



Experimente abrir a pagina de login no firefox, ie, ou qualquer ferramenta WYSIWYG (acho q é isso) e veja que os parametros estão lá, até a pagina, mas como isso é possível? Ora como eu disse trata-se de uma página simples xhml, a propósito podemos trabalhar com xhtml diretamente em facelets, ou mesmo jsps, mas xhtml é mais legal. A aplicação consiste em efetuar um cadastro e logo após um login para verificar se os dados foram armazenados.
Agora vamos as curiosidades. Conforme observado no web.xml, há dois listeners registrados, eles são necessários para o Tomcat 5.5, pois o compilador utilizado no facelets não é o Jasper que vêm nele, mas um próprio.
No web.xml observe a sentença:


<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>true</param-value>
</context-param>

Cause um erro em uma página e observe o que ocorre, figura 2:






O compilador descreve o erro e lhe auxilia com a arvores de componentes gerada e os dados do que estavam presentes. Legal né! Pois agora troque a sentença para false. Você verá que o erro agora é apresentado como na figura 3. Bonito não?!







Obrigado e até mais!

Projeto Lumpa



O Lumpa é um sistema de relacionamento semelhante ao Orkut ou o Via6, o que o torna diferente é que é um sistema 100% profissional.
Um sistema que você cadastra seu currículo, e adiciona pessoas, as pessoas podem recomendar você.
Foi criado pelo pessoal da Caelum, tem uma idéia bem legal, ainda está na versão beta, está com alguns bugs, mas muitas pessoas e empresas estão cadastrados.
Vale a pena dar uma conferida.

Site de Empregos Grátis

O projeto WayJobs é um site para anúncio de vagas e CVs de TI 100% gratuíto.
Muito bom para se cadastrarem.

Desenvolvido por um programador que participa do GUJ vale a pena ser visitado.

Vaga na BR Express

A empresa BR express está contratando DESENVOLVEDORES JAVA em todos os níveis: estagiários, recém-formados e com experiência.
A empresa A BR express é uma empresa de desenvolvimento de software altamente inovadora, líder em seu segmento no Brasil, e possui escritórios em São Carlos e São Paulo.

Requisitos
========
– Conhecimento de pelo menos uma linguagem de programação orientada a objeto;
– Conhecimento em desenvolvimento de software para internet .

Desejável (não obrigatório)
====================
– Experiência com projetos em Java para a internet;
–Certificação emitida pela Sun Microsystems .

Benefícios
=======
– Horário flexível
- Contratação imediata
– Plano de Carreira
– Remuneração acima da média de mercado

Os estudantes que se interessarem pelas oportunidades deverão enviar curriculum-vitae para rh@brexpress.com.br até 30/08/2007.

20 de agosto de 2007

5 anos de GUJ - Grupo de Usuários Java




Este mês o GUJ - Grupo de Usuários Java, o maior fórum em português de Java completará 5 anos de existência, participo do GUJ desde o dia 13/11/2003 e é com muito carinho que vejo aquele fórum crescendo cada dia mais.
Os membros do Java Anywhere também são membros do GUJ ajudando pessoas e também tirando dúvidas.

Hoje o GUJ conta com 350 mil mensagens e quase 30 mil usuários.

Nós do Java
Anywhere esperamos que o GUJ continue crescendo e ampliando sua rica fonte de conhecimento.

O GUJ sofreu algumas alterações entre o JForum 1 e 2, atualmente sofrerá outra que tornará possível o uso do Hibernate, VRaptor, JSP e Lucene. Também um novo sistema de gerenciamento de artigos.

O tópico do aniversário do GUJ pode ser encontrado aqui.

Desejamos um feliz aniversário para o GUJ e muito mais usuários para os próximos anos.

16 de agosto de 2007

Oportunidade - Estágio

A WBA Informática Ltda. -- conceituada no segmento de factoring -- está contratando desenvolvedores Delphi. Há também oportunidade para estágio na área de TI para atuar em suporte à família Windows.Para desenvolvedores delphi encaminhar e-mail com o curriculum para alex@wba.com.br. Para estágio enviar curriculum para paledzki@wba.com.br .

Vagas de emprego na Computeasy

Oportunidade Profissional
A empresa Computeasy está oferecendo as seguintes oportunidades profissionais:
Técnico de Cabeamento=================Para trabalhar Externo – Masculino – Ensino Médio Completo. Com experiência em elétrica baixa tensão, cabeamento estruturado, experiência em manuseio de ramais PABX, fibras ópticas.
Auxiliar Técnico de Cabeamento======================Para trabalhar Externo – Masculino – Ensino Médio. Com experiência em elétrica baixa tensão, conhecimento em cabeamento estruturado, manuseio de ramais PABX e fibras ópticas.
Analista de Sistemas================Profissional com experiência em Programação VB e/ ou Delphi. Experiência em querys de SQL e implantação de sistemas. Desejável conhecimento em Folha de Pagamento, sistema ERP. Para trabalhar no interior de São Paulo e outros estados.
Os estudantes interessados devem enviar currículo para:
smadruga@computeasy.com.br e arianne.vieira@computeasy.com.br
Colocar no título o nome da vaga.

15 de agosto de 2007

Tata Consultancy Services - Empregos

A TCS do Brasil está abrindo 334 Vagas na área de desenvolvimento no qual poderão ser vistas aqui.

Cadastre seu Currículo no site da Tata Consultancy Services.

Quando EJB é apropriado.

Estava lendo um artigo no site www.theserverside.com e achei bem interessante um artigo explicava quando usar EJB e alguns benefícios comparado a utilização de classes Java.

Em resumo:

* EJB é bom se utilizar quando você quer uma aplicação totalmente distribuída.
* Há um grande proveito dos serviços oferecido pelos middlewares como: pool, transações, segurança, persistência gerenciada pelo container, cache entre outros.
* Utilizar o mesmo EJB em diferentes sistemas através do reuso, chamando remotamente.
* Se você precisa da proteção da sua lógica de negócios você pode fazer o deploy do seu web-server e do seu aplication server em máquinas separadas e colocar um firewall no meio.

Maiores informações você pode encontrar no link citado acima, vale a penas ler, pois, citei algumas coisas e tem também o porque de não usar no artigo.

[]'s

Vagas para Programadores

Bom dia a todos, estou com 3 oportunidades em Santo André para trabalhar em uma empresa grande, mas, não é com Java.

Requisitos: Saber lógica de programação apenas.

Vagas: 3
Salário: 3.000,00 PJ

Descrição: Os programadores vão aprender a trabalhar com Clarify, não precisam conhecer a tecnologia.

meu e-mail: albertopneto@gmail.com
Assunto: CV Clarify

[]'s

13 de agosto de 2007

The best of the best practices - Java EE aplications.

A Big Blue divulgou em Janeiro passado um documento falando sobre as melhores práticas de mercado para aplicações Java EE.

Segue abaixo a lista com as 19 top best practices elencadas por eles

A materia completa está disponível em

http://www.ibm.com/developerworks/websphere/techjournal/0701_botzum/0701_botzum.html


The best of the best practices
1. Always use MVC.
2. Don't reinvent the wheel.
3. Apply automated unit tests and test harnesses at every layer.
4. Develop to the specifications, not the application server.
5. Plan for using Java EE security from Day One.
6. Build what you know.
7. Always use session facades whenever you use EJB components.
8. Use stateless session beans instead of stateful session beans.
9. Use container-managed transactions.
10. Prefer JSPs as your first choice of presentation technology.
11. When using HttpSessions, store only as much state as you need for
the current business transaction and no more.
12. Take advantage of application server features that do not require
your code to be modified.
13. Play nice within existing environments.
14. Embrace the qualities of service provided by the application server
environment.
15. Embrace Java EE, don't fake it.
16. Plan for version updates.
17. At all points of interest in your code, log your program state using a
standard logging framework.
18. Always clean up after yourself.
19. Follow rigorous procedures for development and testing.

Hibernate Composite ID

Bom dia galera, depois de algum tempo hoje irei postar um exemplo de hibernate usando chave composta....

Primeiramente vamos a tabela:

Permissoes
usuario #
grupo #
centro_de_custo #

# chaves compostas

Agora vamos mapear isso usando hibernate annotations com jpa.

Classe Permissoes:

@Entity
@Table(name = "permissoes")
@IdClass(PermissoesPk.class)
public class Permissoes implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@Column(name = "usuario")
private String usuario;

@Id
@Column(name = "grupo")
private String grupo;

@Id
@Column(name = "centro_de_custo")
private int centroDeCusto;

// gets e sets

}

Criaremos então uma nova classe que contém essas chaves:

@Embeddable
public class PermissoesPk implements Serializable {

private static final long serialVersionUID = 1L;

private String grupo;

private String usuario;

private int centroDeCusto;

// gets e sets

}

De acordo com a documentação para fazer um mapeamento de chaves compostas a classe que contém o nome com final PK deve sobreescrever o método equals e hascode e também implementar Serializable.

Na documentação do hibernate tem outras duas formas de mapeamento usando @Id ou @EmbeddedId.

Veja este exemplo usando @Id:

@Entity
public class RegionalArticle implements Serializable {

@Id
public RegionalArticlePk getPk() { ... }
}

@Embeddable
public class RegionalArticlePk implements Serializable { ... }

Veja este exemplo usando @EmbeddedId:

@Entity
public class RegionalArticle implements Serializable {

@EmbeddedId
public RegionalArticlePk getPk() { ... }
}

public class RegionalArticlePk implements Serializable { ... }


esses exemplos são para guardar, futuramentem precisarei com ctz.

mais exemplos siga:
http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/#d0e1659

[]'s

Factory Method

Bom dia, hoje postarei algo sobre o padrão Factory Method, vamos lá...

Design Pattern: São uma coleção de padrões de desenho de software, que são soluções de problemas ocorridos no dia a dia de desenvolvimento de um software (são boas idéias).

Factory Method: este padrão é bem recomendado como por exemplo quando você utiliza vários tipos de bancos de dados em seu projeto, ele é uma fábrica que retorna uma das várias fábricas.


Vamos para um exemplo prático: Criarei uma factory para retornar um dos vários objetos DAO's do meu projeto, considere o seguinte diagrama:










Segue a implementação no código deste diagrama:

Esta classe abstrata é a Factory que retorna instancia de outras factories:

public abstract class DAOFactory {

public abstract UserDAO getUserDAO();

public static DAOFactory getInstance(int whichFactory) {
switch (whichFactory) {
case 1:
return new MySqlUserDAOFactory();
case 2:
return new PostgresUserDAOFactory();
default:
return null;
}
}
}

Factory para MySql
public class MySqlUserDAOFactory extends DAOFactory {

@Override
public UserDAO getUserDAO() {
return new MySqlUserDAO();
}
}

Factory para Postgres
public class PostgresUserDAOFactory extends DAOFactory {
@Override
public UserDAO getUserDAO() {
return new PostgresUserDAO();
}
}

Interface UserDAO, contém os métodos que os DAO's devem implementar.
public interface UserDAO {
public void save(Object o);
}

DAO para MySQL
public class MySqlUserDAO implements UserDAO {
public void save(Object o) {
// TODO Auto-generated method stub
}
}

DAO para Postgres
public class PostgresUserDAO implements UserDAO {
public void save(Object o) {
// TODO Auto-generated method stub
}
}

Vamos ver como chamariamos as nossas classes:

public static void main(String[] args) {
DAOFactory daoFactory = DAOFactory.getInstance(1);
// retorna a factory para MySql
UserDAO userDAO = daoFactory.getUserDAO();
userDAO.save(new Object());

DAOFactory daoFactory2 = DAOFactory.getInstance(2);
// retorna a factory para Postgres
UserDAO userDAO2 = daoFactory2.getUserDAO();
userDAO2.save(new Object());
}

Com isso a nossa implementação termina, um detalhe importante que deve-se notar é que se por um acaso um dia sua empresa decicidir incluir o oracle basta apenas criar uma nova factory OracleUserDAOFactory e estender a classe DAOFactory e pronto, com esse padrão fica muito flexível incluir e excluir qualquer nova implementação.


É isso ae...

[]'s

Hibernate


Eae galera.....

Vou começar com um breve tutorial de Hibernate:

Primeiramente estarei explicando alguns conceitos que estão relacionados com frameworks de persistência:

Um framework de persistência deve prover algumas funcionalidades e serviços para ser considerável a utilização do mesmo, citarei alguns seviços e funcionalidades referente a framework de persistência, em nosso exemplo do Hibernate.

· Controle transacional: o framework deve permitir rollback quando ocorrer algum erro e commit quando o objeto for persistido com sucesso.
· Identificadores de objeto: cada objeto de ter um identificador único para ser relacionado com o registro correspondente. Um OID (Object Identifier) garante que o objeto não se duplicará.
· Mapeamento O-R: se não utilizar um banco de dados orientado a objetos deve existir um mapeamento de objeto relacional entre a classe e a tabela do banco de dados isso é um dos requisitos principais de um framework de persistência de objetos é responsável por transformar uma representação de dados não orientada a objetos em um objeto e por armazenar um objeto persistente no seu mecanismo de persistência como um banco de dados, por exemplo.
· Cache: com o uso do cache o objeto é colocado em uma memória local para obter um maior desempenho, quando for necessário o uso desse objeto basta apenas buscá-lo na memória local que ele foi colocado agilizando todo o processo.
· Consultas sob demanda: os objetos são carregados apenas quando necessário evitando que registros sejam recuperados, todos de uma vez só. Com isso reduz a carga de informações na rede, se sua aplicação for utilizada através de internet este recurso garante um melhor desempenho.
· Proxy: é um objeto proxy de forma que o usuário e o serviço de persistência conseguem identificar. Assim quando um objeto for carregado apenas as informações definidas pelo objeto proxy serão recuperadas.
· Queries: utilizado para consultas mais complexas, isto pode ser feito através de OQL (Object Query Language) que é uma linguagem de consulta a banco de dados orientados a objetos ou também embutindo código SQL (Structure Query Language) na aplicação, pois isto não é muito recomendado porque acopla a estrutura do banco de dados com a sua aplicação.
. Portabilidade: um framework de persistência deve ser compatível com vários tipos de mecanismos de persistência de dados e também disponibilizar diversas maneiras de conexão, sendo isso muito importante porque quando for necessário trocar de mecanismo de persistência de dados não é necessário mudar toda sua aplicação.


Então o que é Hibernate ? Quais as vantagens de utilizar ? Quais desvantagens ?

Hibernate é um framework de persistência que permite a utilização de banco de dados relacional, porém, trabalhando com objetos, falar isso apenas é muito pouco
para o que o Hibernate pode fazer...
Uma das vantagens de utilizá-lo é que o desenvolvimento de aplicação se torna mais rápido, por não ter que escrever códigos e mais códigos SQL da vida... A idéia do
hibernate é encapsular todo o código SQL Jdbc por tráz de sua implementação, ficando transparente para o desenvolvedor.
Uma das desvantagens do hibernate é que para criar algumas queries bem complexas deve-se perder um tempo maior estudando as Criterias da vida!!!! São um pouco
complexas...
Outra desvantagen que eu considero é colocar milhões de jar's em sua aplicação, porém uma vez configurado não é preciso mexer novamente.


Exemplo:

Tudo isso:
INSERT INTO agendaadmissao (codigoagenda, nomecandidato, matriculacoordenador, codigocurso, data, status)
VALUES("1", "João da Silva Dias", "p100", "2", "2007-06-28 19:40:00", "P");

por isso:
session.save(objeto); // uau em uma linha!!!!

O hibernate permite ainda ir mais além, com apenas essa linha citada acima ele salva também todos os relacionamentos, para isso basta apenas configurar
uma propriedade chamada de Cascade, temos alguns tipos de cascade como:
ALL = persiste o objeto pai mais todos os filhos, cuidado ao utilizar pois se você deletar um objeto pai e tiver com essa propriedade tudo vai pro espaço...
None = este é o default, as operações relacionadas ao objeto pai apenas sofrerão alguma mudança nele mesmo em mais ninguém.
Save Update = onde o objeto pai pode salvar ou atualizar os filhos.
Persist = Apenas para operações de save.
All delete orphan = a partir do objeto pai ele deleta os filhos.


O Hibernate possui algumas interfaces importantes que vale a pena ser descrito, então vamos lá:


1º Interface de sessão (Session): Sessão (Session) é a interface primária do Hibernate, é de peso leve e mais fácil de criar e destruir. O objeto Session, por ser leve, ajudará na sua aplicação porque há uma grande necessidade de criar e destruir objetos Session há quase todo instante. As sessões não são Threadsafe, ou seja, uma Sessão do Hibernate é algo entre conexão e transação. Pode ser um armazenamento ou coleção de objetos numa única unidade de trabalho, podendo ser chamada de gerente de persistência, que faz a interface com operações relacionadas com a persistência, armazenando e recuperando objetos.

2º Interface SessionFactory: a interface SessionFactory não é considerada peso leve, sendo compartilhada entre muitas threads. Para a SessionFactory há um único aplicativo, criado na inicialização. Se seu aplicativo for acessar bancos de dados múltiplos usando Hibernate, é necessário uma SessionFactory para cada banco de dados. Esta interface controla dados armazenados e que foram lidos em uma unidade de trabalho, podendo ser reutilizados em uma unidade futura. Isso se o mapeamento de classe especificar o armazenamento do segundo nível. Geralmente a SessionFactory armazena instruções SQL (Structured Query Language), e outros metadados que são executados em tempo de execução.

3º Interface de Configuração: Segundo Bauer, King (2005, p. 39), a interface de configuração vai ser a primeira a ser encontrada quando você usar o Hibernate. Essa interface é muito importante porque depois de configurada, o Hibernate vai criar o SessionFactory.

4º Interface de Transação: é uma API (Application Programming Interface) opcional do Hibernate uma transação permite controlar os limites das transações usando uma API consistente com isso tornam-se portáveis os aplicativos do Hibernate com ambientes diferentes de execução.

5º Consulta e critérios de interfaces: a interface de consulta e critério serve para executar consultas no banco de dados. As consultas são feitas “escritas” em SQL(Structured Query Language) de seu banco de dados, para ligar parâmetros de consultas e limitar o número de resultados devolvidos pela consulta.

Vamos para o que interessa, criar um exemplo simples:

Vamos supor que estamos desenvolvendo um cadastro de cliente, (por enquanto, sem relacionamento):

Temos então:

Tabelas:

DROP TABLE IF EXISTS `cliente`;
CREATE TABLE `cliente` (
`nome` varchar(30) default NULL,
`id_cliente` int(9) NOT NULL auto_increment,
PRIMARY KEY (`id_cliente`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Para cada tabela dessa temos um Objeto chamado de Objeto ORM (Mapeamento de Objeto Relacional), ou seja o mapeamento das suas classes.

Essa é uma classe simples JavaBean com método get e set, a partir desta classe que faremos o mapeamento:



/**
* @author alberto ribeiro
*/
public class Cliente {
private int id;
private String nome;
get's e set's
}

Para a criação da aplicação alguns jar's terão que ser incluidos no classpath do projeto:

Hibernate3.jar: core do Hibernate.
c3p0-0.8.4.5.jar: Pool de conexão básico para executar testes unitários.
cglib-full-2.0.2.jar: biblioteca geradora de código para criação de proxies para classes persitentes.
dom4j-1.4.jar: biblioteca XML para parse de arquivos de configuração e mapeamento.
ecache-0.9.jar: cachê puro em Java, cachê padrão do Hibernate.
jta.jar: Java Transaction API.
commons-loging-1.0.4.jar: base para o mapeamento de produtos objeto relacional
commons-collections-2.1.1: contém as listas como bag, array list entre outros tipos de listas.
ojdbc.jar: jar do fabricante do bando de dados

Abaixo o mapeamento ORM, da classe Cliente, chamaremos de ClienteORM.hbm.xml:




Neste mapeamento vale ressaltar algumas propridades:

class name = é o relacionamento da tabela com a classe, sendo que o atributo name deve conter o nome completo do objeto incluindo o pacote e o atributo table deve conter o nome da tabela.

table = nome da tabela referente a classe.

id = nome do campo id dentro da classe cliente

column = "id_cliente" = referente ao nome da coluna no banco de dados.

type = o tipo da propriedade no caso id_cliente é um int.

generator = referente ao esquema de geração de ID no banco de dados, o native indica que o banco se encarregará de gerar este número sequencial.

property = a propriedade da classe, exemplo: nome e seu tipo string.


Depois de ter as classes mapeadas em um arquivo xml, temos então que configurar o hibernate.cfg.xml que será responsável
por algumas propiedades importantes de configuração:



Vale ressaltar as seguintes propridades:

dialect = responsável pela geração das intruções SQL de acordo com cada Bando de Dados, ele representa a linguagem que será gerada as queries da aplicação para o banco.

connection.url = a url é específica ao banco de dados utilizado, na url passamos como parâmetros o IP da máquina ou o nome do servidor, porta e o nome da base de dados. Usuário e senha são do banco de dados

connection.driver_class = O nome do driver que estamos utilizando no caso MySQL.

connection.username = username no banco de dados.

connection.password = senha no banco de dados.

show_sql = se estiver marcado como true, todas as queries geradas serão impressas no console.

mapping resource = local onde estão os mapeamentos XML referente as classes.


Criaremos agora uma classe utilitária responsável por criar as famosas Session's do hibernate:


public class HibernateUtil {

private static SessionFactory sessionFactory;

private static Session session;

private static Logger logger = Logger.getLogger(HibernateUtil.class);

static {
sessionFactory = new Configuration().configure().buildSessionFactory();
// obs o arquivo hibernate.cfg.xml deve estar na pasta src, o hibernate procura ela la dentro
// caso queira ficar em outro lugar deve mudar aqui: new Configuration().configure("nome do pacote onde está o //arquivo").buildSessionFactory();


if (logger.isDebugEnabled()) {
logger.info("Criando a session factory");
}
}

public static Session getCurrentSession() {
if (session == null || !session.isOpen() || !session.isConnected()) {
session = ((SessionFactory) sessionFactory).openSession();
}
return session;
}

public static void closeSession() {
session.close();
}

}


Criando nosso DAO, mas antes uma breve explicação: DAO é um padrão de projetos que veio para separar a camada de modelos de dados referente a banco de dados dos modelos de objetos, caso o mecanismo de persistencia troque, modifica-se a camada DAO.
Dentro desse DAO ficará os métodos CRUD, ou seja, create, retrieve, update e delete.

ClienteDAO:

public class ClienteDAO{

public void save(Object object) throws AcessoBaseDeDadosException {
if (object == null) {
throw new AcessoBaseDeDadosException(
"O objeto à ser salvo está nulo.");
}

try {
HibernateUtil.getCurrentSession().save(object);
} catch (HibernateException e) {
throw new AcessoBaseDeDadosException("Erro persistindo o objeto: "
+ object.getClass().toString(), e);
} catch (Exception e) {
throw new AcessoBaseDeDadosException("Erro persistindo o objeto: "
+ object.getClass().toString(), e);
}
}
}

A estrutura do projeto ficou assim:

Persistencia
src
br/edu/persistencia/common/
Cliente.java
ClienteORM.hbm.xml
br/edu/persistencia/dao/
ClienteDAO.java
br/edu/persistencia/util/
HibernateUtil.java
hibernate.cfg.xml
lib
Todos os jar's citados acima.

Podemos agora fazer o teste:

public class Teste {

public static void main(String[] args) throws Exception {
ClienteDAO dao = new ClienteDAO();

Cliente cliente = new Cliente();
cliente.setNome("Alberto");

Session session = HibernateUtil.getCurrentSession(); // Pegando uma sessão, caso esteja em aberto ele apenas //retorna uma sessão corrente
Transaction tx = session.begintransaction(); // iniciando uma transação para poder inserir no banco de dados
dao.save(cliente); // chamando o método save da classe DAO
tx.commit(); // finalizando a transação.
session.close(); // fechando a sessão com o banco.
}
}

É isso ai então, depois testar, mas, acredito que esteja correto, qualquer dúvida mande!!!! Este foi o primeiro, não sei se está bom mas com o tempo isso melhora...


[]'s

11 de agosto de 2007

ROBOCODE - Aprenda Java Brincando!


Que tal começar a aprender Java de uma maneira divertida e descontraída???Ai vai uma dica muito legal e que funciona para quem quer começar a aprender conceitos de Java se divertindo.

O Robocode é um jogo educacional (uma pequena aplicação) de código aberto desenvolvido em Java, onde podemos programar o comportamento e reações de robôs “virtuais”. Na arena os robôs se confrontam em uma batalha até restar um único vencedor (ou grupo vencedor). O Robocode foi desenvolvido pela AlphaWorks, uma divisão da IBM voltada à difusão de novas tecnologias de desenvolvimento.

O Robocode e sua documentação, pode ser encontrado no seguinte endereço: robocode.sourceforge.net
Tutorial para iniciantes:

http://robowiki.net/wiki/Robocode/My_First_Robot

Tutorial básico:
http://www.lac.inpe.br/~rafael.santos/Docs/JavaMisc/introprogRC.pdf
 
É isso ai pessoal, ai ficou uma Dica vale a pena conferir!
Fiquem com Deus!

10 de agosto de 2007

JEDI e o ensino de Java gratuito

Olá, lendo o PortalJava vi um interessante projeto no qual a JUG do Ceará está participando, até postei a notícia no GUJ e vou também colocar o artigo completo encontrado no site do JEDI.
Gostei de ver que o Brasil está se empenhando e que as pessoas estão empenhadas em ensinar as outras.

JEDI e o ensino de Java gratuito

Iniciado pela Universidade das Filipinas e apoiado pela Sun Microsystens, nasce através do Java Research & Development Center, a iniciativa JEDI (Java Education and Development Initiative), em Fevereiro de 2005.

A partir desta data, o JEDI vem sendo desenvolvido como um projeto colaborativo, que conta com o apoio da comunidade Java em todo o mundo. Tem como principais objetivos o de melhorar a experiência do ensino e da aprendizagem; Aumentar a qualidade dos graduados em Ciência da Computação e Tecnologia da Informação (disponibilizando os materiais de seus cursos gratuitamente para quem se interessar); Aumentar o banco de especialistas em Java e, Fornecer serviços e produtos a altura das necessidades do mercado mundial.

Tecnologia Java

A tecnologia Java está presente, hoje, em 2 bilhões de dispositivos tecnológicos em todo o planeta - e também fora dele, já que podemos localizar dispositivos Java rodando até em Marte. Existem hoje, no mundo, cerca de 579 milhões de celulares com Java, 93 operadoras de telefonia móvel, 750 milhões de cartões SmartCard (do tipo JavaCard) distribuídos, 650 milhões de computadores pessoais e com 2 milhões de cópias da plataforma empresarial J2EE. Por isto, 68% das novas aplicações, hoje, são desenvolvidas em Java, que substituiu o C++ como a competência mais procurada pelos profissionais. É executado em múltiplas plataformas e em uma ampla gama de dispositivos, indo de um pequeno chip em SmartCards aos servidores dos Grandes Data Centers.

Demanda por Profissionais

Com tudo isso, existe hoje, uma demanda por 2 milhões de novos profissionais de TI a cada ano. Desenvolvedores Java, devem prover soluções nas mais diversas áreas de tecnologia. Torna-se crescente a necessidade, por exemplo, do desenvolvimento de soluções para aparelhos celulares que demandam uma integração com sistemas legados, de maneira a fornecer soluções corporativas. A partir disto, o conhecimento de Java e de sistemas abertos, são imprescindíveis para profissionais de TI.

Além da demanda, a tendência é um outro fator motivador para este mercado. No Brasil, esta aponta para direção de trabalhos realizados para clientes de fora do país - o outsourced. É crescente a procura por parte das organizações, o desenvolvimento de projetos baseados em tecnologia Java, distribuindo-se as aplicações desenvolvidas aqui pela Internet.

Todavia, a busca do mercado por esse perfil de profissional vai de encontro com a capacidade de fornecimento do conhecimento Java. O fato é que, o mercado tem dificuldade em encontrar desenvolvedores com competência nos fundamentos de Tecnologia da Informação, orientação a objetos, conhecimento e experiência em Java avançado, competência em comunicação e nas relações interpessoais.

A industria de software supre o despreparo dos profissionais formados pelo mercado, com a necessidade de re-treinamento interno dos novos contratados, muitos graduados sem conhecimento em TI. A grande maioria não tem uma certificação, que tem um valor adicional no mercado, especialmente para trabalhos executados fora do pais. Outro fator que colabora para o despreparo do profissional é fato do treinamento oficial Java da Sun ser relativamente caro e os programas de treinamento interno das empresas atuais serem pouco abrangentes. Disso resulta uma contratação de apenas 5% dos currículos recebidos nas empresas.

Academicamente o treinamento é, muitas vezes gratuito e de boa qualidade, é acessível. Contrastando, os professores não possuem experiência prática das demandas da indústria e não há, por parte de centros acadêmicos, a compreensão com respeito ás preocupações da industria de software, que não conseguem cobrir as necessidades que o mercado exige. Aliado a isso, está a dificuldade de alterar os currículos acadêmicos.

E o JEDI ?

O JEDI, entra neste contexto de forma totalmente gratuita para a comunidade e disponibiliza todo o acesso aos cursos e materiais. O aluno terá ao seu dispor manuais, slides de apresentação das aulas, provas, exercícios e material de referência e vídeo-aulas. Contando ainda com os softwares, o treinamento de instrutores, o acesso a suporte e a lista de discussão da comunidade.

Na Filipinas já existe uma estrutura acadêmica dividida em fases. Na primeira fase foram disponibilizados os cursos de Introdução a programação I (versão 1.3); Introdução a Programação II (versão 1.1) e Estruturas de Dados (versão1.1). Na segunda fase os cursos de Engenharia de software (versão 1.0); Desenvolvimento de aplicações móveis (versão 1.0); Programação Web (versão 1.0). Na terceira fase, os cursos de Web Services; Segurança em Java e Programação, modelagem e análise orientada à objetos. Completando quatro semestres de curso com: Sistemas operacionais; Gerenciamento de projetos orientados à objetos e Inteligência artificial. Todo este material está atualmente disponível para download, em Inglês, no site Java.net.

A comunidade JEDI tem contribuído bastante para o sucesso desta iniciativa, em todo o mundo existem mais de 80 pessoas contribuindo ativamente. Os treinamentos são realizados pelos membros do JEDI que conduzem os testes e recebem cada vez mais pessoas como voluntárias. O JEDI possui, atualmente, parcerias globais nas Filipinas através de JP Petines (Java champion), no Brasil através de Daniel deOliveira (Java champion), na França através de Vicent Brabant (Java champion) e de coordenações na Malásia, Tailândia, Singapura, Japão e Vietnam.

Hoje o JEDI concentra o maior número de membros nas Filipinas. Desde fevereiro de 2005 até abril de 2006 são 110 escolas - 10% de todas as universidades e faculdades das Filipinas aderentes ao programa; Foram realizados 13 treinamentos e formados 207 instrutores multiplicadores, que formaram 1.318 instrutores que atendem a 48.205 estudantes.

Países de Língua Portuguesa

O Brasília Java Users Group - DFJUG é responsável pela coordenação do JEDI em países de língua portuguesa. Angola, Cabo Verde, Guiné-Bissau, Brasil, Moçambique, Portugal, São Tomé e Príncipe; Timor Leste serão países que poderão fazer o treinamento em língua nativa, com todos os recursos que a iniciativa provê. O DFJUG possui mais de 9.900 membros e é totalmente baseado em trabalho voluntário, sem personalidade jurídica e patrocinado pelo Instituto CTS, OSCIP, voltada para a pesquisa e desenvolvimento de tecnologias de software, que fornece ao grupo apoio logístico, administrativo e jurídico.

Atualmente, o Brasil conta, segundo a SUN Microsystems, com 70 mil desenvolvedores Java e 43 grupos de usuários Java, com mais de 25 mil membros participantes. É através do apoio destes grupos distribuídos em todos os estados da nação que esta iniciativa espera se consolidar, para elevar o nível de aprendizado Java, provendo melhores profissionais para atender as exigências do mercado mundial.

Como participar do JEDI ?

No momento estamos trabalhando na tradução e adaptação do material utilizado na Filipinas. Um vez que este esteja concluído, os cursos poderão ser acessados pelo site. Ao concluir o processo cada aluno terá que fazer uma prova presencial para obter a sua certificação, que será oferecida agentes que serão certificados em todo Brasil.

O DFJUG necessita de pessoas para corrigir e dar opiniões sobre todo o material produzido e realizar testes de Stress no site aonde o JEDI será hospedado, isso é um trabalho que somente poderá ser realizado com o apoio de toda a comunidade javanesa existente no Brasil.

Quem quiser participar da iniciativa, no Brasil, deve acessar a página do DFJUG (www.dfjug.org) e entrar em contato com o grupo. Junte-se a nós, participe no instrutor ou como aluno desta iniciativa, poderemos assim enriquecer o conhecimento da linguagem e difundi-la de uma forma totalmente gratuita, voluntária e colaborativa, no Brasil e em diversos paises de língua portuguesa, será seu trabalho e seu empenho que ajudará elevar o Brasil ao hall dos melhores desenvolvedores JAVA no mundo.