sexta-feira, 28 de setembro de 2007

Abrir paginas com Ajax

Navegação em uma pagina JSF, onde um componente ira receber dentro dele a pagina de se deseja abrir:


<af:commandLink actionListener="#{backing.funcao}"
styleClass="textoSubMenu"
id="LinkTeste"
partialSubmit="true"
onclick= "javascript:setaValor('../site/paginaTeste.jspx',
'descricao');">
<h:outputText value="#{msg.subMenuControladoria}"/>
</af:commandLink>


Nesse link(Componente do ADF), foi utilizado um actionListener para realizar umas funções na pagina, e a propriedade partialSubmit="true" , para evitar que toda a pagina fosse atualizada ao clicar (O funcionamento disso esta em um outro post).

Quando a ação de clique é disparada, então o javascript a seguir entra em ação para buscar a nova pagina e carrega-la dentro de um componente já definido.


function getXmlHttpRequestObject() {
if (window.XMLHttpRequest) {
return new XMLHttpRequest(); //Not IE
} else if (window.ActiveXObject) {
return new ActiveXObject("Microsoft.XMLHTTP"); //IE
} else {
alert("Seu navegador não suporta essa navegação. Por favor Atualize!");
}
}
var receiveReq = getXmlHttpRequestObject();
var idcomp;
//Initiate the asyncronous request.

function setaValor(pagina , id ) {
//Deixa visivel a imagem e esconde o componente até ser carregado
document.getElementById(id).style.visibility = "hidden";
document.getElementById("loading").style.visibility = "visible";
if (receiveReq.readyState == 4 || receiveReq.readyState == 0) {
receiveReq.open("GET", pagina, true);
idcomp = id;
receiveReq.onreadystatechange = setar;
receiveReq.send(null);
}
}

function setar() {
if (receiveReq.readyState == 4) {
//esconde a imagem
document.getElementById("loading").style.visibility = "hidden";
//Joga a pagina requisitada para dentro do componente
document.getElementById(idcomp).innerHTML =
receiveReq.responseText;
//Deixa visivel o componente carregado
document.getElementById(idcomp).style.visibility = "visible";
}
}


Esse javascript ainda altera a propriedade visibility de um componente de id = loading:


<h:graphicImage url="/Imagens/loading.gif" id="loading" styleClass="figLoading"/>


Esse componente é apenas uma imagem do tipo gif, que usei para dar uma resposta ao usuário enquanto a pagina é carregada.(implementação bem simples).

Depois de carregado e mostrado pelo JavaScript, este é o componente que recebe a pagina que foi carregada:


<h:form styleClass="formDescSMenu" id="descricao"></h:form>

Grupo de JSF oficial do Brasil!

Um grupo internacional da língua portuguesa para discussão de conceitos e tecnologias Web como JavaServer Faces, RIA, patterns e ferramentas de desenvolvimento.

Grupo de JSF

segunda-feira, 10 de setembro de 2007

PartialRefresh e Partialtriggers para componentes ADF

Para que serve?
Atualizar componentes sem que seja preciso atualizar a pagina.

PartialRefresh
Atualizar um componente setando novas configurações ou opções a ele, dizendo apenas qual o componente a ser atualizado
/**
* Faz com que o componente passado por parâmentro seja
* atualizado na tela
* @param uic componente a ser atualizado
*/
private void doPartialRefresh(UIComponent uic) {
AdfFacesContext adfctx = AdfFacesContext.getCurrentInstance();
adfctx.addPartialTarget(uic);
}

Partialtriggers
Define que um componente será reatualizado quando algum outro por alterado

af:selectonechoice label="Teste"
required="true"
binding="#{backing_teste.oneChoice}"
partialtriggers="IdComponente"
id="selectOneChoice"
/af:selectonechoice


OBS: para que essa atualização ocorra normalmente o componente que ira disparar as alteraçoes deve estar com a propriedade autoSubmit ou partialSubmit setado para true

quarta-feira, 29 de agosto de 2007

terça-feira, 21 de agosto de 2007

Mascara JavaScript

Existem tantas mascaras prontas por ae, e cada uma com suas particularidades, mas nenhuma atendia as minhas necessidades e então decidi criar uma que serviria para data, cpf ou outras mascaras que fosse preciso.

Embora bem extensa, é bem simples, e embora eu não seja muito bom em JavaScript, ficou bem útil e fácil de entender e modificar, caso necessário.


