Boas Práticas – Dica nº 2
10/setembro/2010 - Geral
Olá,
A dica de hoje é mover números mágicos do código para constantes com nomes sugestivos para facilitar a leitura por quem for dar manutenção futuramente.
No exemplo abaixo, o valor utilizado para converter km/h em m/s e vice-versa é 3.6, ao invés de repetir esse número várias vezes, colocamos em uma constante e usamos ela em todos os lugares que precisamos.
public double converterKMH2MS(double velocidade){
return velocidade / 3.6;
}
public double converterMS2KMS(double velocidade){
return velocidade * 3.6;
}
O código melhorado ficaria assim:
//
public static final double FATOR_CONVERSAO_KMH_MS = 3.6;
public double converterKMH2MS(double velocidade){
return velocidade / FATOR_CONVERSAO_KMH_MS;
}
public double converterMS2KMS(double velocidade){
return velocidade * FATOR_CONVERSAO_KMH_MS;
}
Dependendo da quantidade de constantes que você tem no seu sistema é bom agrupá-las em uma interface.
Até mais,
Roberto
Boas Práticas – Dica nº 1
04/setembro/2010 - Java
Bom dia,
Ter um blog não é nada fácil, este aqui por exemplo está abandonado já faz quase um mês. A maior dificuldade é encontrar assuntos pra postar. Por isso tive uma idéia, postar uma série de dicas de boas práticas de codificação.
A idéia é mostrar com dicas simples como melhorar o código, evitando erros e melhorando a codificação.
Nesta primeira dica, mostrarei como evitar um NullPointerException toda vez em que fazemos uma comparação com objetos com uma constante. Muita gente já conhece essa técnica, principalmente os mais experientes, mas nunca é demais lembrar.
A dica é: Sempre coloque a constante à esquerda (ou o objeto que você terá certeza que não estará nulo) da condição.
Veja o exemplo abaixo:
public boolean validar(String result) {
if ("OK".equals(result)) {
return true;
} else {
return false;
}
}
O código acima compara o parâmetro result com a constante OK que está a esquerda da condição.
Se result for nulo o método retornará false.
Já dei manutenção em código que estava assim:
public boolean validar(String result) {
if (result == null) {
result = "";
}
if ("OK".equals(result)) {
return true;
} else {
return false;
}
}
Percebam que colocaram um if desnecessário só para atribuir uma string vazia ao parâmetro, afim de evitar o NullPointerException no próximo if. Além de ser feio fazer atribuições aos parâmetros, aumenta a complexidade de uma futura manutenção.
Por hoje é só.
Até mais,
Roberto
Alterar senha do usuário sys do Oracle XE
12/agosto/2010 - Geral
Olá!
Caso você tem instalado um banco de dados Oracle 10g XE e não se lembra mais da senha do usuário SYS siga os passos abaixo para alterar a senha dele.
1) Abra o SQL*Plus. No botão iniciar escolha a opção “Executar Linha de Comandos SQL”;
2) Conecte-se com o comando abaixo:
SQL> connect / as sysdba
Conectado.
3) Altere a senha do usuário
SQL> alter user sys identified by
Usuário alterado.
Pronto. Agora você poderá acessar http://127.0.0.1:8080/apex/, digitar o usuário sys e a
Até mais,
Roberto
Relatório Dinâmico com JasperDesign
08/junho/2010 - Java
Olá
Que tal fazer um relatório sem iReport? e sem ter de fazer o JRXML? e ser montada de dinamicamente?
Pois isso é possível usando algumas classes do JasperReports como a JasperDesign, JRDesignBand, JRDesignStaticText, JRDesignField e JRDesignExpression. Não é muito complicado fazer isso não como você podem ver no exemplo que fiz, o mais díficil mesmo é posicionar os elementos na página. Precisa usar muito a imaginação.
Basicamente é feito tudo pela classe abaixo.
package br.com.furutani.reldin;
import java.awt.Color;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.design.JRDesignBand;
import net.sf.jasperreports.engine.design.JRDesignExpression;
import net.sf.jasperreports.engine.design.JRDesignField;
import net.sf.jasperreports.engine.design.JRDesignStaticText;
import net.sf.jasperreports.engine.design.JRDesignTextField;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.type.HorizontalAlignEnum;
public class ReportDesigner {
public JasperDesign getDesign() throws JRException {
// Cria um novo relatório
JasperDesign jasperDesign = new JasperDesign();
// PAGE
configPage(jasperDesign);
// FIELD
JRDesignField field = null;
addField("referencia", String.class, jasperDesign);
addField("consumo", Integer.class, jasperDesign);
// TITLE
JRDesignBand jrDesignband = null;
JRDesignStaticText staticText = null;
configTitle(jasperDesign);
// PAGE HEADER
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(15);
jasperDesign.setPageHeader(jrDesignband);
// COLUMN HEADER
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(25);
jasperDesign.setColumnHeader(jrDesignband);
//Dados da referencia
staticText = new JRDesignStaticText();
staticText.setX(0);
staticText.setY(5);
staticText.setWidth(150);
staticText.setHeight(15);
staticText.setHorizontalAlignment(HorizontalAlignEnum.LEFT);
staticText.setText("Referência - Mês/Ano");
staticText.setBold(true);
jrDesignband.addElement(staticText);
//Dados do consumo
staticText = new JRDesignStaticText();
staticText.setX(150);
staticText.setY(5);
staticText.setWidth(100);
staticText.setHeight(15);
staticText.setHorizontalAlignment(HorizontalAlignEnum.RIGHT);
staticText.setText("Consumo - kWh");
staticText.setBold(true);
jrDesignband.addElement(staticText);
// DETAIL
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(20);
//Dados da referencia
JRDesignTextField textField = new JRDesignTextField();
textField.setBlankWhenNull(false);
textField.setX(0);
textField.setY(5);
textField.setWidth(150);
textField.setHeight(15);
// Adiciona a expressao no campo
JRDesignExpression expression = new JRDesignExpression();
expression.setValueClass(java.lang.String.class);
expression.setText("$F{referencia}");
textField.setExpression(expression);
jrDesignband.addElement(textField);
//Dados do consumo
textField = new JRDesignTextField();
textField.setBlankWhenNull(false);
textField.setX(200);
textField.setY(5);
textField.setWidth(50);
textField.setHeight(15);
textField.setHorizontalAlignment(HorizontalAlignEnum.RIGHT);
//Adiciona a expressao no campo
expression = new JRDesignExpression();
expression.setValueClass(java.lang.Integer.class);
expression.setText("$F{consumo}");
textField.setExpression(expression);
jrDesignband.addElement(textField);
jasperDesign.setDetail(jrDesignband);
// COLUMN FOOTER (Escondido)
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(0);
jasperDesign.setColumnFooter(jrDesignband);
// PAGE FOOTER (Escondido)
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(0);
jasperDesign.setPageFooter(jrDesignband);
// NO DATA (No JasperViewer não mostra, na web mostraria)
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(20);
staticText = new JRDesignStaticText();
staticText.setX(10);
staticText.setY(5);
staticText.setWidth(64);
staticText.setHeight(15);
staticText.setText("Sem registros para compor o relatório!");
staticText.setHorizontalAlignment(HorizontalAlignEnum.CENTER);
jrDesignband.addElement(staticText);
jasperDesign.setNoData(jrDesignband);
// SUMMARY (Escondido)
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(0);
jasperDesign.setSummary(jrDesignband);
return jasperDesign;
}
/**
* Ajusta os parametros do titulo
* @param jasperDesign
*/
private void configTitle(JasperDesign jasperDesign) {
JRDesignBand band = new JRDesignBand();
band.setHeight(50);
JRDesignStaticText staticText = new JRDesignStaticText();
staticText.setX(10);
staticText.setY(10);
staticText.setWidth(450);
staticText.setHeight(40);
staticText.setFontName("Tahoma");
staticText.setForecolor(Color.BLUE);
staticText.setHorizontalAlignment(HorizontalAlignEnum.CENTER);
staticText.setFontSize(24);
staticText.setPdfFontName("Helvetica-Bold");
staticText.setBold(true);
staticText.setText("Histórico de Consumo");
band.addElement(staticText);
jasperDesign.setTitle(band);
}
/**
* Adiciona campos ao relatorio
* @param name
* @param clazz
* @param jasperDesign
* @throws JRException
*/
private void addField(String name, Class clazz, JasperDesign jasperDesign)
throws JRException
{
JRDesignField field = new JRDesignField();
field.setName(name);
field.setValueClass(clazz);
jasperDesign.addField(field);
}
/**
* Configura a pagina
* @param jasperDesign
*/
private void configPage(JasperDesign jasperDesign) {
jasperDesign.setPageWidth(500);
jasperDesign.setPageHeight(1000);
jasperDesign.setColumnCount(1);
jasperDesign.setColumnWidth(450);
jasperDesign.setColumnSpacing(0);
jasperDesign.setLeftMargin(10);
jasperDesign.setRightMargin(10);
jasperDesign.setBottomMargin(5);
jasperDesign.setTopMargin(5);
jasperDesign.setName("RelatorioDeConsumo");
}
}
O exemplo foi feito no Eclipse Galileo. Não foi usado nada de web apesar de ser facilmente adaptado para rodar em ambiente web.
Adicione as bibliotecas no classpath do projeto que estão dentro de <DIR_INSTALL>\iReport-3.7.2\ireport\modules\ext para compilar os fontes:
ant-1.7.1.jar
antlr-2.7.6.jar
asm-attrs.jar
asm.jar
barbecue-1.5-beta1.jar
barcode4j-2.0.jar
batik-anim.jar
batik-awt-util.jar
batik-bridge.jar
batik-css.jar
batik-dom.jar
batik-ext.jar
batik-gvt.jar
batik-parser.jar
batik-script.jar
batik-svg-dom.jar
batik-svggen.jar
batik-util.jar
batik-xml.jar
bcel-5.2.jar
bsh-2.0b4.jar
castor-1.2.jar
cglib-2.1.jar
cincom-jr-xmla.jar
commons-beanutils-1.8.2.jar
commons-collections-3.2.1.jar
commons-dbcp-1.2.2.jar
commons-digester-1.7.jar
commons-javaflow-20060411.jar
commons-logging-1.1.jar
commons-math-1.0.jar
commons-pool-1.3.jar
commons-vfs-1.0.jar
dom4j-1.6.jar
ehcache-1.1.jar
eigenbase-properties-1.1.0.10924.jar
eigenbase-resgen-1.3.0.11873.jar
eigenbase-xom-1.3.0.11999.jar
ejb3-persistence.jar
groovy-all-1.5.5.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
hibernate3.jar
hsqldb-1.8.0-10.jar
iText-2.1.7.jar
iTextAsian.jar
jakarta-bcel-20050813.jar
jasperreports-3.7.2.jar
jasperreports-chart-themes-3.6.2.jar
jasperreports-extensions-3.5.3.jar
jasperreports-fonts-3.7.2.jar
javacup.jar
javassist-3.4.GA.jar
jaxen-1.1.1.jar
jcommon-1.0.15.jar
jdt-compiler-3.1.1.jar
jfreechart-1.0.12.jar
jpa.jar
js_activation-1.1.jar
js_axis-1.4patched.jar
js_commons-codec-1.3.jar
js_commons-discovery-0.2.jar
js_commons-httpclient-3.1.jar
js_jasperserver-common-ws-3.5.0.jar
js_jaxrpc.jar
js_mail-1.4.jar
js_saaj-api-1.3.jar
js_wsdl4j-1.5.1.jar
jta.jar
jxl-2.6.jar
log4j-1.2.15.jar
mondrian-3.1.1.12687-Jaspersoft.jar
olap4j-0.9.7.145.jar
png-encoder-1.5.jar
poi-3.5-FINAL-20090928.jar
rex-20080421.jar
rhino-1.7R1.jar
saaj-api-1.3.jar
slf4j-api.jar
slf4j-log4j12.jar
spring.jar
sqleonardo-2007.03.jar
swingx-2007_10_07.jar
xml-apis-ext.jar
xml-apis.jar
O projeto do Eclipse com os fontes está disponível no link abaixo:
JasperDinamico
O resultado será esse:
Até mais,
Roberto
Tutoriais sobre Serviços Web e WS-BPEL
08/março/2010 - SOA
Olá,
Estou escrevendo este post é para divulgar dois excelentes tutoriais escritos por Fabrício Rocha como resultado de um trabalho que ele faz na Universidade de São Paulo e que com certeza vão ajudar muita gente.
Este tutorial contempla os conceitos essênciais para entendimento dos serviços web como o XML, WSDL, UDDI e SOAP e também como eles se encaixam na Arquitetura Orientada a Serviços (SOA).
- BPEL – Business Process Execution Language Tutorial: Implementando um Processo de Negócio com BPEL –

Tratando com profundidade o padrão WS-BPEL, este tutorial apresenta os principais componentes dessa linguagem baseada em XML e um exemplo prático de implementação de um processo de negócio com as ferramentas da Oracle e da Microsoft.
Até mais,
Roberto

