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
}
}
}