function aplicaMascara(campo,event, mascara) {
if (event.keyCode >= 46||event.keyCode == 8){
position = campo.selectionStart;
valor = campo.value;
v = event.keyCode;
m = mascara.charAt(position);
c = campo.value.charAt(position);
//Verifica se a mascara é para numero e se o valor inserido tb é
if (((m == '9')||(m == '0'))&&((event.keyCode >= 48 && event.keyCode <= 57)
||(event.keyCode >= 96 && event.keyCode <= 105))) {
if (c != '') {
valor = atualizaValor(valor,position,'');
document.getElementById(campo.id).value = valor;
setCursorPosition(campo,position,position);
}
//Verifica se a mascara é para texto e se o valor inserido tb é
} else if ((m == '#')&&(event.keyCode >= 65 && event.keyCode <= 90)) {
if (c != '') {
valor = atualizaValor(valor,position,'');
document.getElementById(campo.id).value = valor;
setCursorPosition(campo,position,position);
}
} else {
if (m=='') {
return false;
//Trata o valor caso o usuario pressione DEL, para nao sair da estrutura
} else if (event.keyCode == 46) {
for (del = position ;del < campo.selectionEnd ; del ++) {
valor = atualizaValor(valor,del,' ')
}
document.getElementById(campo.id).value = valor;
setCursorPosition(campo,position,position);
return false;
//Trata o valor caso o usuario pressione Backspace, para nao sair da
// estrutura
} else if(event.keyCode == 8){
valor = atualizaValor(valor,position-1,' ');
document.getElementById(campo.id).value = valor;
setCursorPosition(campo,position-1,position-1);
return false;
} else if ((m != '0')&&(m != '9')&&(m != '#')) {
//insere o saparador ou digito especial no texto
valor = atualizaValor(valor,position,m);
//verifica se o proximo campo da mascara atende as caracteristicas
// do valor inserido
if (((mascara.charAt(position+1) == '9')
||(mascara.charAt(position+1) == '0'))
&&((event.keyCode >= 48 && event.keyCode <= 57)
||(event.keyCode >= 96 && event.keyCode <= 105))) {
if (c != '') {
valor = atualizaValor(valor,position+1,'');
document.getElementById(campo.id).value = valor;
setCursorPosition(campo,position+1,position+1);
}
} else if ((mascara.charAt(position+1) == '#')
&&(event.keyCode >= 65 && event.keyCode <= 90)) {
if (c != '') {
valor = atualizaValor(valor,position+1,'');
document.getElementById(campo.id).value = valor;
setCursorPosition(campo,position+1,position+1);
}
} else {
return false;
}
} else {
return false;
}
}
document.getElementById(campo.id).value = valor;
}
}

//Recebe um texto e substitui o valor passado na posicao indicada
function atualizaValor(texto,posicao,valor){
var novoTexto = "";
for (i = 0; i <= texto.length; i++) {
if (i == posicao) {
novoTexto = novoTexto + valor;
} else {
v = texto.charAt(i);
novoTexto = novoTexto + v;
}
}
return novoTexto;
}

//Seta o cursor para a posicao desejada no campo
function setCursorPosition(oInput,oStart,oEnd) {
if( oInput.setSelectionRange ) {
oInput.setSelectionRange(oStart,oEnd);
} else if( oInput.createTextRange ) {
var range = oInput.createTextRange();
range.collapse(true);
range.moveEnd('character',oEnd);
range.moveStart('character',oStart);
range.select();
}
}



Para utilizar a mascara, basta chama-la desta forma:
onkeydown="return aplicaMascara(this,event,'99/99/9999 99:99');"

Caso seja passado "9" ou "0", ela vai aceitar apenas numeros e se for "#" aceitara apenas letras.

segunda-feira, 30 de julho de 2007

Skin de componentes ADF

Para utilizar um skin diferente do tradicional para os componentes ADF, basta incluir no projeto alguns arquivos referente ao novo Skin (css, imagens), e configurar para que a aplicação os utilize.

Com o JDeveloper, na opção de updates é facil encontrar o item para skins adicionais e basta baixa-los para que eles fiquem na pasta da IDE, e seja possivel utilizar.

Ja com os novos Skin na maquina, resta apenas copiar esses arquivos para uma pasta do seu projeto, e mapea-los para que a aplicação os encontre.

Dentro dessa pasta, pode-se criar pastas para cada Skin que decidir utilizar, e dentro da pasta do Skin, ficara o arquivo de css e as imagens que ele utiliza.
Lembrando que as tags de css devem seguir um padrão de nome ja definido, então para alteraçoes nas cores e outras propriedades é de grande importancia prestar atenção a esses nomes para que funcionem corretamente.

Nesse link pode ser obtido um skin padrao: Oracle Skin

Depois de colocado os arquivos na pasta, é preciso mapea-lo para que seja encontrado pelo projeto, e para isso é necessario um arquivo xml chamado: adf-faces-skins.xml , e que ficara na pasta WEB-INF do projeto, e nele é definido a estrutura do skin dessa forma:



<?xml version="1.0" encoding="ISO-8859-1"?>

<skins xmlns="http://xmlns.oracle.com/adf/view/faces/skin">
<skin>
<id>silver.desktop</id>
<family>silver</family>
<render-kit-id>oracle.adf.desktop</render-kit-id>
<style-sheet-name>skins/silver/silver.css</style-sheet-name>
</skin>

</skins>



Essa estrutura faz com que o skin seja encontrado pelo projeto, e para utiliza-lo, é preciso apenas inserir o seu nome em outro arquivo xml que provavelmente ja estara na pasta web inf : adf-faces-config.xml

<?xml version="1.0" encoding="windows-1252"?>
<adf-faces-config xmlns="http://xmlns.oracle.com/adf/view/faces/config">

<skin-family>silver</skin-family>

</adf-faces-config>

E com isso a aplicação ja estara com um novo visual, e sendo possivel deixar essa opção selecionavel pelo usuario.

Podem ser encontradas maiores explicaçoes em: Oracle ADF

sexta-feira, 29 de junho de 2007

Além do Cidadão Kane

Além do Cidadão Kane é um documentário produzido pela BBC de Londres - proibido no Brasil desde a estréia, em 1993, por decisão judicial - que trata das relações sombrias entre a Rede Globo de Televisão, na pessoa de Roberto Marinho, com o cenário político brasileiro.

- Os cortes e manipulações efetuados na edição do último debate entre Luiz Inácio da Silva e Fernando Collor de Mello, que influenciaram a eleição de 1989.

- Apoio a ditadura militar e censura a artistas, como Chico Buarque que por anos foi proibido de ter seu nome divulgado na emissora.

- Criação de mitos culturalmente questionáveis, veiculação de notícias frívolas e alienação humana.

- Depoimentos de Leonel Brizola, Chico Buarque, Washington Olivetto, entre outros jornalistas, historiadores e estudiosos da sociedade brasileira.



"Todo brasileiro deveria ver Além do Cidadão Kane"

quinta-feira, 21 de junho de 2007

Google maps

Simplesmente demais isso... quem sabe um dia tenha essas opçoes para cidades brasileiras... he he

quarta-feira, 20 de junho de 2007

Valores de Sessao com DWR

Buscando valores de objetos na sessão, via dwr, e jogando valores em um campo na tela diretamente do java:



import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.proxy.dwr.Util;

/**
* pega o WebContex - classe do DWR
* objeto faz a ligacao com o servlet
*
* @return objeto WebContext
*/
private WebContext getWebContext() {
return WebContextFactory.get();
}

/**
* Pega o objeto usuário que está na sessão ativa
*
* @return Usuário
*/
private OBJETO getOBJETO() {
return (OBJETO) this.getWebContext().getSession().getAttribute("OBJETO");
}

/**
* pega o objeto Útil - classe do DWR que permite
* operacoes com os elementos HTML
*
* @return objeto Util
*/
private Util getUtilThis() {
return new Util(getWebContext().getScriptSession());
}

//Aqui passa um valor e um campo da tela e via dwr
// ele seta o valor para o campo na tela
private void setarValor(String valor,String nomeCampo){
this.getUtilThis().setValue(nomeCampo, String.valueOf(valor));
}



E para que tudo isso funcione basta estar configurado corretamente o DWR, e para isso é só dar uma olhada no outro post sobre o assunto.

Acesso a banco Oracle, Firebird, SQL Server via Java

Um codigo simples e rapido para conectar em 3 bancos de dados:
Oracle, Firebird, SQL Server

Estou usando os seguintes drivers
Oracle: ojdbc14.jar
SQL Server: jtds-1.2.jar
Firebird: jaybird-full-2.0.1.jar

Todos esses podem ser facilmente encontrados em uma procura rapida no google (ou generico)



import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class OracleRM {
public OracleRM() {
}

private static final String url =
//Oracle:
// "jdbc:oracle:thin:@ENDERECO_DO_SEU_SERVIDOR:PORTA:BASE_DE_DADOS";
//SQL Server 1433 é a porta padrao
// "jdbc:jtds:sqlserver://
ENDERECO_DO_SEU_SERVIDOR:1433/BASE_DE_DADOS";
//Firebird:
// "jdbc:firebirdsql://ENDERECO_DO_SEU_SERVIDOR/CAMINHO_BASE_DE_DADOS";

private static final String driver =
//Oracle:
// "oracle.jdbc.driver.OracleDriver";
//SQL Server
// "net.sourceforge.jtds.jdbc.Driver";
//Firebird:
// "org.firebirdsql.jdbc.FBDriver";

private static final String usuario = "usuario";
private static final String senha = "senha";

public Connection getConnection() throws SQLException {
try {
Class.forName(driver);
return DriverManager.getConnection(url, usuario, senha);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

}

quinta-feira, 3 de maio de 2007

Ajax com DWR

Esse é um tutorial simples, de como usar e implementar o DWR para obter funcionalidades em Ajax.

Documentaçao melhor pode ser encontrada no site: DWR

Continuando...

Primeiro é preciso baixar o dwr.jar na pagina acima, e adicionar a sua aplicaçao.

Em seguida, no seu web.xml é necessario incluir estas linhas, para configuraçao do servlet do dwr:

Após feito isso, tem que ser criado na mesma pasta do web.xml, um arquivo chamado dwr.xml, e nele será feito o mapeamento das classes chamadas via javascript.

Segue basicamente este padrao:

Na imagem:
create creator="new" javascript="Index"
O tipo de contrutor e o apelido que sera usado no javascript
param name="class" value="ajax.backing.Index"
Aqui é especificado o caminho onde se encontra a classe.

Depois de configurado esses dois arquivos, rode sua aplicaçao e acesse o caminho:
aplicaçao/dwr

Nesse caminho, será listado as classes que foram mapeadas:

Clicando em uma delas:


É entao mostrado uam breve descrição dos metodos que ela disponibiliza, e também, no topo da pagina, as tags necessarias para usar esta classe na sua pagina.

Agora falta apenas copiar essas tags e incluir na sua pagina.

Entao só é preciso usar as funcoes, e poder ser como esse exemplo simples:
Que chama :
E esta... chama a classe mapeada anteriormente:

Feito isso, esta pronto uma implementação basica do DWR.

quarta-feira, 2 de maio de 2007

Adobe Labs - Adobe Digital Editions

Exelente ferramenta para visualizaçao de arquivos .pdf, mas disponivel ainda apenas versao beta.

Adobe Labs - Adobe Digital Editions Beta Download and Install

sexta-feira, 27 de abril de 2007

Meta 2007 - SCJP

Descrição do Curso (CX-310-055)

Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0 (CX-310-055)



Programação
As datas dos cursos dependem do número de participantes.

Overview

O exame de certificação "Sun Certified Programmer for Java 2 Platform 5.0", destina-se a programadores com experiência no uso da linguagem de programação Java. A obtenção dessa certificação é evidência clara de que o programador conhece a sintaxe e a estrutura básicas da linguagem de programação Java e de que é capaz de desenvolver aplicativos com a tecnologia Java para serem executados em sistemas de servidor e de desktop usando o J2SE 5.0.

Este simulado Sun ePractice é composto de 210 questões.




Detalhes
  • Delivered at: Authorized Worldwide Prometric Testing Centers
  • Prerequisites: None
  • Other exams/assignments required for this certification: Nenhum
  • Exam type: Múltipla escolha e método "arrastar e soltar"
  • Number of questions: 72
  • Pass score: 59% (43 de 72 questões)
  • Time limit: 175 minutos



Idiomas
  • English
  • Japanese
  • Chinese (Traditional)
  • Chinese (Simplified)
  • German
  • Korean
  • Portuguese (Brazilian)
  • Spanish
Pré-requisitos
None

Objetivos do Exame

Seção 1: Declarações, Inicialização e Definição de Escopo
  • Desenvolver código que declare classes (inclusive classes abstratas e todas as formas de classes aninhadas), interfaces e enumerações e que inclua o uso apropriado de instruções de pacote e de importação (inclusive importações estáticas).
  • Desenvolver código que declare uma interface. Desenvolver código que implemente ou estenda uma ou mais interfaces. Desenvolver código que declare uma classe abstrata. Desenvolver código que estenda uma classe abstrata.
  • Desenvolver código que declare, inicialize e use primitivas, matrizes, enumerações e objetos como variáveis estáticas, locais e de instância. Além disso, usar identificadores legais para nomes de variáveis.
  • Desenvolver código que declare métodos estáticos e não estáticos e, se for o caso, usar nomes de métodos que sigam os padrões de nomenclatura do JavaBeans. Além disso, desenvolver código que declare e use uma lista de argumentos de comprimento variável.
  • Com base em um exemplo de código, determinar se um método está substituindo corretamente ou sobrecarregando outro método e identificar valores de retornos legais (inclusive retornos co-variantes) para o método.
  • Com base em um conjunto de classes e superclasses, desenvolver construtores para uma ou mais dessas classes. Com base em uma declaração de classe, determinar se um construtor padrão será criado e, caso afirmativo, determinar o comportamento desse construtor. Com base em uma listagem de classes aninhadas ou não aninhadas, escrever código para criar uma instância da classe.

Seção 2: Controle de Fluxo
  • Desenvolver código que implemente uma instrução if ou switch e identificar tipos de argumentos legais para essas instruções.
  • Desenvolver código que implemente todas as formas de loops e iteradores, incluindo o uso de for, for loop aprimorado (for-each), do, while, labels, break e continue, e explicar os valores assumidos pelas variáveis de contador de loop durante e após a execução do loop.
  • Desenvolver código que faça uso de declarações e distinguir os usos de declarações apropriados dos usos inapropriados.
  • Desenvolver código que faça uso de exceções e de cláusulas de tratamento de exceções (try, catch, finally) e que declare métodos e métodos de substituição que gerem exceções.
  • Reconhecer o efeito de uma exceção que surge em um ponto específico de um fragmento de código. Nota: a exceção pode ser uma exceção de tempo de execução, uma exceção verificada ou um erro.
  • Reconhecer situações que resultarão na geração de um dos seguintes itens: ArrayIndexOutOfBoundsException, ClassCastException, IllegalArgumentException, IllegalStateException, NullPointerException, NumberFormatException, AssertionError, ExceptionInInitializerError, StackOverflowError ou NoClassDefFoundError. Compreender quais desses itens são gerados pela máquina virtual e reconhecer as situações nas quais outros itens devem ser gerados por programação.

Seção 3: Conteúdo da API
  • Desenvolver código que use as classes wrapper de primitivas (como Boolean, Character, Double, Integer etc.) e/ou autoboxing e unboxing. Analisar as diferenças entre as classes String, StringBuilder e StringBuffer.
  • Com base em um cenário de navegação em sistemas de arquivos, leitura de arquivos ou gravação em arquivos, desenvolver a solução correta usando as seguintes classes (às vezes, combinadas) no java.io: BufferedReader, BufferedWriter, File, FileReader, FileWriter e PrintWriter.
  • Desenvolver código que serialize e/ou desserialize objetos usando as seguintes interfaces de programação de aplicativos (API - Application Programming Interface) do pacote java.io: DataInputStream, DataOutputStream, FileInputStream, FileOutputStream, ObjectInputStream, ObjectOutputStream e Serializable.
  • Usar APIs J2SE padrão no pacote java.text para formatar ou analisar datas, números e valores monetários corretamente para uma localidade específica e, com base em um cenário, determinar os métodos apropriados se você desejar usar a localidade padrão ou uma localidade específica. Descrever o objetivo e o uso da classe java.util.Locale.
  • Escrever código que use APIs J2SE padrão nos pacotes java.util e java.util.regex para formatar ou analisar strings ou fluxos. Para strings, escrever código que use as classes Pattern e Matcher e o método String.split . Reconhecer e usar padrões de expressões regulares para correspondência (limitados a: . (ponto), * (asterisco), + (sinal de mais), ?, \d, \s, \w, [], ()). O uso de *, + e ? será limitado aos quantificadores vorazes, e o operador de parênteses só será usado como mecanismo de agrupamento, e não para capturar conteúdo durante a correspondência. Para fluxos, escrever código usando as classes Formatter e Scanner e os métodos PrintWriter.format/printf. Reconhecer e usar parâmetros de formatação (limitados a %b, %c, %d, %f, %s) em strings de formato.

Seção 4: Simultaneidade
  • Escrever código para definir, criar instâncias e iniciar novos segmentos usando java.lang.Thread e java.lang.Runnable.
  • Reconhecer os estados possíveis de um segmento e identificar maneiras de fazer a transição de um segmento de um estado para outro.
  • Com base em um cenário, escrever código que faça uso apropriado do bloqueio de objetos, para proteger variáveis estáticas ou de instâncias contra problemas de acesso simultâneo.
  • Com base em um cenário, escrever código que faça uso apropriado de wait, notify notifyAll.

Seção 5: Conceitos Orientados a Objetos
  • Desenvolver código que implemente encapsulamento rígido, acoplamento flexível e alto nível de coesão nas classes, e descrever os benefícios.
  • Com base em um cenário, desenvolver código que demonstre o uso do polimorfismo. Além disso, determinar quando a intercalação será necessária e diferenciar os erros de compilação dos erros de tempo de execução relacionados à intercalação de referências de objetos.
  • Explicar os efeitos dos modificadores na herança com relação a construtores, variáveis estáticas ou de instâncias e métodos estáticos ou de instâncias.
  • Com base em um cenário, desenvolver código que declare e/ou invoque métodos substituídos ou sobrecarregados e código que declare e/ou invoque construtores de superclasse, substituídos ou sobrecarregados.
  • Desenvolver código que implemente relacionamentos "é-um" e/ou "tem-um".

Seção 6: Coleções/Versões Genéricas
  • Com base em um cenário de projeto, determinar quais interfaces e/ou classes de coleções devem ser usadas para implementar esse projeto de forma correta, incluindo o uso da interface Comparable.
  • Distinguir substituições corretas e incorretas de métodos hashCode e equals correspondentes e explicar a diferença entre == e o método equals.
  • Escrever código que use versões genéricas da API Collections, especialmente as interfaces Set, List e Map e as classes de implementação. Reconhecer as limitações da API Collections não-genérica e como refatorar o código para usar as versões genéricas.
  • Desenvolver código que faça uso adequado de parâmetros de tipos em variáveis de instâncias, argumentos de métodos, tipos de retornos e declarações de classe/interface, além de escrever métodos genéricos ou métodos que façam uso de tipos de curingas e compreender as semelhanças e as diferenças entre essas duas abordagens.
  • Usar recursos do pacote java.util para escrever código que manipule uma lista por classificação, executando uma pesquisa binária ou convertendo a lista em uma matriz. Usar recursos do pacote java.util para escrever código que manipule uma matriz por classificação, executando uma pesquisa binária ou convertendo a matriz em uma lista. Usar as interfaces java.util.Comparator e java.lang.Comparable para interferir na classificação de listas e matrizes. Além disso, reconhecer o efeito da "ordem natural" de classes wrapper de primitivas e java.lang.String na classificação.

Seção 7: Princípios Básicos
  • Com base em um exemplo de código e um cenário, escrever código que use modificadores de acesso, declarações de pacotes e instruções de importação adequados para interagir (através de acesso ou herança) com o código do exemplo.
  • Com base em um exemplo de classe e de linha de comando, determinar o comportamento em tempo de execução esperado.
  • Determinar o efeito sobre referências de objetos e valores de primitivas quando eles forem passados aos métodos que executam atribuições ou outras operações de modificação de parâmetros.
  • Com base em um exemplo de código, reconhecer em que ponto um objeto se qualifica para a coleta de lixo e determinar o que é garantido ou não pelo sistema de coleta de lixo. Reconhecer os comportamentos de System.gc e finalization.
  • Com base em um nome totalmente qualificado de uma classe implantada dentro e/ou fora de um arquivo JAR, construir a estrutura de diretórios adequada a essa classe. Com base em um exemplo de código e um caminho de classe, determinar se o caminho de classe permitirá uma compilação bem-sucedida do código.
  • Escrever código que aplique corretamente os operadores adequados, incluindo operadores de atribuição (limitados a =, +=, -=), operadores aritméticos (limitados a +, -, *, /, %, ++, --), operadores relacionais (limitados a <, <=, >, >=, ==, !=), o operador instanceof, operadores lógicos (limitados a &, |, ^, !, &amp;amp;&, ||) e o operador condicional ( ? : ), a fim de produzir o resultado desejado. Escrever código que determine a igualdade de dois objetos ou duas primitivas.

quarta-feira, 18 de abril de 2007

Benchmarking

Benchmarking é a busca das melhores práticas na indústria que conduzem ao desempenho superior.

O benchmarking é visto como um processo positivo e pró-ativo por meio do qual uma empresa examina como outra realiza uma função específica a fim de melhorar como realizar a mesma ou uma função semelhante.

É um processo gerencial permanente, que requer atualização constante a coleta e análise cuidadosa daquilo que há de melhor externamente em práticas e desempenho para as funções de tomada de decisões e de comunicações em todos os níveis da empresa. Ele obriga ao teste constante das ações internas em relação aos padrões externos das práticas da indústria.

É um processo de descoberta e de uma experiência de aprendizado. Ele exige a identificação das melhores práticas e a projeção do desempenho futuro.

A idéia por trás do benchmarking é de que ninguém é melhor em tudo. Então, “copiar” modelos de outras empresas significa “economizar” tempo e trabalho.

Por definição, as “cópias” nunca serão iguais. Sempre haverá ajustes, adaptação e aprimoramentos, o que garante a “evolução” da idéia original.


Fonte: wikipedia

terça-feira, 17 de abril de 2007

Mentes

Grandes mentes discutem idéias.

Mentes medíocres discutem eventos.

Mentes pequenas discutem pessoas.

Folksonomia

A folksnomia é uma maneira de indexar informações. Esta expressão foi cunhada por Thomas Vander Wal. É uma analogia à taxonomia, mas inclui o préfixo folks, palavra da língua inglesa que significa pessoas.

O ponto forte da folksonomia é sua construção a partir do linguajar natural da comunidade que a utiliza. Enquanto na taxonomia clássica primeiro são definidas as categorias do índice para depois encaixar as informações em uma delas (e em apenas uma), a folksonomia permite a cada usuário da informação a classificar com uma ou mais palavras-chaves, conhecidas como tags.

Por meio das tags, o usuário pode então recuperar as informações e compartilhá-las. Pode visualizar as tags de outros usuários, assim como identificar o grau de popularidade de cada tag no sistema, e acessar as informações relacionadas.

O primeiro site a usar folskonomia foi o del.icio.us e, em seguida, o flickr e o youTube - três sucessos da Web 2.0.

O Gmail oferece, no lugar de pastas, o recurso de tags para organizar os emails. Entretanto, ele não é um exemplo clássico de folksonomia, pois não permite compartilhar as tags entre usuários do sistema.


Fonte: wikipedia

quinta-feira, 29 de março de 2007

Design Factory II - Editando dataset

Este metodo monta novos dataset para o relatório, de acordo com os parâmetros passados, aqui ele recebe parâmetros que atendiam as minhas necessidades, e que podem parecer um pouco confusos para entender.

Futuramente quando tiver tempo para melhorar o código eu o farei e atualizarei o post aqui, mas por enquanto, isso já será de grande ajuda para quem estiver com o mesmo problema que eu tinha.

Fica a cargo de cada um, implementar novas funcionalidades para este método, mas a estrutura original para incluir o novo dataset no relatório é basicamente esta.


/**
* Controi o novo Data Set com a consulta
* modificada pelo usuário
* @param qry
* @param designFactory
* @param designHandle
*/
void buildDataSet(Long codirela, String qry,
ElementFactory designFactory,
ReportDesignHandle designHandle) {
try {
OdaDataSetHandle dsHandle =
designFactory.newOdaDataSet(
"Data Set",
"org.eclipse.birt.report.data.oda."+
"jdbc.JdbcSelectDataSet");

dsHandle.setDataSource("Data Source");
dsHandle.setName("Data Set");
dsHandle.setQueryText(qry);
designHandle.getDataSets().drop(0);
designHandle.getDataSets().add(dsHandle);
} catch (SemanticException e) {
e.printStackTrace();
}
}

Design Factory I - Editando datasource

Como falei anteriormente, vou postar agora o método de designFactory, onde será alterado algumas particularidades do relatório.

Esse metodo recebe um IReportRunnable e o abre para que seja possivel alterar o dataSource e dataSet, mas podem ser alteradas outras propriedades, ficando para o desenvolvedor decidir sobre o que deve ser mudado.


/**
* Monta a estrutura para o relatorio, criando o data source
*e se necessario o data set
* @param design a ser alterado
*/
private void designFactory(IReportRunnable design) {
FacesContext fc = FacesContext.getCurrentInstance();
ValueBinding vbUser =
fc.getApplication().createValueBinding("#{usuario}");
//Busca o usuario na sessao
Usuario user = (Usuario) vbUser.getValue(fc);

//Busca a url da base no arquivo de propriedades
String base = new ResourceManager().getProperties().
getString(ResourceManager.JDBC_URL).toString();

ReportDesignHandle report =
(ReportDesignHandle) design.getDesignHandle();
ElementFactory designFactory =
report.getElementFactory();


buildDataSource(designFactory, report,
user.getApelpess(),user.getSenhaweb(), base);

// Montar DataSet dinamicamente!
// Esta parte sera melhor descrita em um post posterior
if (ObjRel.getConsulta() != null) {
buildDataSet(ObjRel.getRelatorio().getCodirela(),
ObjRel.getConsulta(), designFactory, report);
}
}

/**
* Monta o data source com o usuario da sessao e base na
* qual ira conectar
* @param designFactory
* @param designHandle
* @param usuario nome do usuario para conectar ao banco
* @param senha senha para conectar ao banco
* @param base url de onde esta a base de dados
*/
void buildDataSource(ElementFactory designFactory,
ReportDesignHandle designHandle, String usuario,
String senha, String base) {
try {
OdaDataSourceHandle dsHandle =
designFactory.newOdaDataSource(
"Data Source",
"org.eclipse.birt.report.data.oda.jdbc");

dsHandle.setProperty("odaDriverClass",
"org.firebirdsql.jdbc.FBDriver");
dsHandle.setProperty("odaURL", base);
dsHandle.setProperty("odaUser", usuario);
dsHandle.setProperty("odaPassword", senha);
dsHandle.setName("Data Source");
designHandle.getDataSources().drop(0);
designHandle.getDataSources().add(dsHandle);
} catch (SemanticException e) {
e.printStackTrace();
}
}

quarta-feira, 28 de março de 2007

Relatorios com o Birt

Segue abaixo um HttpServlet responsável por interpretar arquivo de design do Birt, e exibi-los.
Futuramente irei demonstrar como alterar DataSource e DataSet em tempo de execuçao.


import org.eclipse.birt.report.engine.api.EngineConstants;
import org.eclipse.birt.report.engine.api.HTMLRenderContext;
import org.eclipse.birt.report.engine.api.HTMLRenderOption;
import org.eclipse.birt.report.engine.api.IReportEngine;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.eclipse.birt.report.model.api.ElementFactory;
import org.eclipse.birt.report.model.api.OdaDataSetHandle;
import org.eclipse.birt.report.model.api.OdaDataSourceHandle;
import org.eclipse.birt.report.model.api.ReportDesignHandle;
import org.eclipse.birt.report.model.api.activity.SemanticException;


import java.io.IOException;
import java.io.PrintWriter;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
* Class description
*
*/
public class BuildRelatorio extends HttpServlet {

/** Field description */
private static final long serialVersionUID = 1L;
protected static Logger logger =
Logger.getLogger("org.eclipse.birt");

/**
*
*/
private Connection currentConnection = null;

/**
* Constructor of the object.
*/
private IReportEngine birtReportEngine = null;

/** Field description */
private ObjRelatorio ObjRel;


/**
* Constructs ...
*
*/
public BuildRelatorio() {
super();
}

/**
* Destruction of the servlet.
*
*/
public void destroy() {
super.destroy();
BirtEngine.destroyBirtEngine();
}

/**
* The doGet method of the servlet.
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
public void doGet(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {

// get report name and launch the engine
resp.setContentType("text/html");

// resp.setContentType( "application/pdf" );
ServletContext sc = req.getSession().
getServletContext();

this.birtReportEngine = BirtEngine.
getBirtEngine(sc);

// setup image directory
HTMLRenderContext renderContext =
new HTMLRenderContext();
String pastaImagens = "pastaImagens";

renderContext.setBaseImageURL(pastaImagens);
renderContext.setImageDirectory(pastaImagens);
logger.log(Level.FINE, pastaImagens);

HashMap contextMap =
new HashMap();

contextMap.put(EngineConstants.
APPCONTEXT_HTML_RENDER_CONTEXT, renderContext);

IReportRunnable design;

try {

// Open report design
String reportName = "N";

design = birtReportEngine.
openReportDesign(reportName);

//
Esta parte sera descrita em um post futuro
//designFactory(design);

// create task to run and render report
IRunAndRenderTask task =
birtReportEngine.createRunAndRenderTask(
design);

task.setAppContext(contextMap);

// set output options
HTMLRenderOption options = new HTMLRenderOption();

options.setOutputFormat(HTMLRenderOption.
OUTPUT_FORMAT_HTML);

// options.setOutputFormat(HTMLRenderOption.
OUTPUT_FORMAT_PDF);
options.setOutputStream(resp.getOutputStream());
task.setRenderOption(options);

// run report
task.run();
task.close();
} catch (Exception e) {
e.printStackTrace();
throw new ServletException(e);
}
}

/**
* The doPost method of the servlet. *
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");

PrintWriter out = response.getWriter();

out.println("CODIGOS HTML");

}
/**
* Initialization of the servlet.
*
*
* @throws ServletException if an error occure
*/
public void init() throws ServletException {
BirtEngine.initBirtConfig();
}
}

sexta-feira, 23 de março de 2007

E - mail em Java

Não seria esse o objetivo desse blog, mas, como os atuais acontecimentos mudaram minha perspectiva sobre diversos assuntos, decidi contribuir repassando minhas dificuldades e soluções encontradas, para que se alguém porventura compartilhe das mesmas, consiga melhores respostas.

Essa é uma classe para enviar email, bem simples, porem pode ser útil.




import java.util.Properties;

import javax.faces.application.FacesMessage;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
* @author Mauricio Couto Pelissari
*/
public class EmailSender {
/**
* Envia email atraves do servidor definido
*/
public EmailSender () {
}

// ~--- methods ----------------------

/**
* @param emailDest -
* Email para onde sera enviado (obrigatorio)
* @param emailCopia -
* Email para enviar uma copia da msg
* @param emailCopiaOculta -
* Email para enviar copia oculta
* @param emailEnv -
* Email de onde foi enviado (obrigatorio)
* @param titulo -
* Titulo do email
* @param mensagem -
* Mensagem do email
*/
public void send(String servidor, String emailDest,
String emailCopia, String emailCopiaOculta,
String emailEnv, String titulo,
String mensagem) {
Properties p = new Properties();
if (servidor == null) {
servidor = "Servidor de email padrao";
}

p.put("mail.transport.protocol", "smtp");
p.put("mail.smtp.host",servidor);
p.put("mail.smtp.port", "25");
// p.put("mail.smtp.user", usuario);
// p.put("mail.password", "xxx");
// p.put("mail.smtp.startssl.enable","true");
// p.put("mail.smtp.starttls.enable","true");
// p.put("mail.smtp.auth", "true");
p.put("mail.smtp.debug", "true");
p.put("mail.smtp.socketFactory.port", "25");
// p.put("mail.smtp.socketFactory.class",
// "javax.net.ssl.SSLSocketFactory");
p.put("mail.smtp.socketFactory.fallback", "false");

Session session = Session.getInstance(p, null);

session.setDebug(true);

MimeMessage msg = new MimeMessage(session);

try {

// "de" e "para"!!
msg.setFrom(new InternetAddress(emailEnv.toLowerCase()));
msg.setRecipient(Message.RecipientType.TO,
new InternetAddress(emailDest.toLowerCase()));
if (emailCopia != null) {
msg.setRecipient(Message.RecipientType.CC,
new InternetAddress(emailCopia.toLowerCase()));
}
if (emailCopiaOculta != null) {
msg.setRecipient(Message.RecipientType.BCC,
new InternetAddress(emailCopiaOculta.toLowerCase()));
}

// assunto da mensagem
if (titulo.length() > 0) {
msg.setSubject(titulo);
} else {
titulo = "Sem Titulo!";
}


// corpo da msg
if (mensagem.length() > 0) {
msg.setText(mensagem);
} else {
mensagem = "Sem mensagem!";
}

// Enviando mensagem (tentando)
Transport.send(msg);
} catch (AddressException e) {
e.printStackTrace();
//Tratamento do erro
} catch (MessagingException e) {
e.printStackTrace();
//Tratamento do erro
}
}
}