quarta-feira, 28 de março de 2012

jasper imprimir conforme ordenação do jtable

Como gerar um relatorio no jasper com os dados da jtable, inclusive respeitando a ordem que o usuario colocou quando mandou ordenar a coluna?

primeiro no model voce vai colocar como ultimo elemento o objeto na linha.
para nao mostra-lo basta limitar o numero de coluna no proprio model.


public class ModelAtosRegistradosReport extends AbstractTableModel {

private List{Cliente} list;
private String[] nomeColuna = new String[]{"ID", "Nome"};

public ModelAtosRegistradosReport(List{Cliente} list) {
this.list = list;
}

public int getRowCount() {
return(listAtosRegistrados == null ? 0 : list.size());
}

public int getColumnCount() {
return nomeColuna.length;
}

@Override
public String getColumnName(int column) {
return nomeColuna[column];
}

public Object getValueAt(int rowIndex, int columnIndex) {
final Cliente item = list.get(rowIndex);
switch (columnIndex) {
case 0:
return item.getID();
case 1:
return item.getNome();
default:
return item;
}
}
}


depois eh so pegar o objeto do model e montar seu JRDataSource assim:


for (int i = 0; i < table.getRowCount(); i++) {
Cliente item = (Cliente) table.getModel().getValueAt(table.convertRowIndexToModel(i), table.getModel().getColumnCount());



Da tambem pra vc aproveitar ecolocar um checkbox na jtable para mandar para o relatorio somente os selecionados tambem funga.

terça-feira, 13 de março de 2012

Corretor Ortográfico em Java

Diz a lenda que esse algoritimo é similar ao utilizado pelo google no famoso "Você quis dizer"

o plus do negocio é que esta com as peculariedades do portugues e voce pode adicionar palavras ao dicionario a hora que quizer.

como arquivo de dicionario base eu peguei o .dic do libreoffice e so limpei algum lixo
deu 308.295 palavras (ta bom pra começar ne).

sem mais delongas ai vai o codigo.


import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Spelling {

private final HashMap{String, Integer} nWords = new HashMap{String, Integer}();

private final char[] alfabeto = {'a','á','ä','à','ã','â','b','c','ç','d','e','é','ë','è','ê','f','g','h','i','í','ï','ì','î','j',
'k','l','m','n','o','ó','ö','ò','õ','ô','p','q','r','s','t','u','ú','ü','ù','û','v','x','y','z'};

public Spelling(String file) throws IOException {
BufferedReader in = new BufferedReader(new FileReader(file));
Pattern p = Pattern.compile("[a-z,á,í,ó,ú,é,ä,ï,ö,ü,ë,à,ì,ò,ù,è,ã,õ,â,î,ô,û,ê,ç]+");
for (String temp = ""; temp != null; temp = in.readLine()) {
Matcher m = p.matcher(temp.toLowerCase());
while (m.find()) {
nWords.put((temp = m.group()), nWords.containsKey(temp) ? nWords.get(temp) + 1 : 1);
}
}
in.close();
}

private final ArrayList{String} edits(String word) {
ArrayList{String} result = new ArrayList{String}();
for (int i = 0; i < word.length(); ++i) {
result.add(word.substring(0, i) + word.substring(i + 1));
}
for (int i = 0; i < word.length() - 1; ++i) {
result.add(word.substring(0, i) + word.substring(i + 1, i + 2) + word.substring(i, i + 1) + word.substring(i + 2));
}
for (int i = 0; i < word.length(); ++i) {
for (int z=0; z char c = alfabeto[z];
result.add(word.substring(0, i) + String.valueOf(c) + word.substring(i + 1));
}
}
for (int i = 0; i <= word.length(); ++i) {
for (int z=0; z char c = alfabeto[z];
result.add(word.substring(0, i) + String.valueOf(c) + word.substring(i));
}
}
return result;
}

public final String[] correct(String word) {
if (nWords.containsKey(word)) {
return null;
}
ArrayList{String} list = edits(word);
HashMap{Integer, String} candidates = new HashMap{Integer, String}();
for (String s : list) {
if (nWords.containsKey(s)) {
candidates.put(nWords.get(s), s);
}
}

if (candidates.size() > 0) {
return candidates.values().toArray(new String[0]);
}
for (String s : list) {
for (String w : edits(s)) {
if (nWords.containsKey(w)) {
candidates.put(nWords.get(w), w);
}
}
}
return candidates.size() > 0 ? candidates.values().toArray(new String[0]) : null;
}
}



para testar:



public static void main(String[] args) throws IOException {
JFileChooser jFileChooser = new JFileChooser();
jFileChooser.showOpenDialog(null);
String caminhoDicionario = jFileChooser.getSelectedFile().getAbsolutePath();
Spelling spelling = new Spelling(caminhoDicionario);

String word = null;
while ((word = JOptionPane.showInputDialog("Digite uma palavra"))!=null) {
String[] correct = spelling.correct(word);
if (correct==null) {
JOptionPane.showMessageDialog(null, "Palavra esta correta");
} else {
JOptionPane.showMessageDialog(null, correct, "Você quis dizer...", JOptionPane.QUESTION_MESSAGE);
}
}
}



melhorei um pouco a bagaça versao 2.0 entao:


private final SortedSet{String} nWords = new TreeSet{String}();

private final char[] alfabeto = {'a','á','ä','à','ã','â','b','c','ç','d','e','é','ë','è','ê','f','g','h','i','í','ï','ì','î','j','k','l','m','n','o','ó','ö','ò','õ','ô','p','q','r','s','t','u','ú','ü','ù','û','v','x','y','z'};

public Spelling(String file) throws IOException {
BufferedReader in = new BufferedReader(new FileReader(file));
for (String temp = ""; temp != null; temp = in.readLine()) {
nWords.add(temp);
}
in.close();
}

private ArrayList{String} edits(String word) {
ArrayList{String} result = new ArrayList{String}();
for (int i = 0; i < word.length(); ++i) {
result.add(word.substring(0, i) + word.substring(i + 1));
}
for (int i = 0; i < word.length() - 1; ++i) {
result.add(word.substring(0, i) + word.substring(i + 1, i + 2) + word.substring(i, i + 1) + word.substring(i + 2));
}
for (int i = 0; i < word.length(); ++i) {
for (int z=0; z char c = alfabeto[z];
result.add(word.substring(0, i) + String.valueOf(c) + word.substring(i + 1));
}
}
for (int i = 0; i <= word.length(); ++i) {
for (int z=0; z char c = alfabeto[z];
result.add(word.substring(0, i) + String.valueOf(c) + word.substring(i));
}
}
return result;
}

public final String[] correct(String word) {
if (nWords.contains(word)) {
return null;
}
ArrayList{String} list = edits(word);
SortedSet{String} candidates = new TreeSet{String}();
for (String s : list) {
if (nWords.contains(s)) {
candidates.add(s);
}
}

if (candidates.size() > 0) {
return candidates.toArray(new String[0]);
}
for (String s : list) {
for (String w : edits(s)) {
if (nWords.contains(w)) {
candidates.add(w);
}
}
}
return candidates.size() > 0 ? candidates.toArray(new String[0]) : null;
}


terça-feira, 19 de abril de 2011

WebServices com Arquivos Grandes

Opa,

webservices esta se utilizado para muita coisa hoje em dia, inclusive para troca de arquivos. Como assim? mas tem o protocolo ftp pra isso! Sim mais para resolver problemas de firewall com portas bloqueadas, transferir alem do arquivo mais alguma informação, alem de aproveitar requisitos de segurança do sistema ja implementadas, a saida em alguns casos tem sido webservices mesmo.

Mais para que a coisa funcione, é preciso implementar uma outra tecnologia que faz com que as mensagens soap sejam tranferida como stream, e isso se chama mtom.

veja como a coisa acontece no java:


// o bean


import javax.activation.DataHandler;
import javax.xml.bind.annotation.XmlMimeType;
import javax.xml.bind.annotation.XmlType;

@XmlType
public class Arquivo {

@XmlMimeType("application/octet-stream")
protected DataHandler imagem;

// getter e setter



// o webservice



@WebService
@SOAPBinding(style=Style.RPC, use=Use.LITERAL, parameterStyle=ParameterStyle.WRAPPED)
public class BigFileWebService {

@Autowired
private ArquivoService arquivoService;


public void sendFile(@WebParam(name = "arquivo") Arquivo arquivo) {

try {

FileOutputStream outputStream = new FileOutputStream("/home/michael/Grande.tif");
arquivo.getImagem().writeTo(outputStream);

} catch (Exception e) {
e.printStackTrace();
}

}}



// codigo applicationContext.xml



<jaxws:endpoint
id="BigFileWebServiceEndpoint"
implementor="#BigFileWebService"
address="/BigFile">
<jaxws:properties>
<entry key="mtom-enabled" value="true"/>
</jaxws:properties>
</jaxws:endpoint>

segunda-feira, 14 de fevereiro de 2011

justificar texto quando quebra pagina no jasper

Opa,

jasper e o ireport são os caras mas de fez em quando eles ajudam a tinjir meus cabelos brancos.
o caso era o seguinte, tina que imprimir um texto comprido e quando esse texto extrapolava a pagina
ele nao justificava a ultima linha do texto. Como o jasper quebra em componentes e o compomente quando mandado alinhar horizontalmente, ele faz isso com todas a linhas menos a ultima, o que é correto mas nao quando se é a continuação de um texto que vai imprimir o restante em outra pagina.

Procurando por ajuda no google encontrei outras pessoas com o mesmo problema (Incorrect wrapping of text at end of page), neste forum (http://jasperforge.org/projects/jasperreports/tracker/view.php?id=2874) o amigo Denis criou um path que corrigia isso quando exportado o relatorio em pdf.

No meu caso, nao poderia exportar o relatorio, entao a solução foi mexer direto no codigo fonte do jarper. Segues as alterações que fiz para fungar a bagaça:

baixar codigo fonte do jasper 3.7.2:

arquivo: net.sf.jasperreports.engine.util.JRStyledText.java;

// adicionar attributo
private boolean lastParagraphCompleted;
// getter e setter

arquivo: net.sf.jasperreports.engine.fill.JRFillTextElement.java

linha 1155: tmpStyledText.setLastParagraphCompleted(lastParagraphCompleted);

arquivo: net.sf.jasperreports.engine.export.draw.TextDrawer.java

linha 199:
JRStyledText result = textElement.getStyledText(JRStyledTextAttributeSelector.NO_BACKCOLOR);
result.setLastParagraphCompleted(textElement.isLastParagraphCompleted());
return result;

arquivo: net.sf.jasperreports.engine.export.TextRenderer.java

linha 177: renderParagraph(allParagraphs, lastParagraphStart, lastParagraphText, !styledText.isLastParagraphCompleted());

linha 261: private void renderParagraph(
AttributedCharacterIterator allParagraphs,
int lastParagraphStart,
String lastParagraphText,
boolean isJustifica // acidiona parametro
)
{

linha 336: if ((lineMeasurer.getPosition() < paragraph.getEndIndex()) || (isJustifica))
{
layout = layout.getJustifiedLayout(formatWidth);
}

quinta-feira, 4 de novembro de 2010

@autowired + @webservice sem nullpointerexception

Opa,
Fato estranho esta acontecendo com um webservice que esta lançando um nullpointerexception
tando a classe Service como a clase WebService esta anotada e inicializava normal publicando o serviço,mas quando tentava usar (consumir) o serice que estava anotado com Autowired esta nulo,
ou seja, o spring não estava injetando.

Checado todas as anotações e verificado a ordem de inicialização do spring, percebi que a minha classe anotada com @webservice que não tinha interface nenhuma, tinha que ser percebida primeiro pelo spring so depois pelo CXF, entao como fazer isso?

segue o codigo:

<context:component-scan base-package="br.com.cri.service" />

<context:annotation-config/>

<context:component-scan base-package="br.com.cri.ws">
<context:include-filter type="annotation" expression="javax.jws.WebService" />
/context:component-scan>

import resource="classpath:META-INF/cxf/cxf.xml" />
import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

<jaxws:endpoint
id="matonWebServiceEndpoint"
implementor="#matonWebService"
address="/MatriculaOnLine" />



a classe Service é normal, so colocar o @Service

a classe WebService ficou assim:




@WebService
@SOAPBinding(style=Style.RPC, use=Use.LITERAL, parameterStyle=ParameterStyle.WRAPPED)
public class MatonWebService {

@Autowired
private MatriculaService matriculaService;


public Retorno atualizandoServentia(@WebParam(name = "serventia") String id,
@WebParam(name = "atualizando") boolean atualizando) {
return matriculaService.atualizandoServentia(id, atualizando, true);
}

sexta-feira, 15 de outubro de 2010

Definições de problemas com thread

Estudando multithread inventei algumas definições:

Deadlock: quando os banco estão em greve.

Starvation: quando tem um cobrador na sua frente com uma baita pasta cheia de documentos pra pagar.

Livelock: um dia depois de acabar a greve e voce tem enfrentar fila.

sexta-feira, 30 de julho de 2010

getContentType from File

Dica simples, como pego o contenttype de uma determinado arquivo para jogar na resposta de um servelt por exempo


FileTypeMap fMap = FileTypeMap.getDefaultFileTypeMap();
String contentType = fMap.getContentType(new File("test.pdf")));

ou

FileNameMap fileNameMap = URLConnection.getFileNameMap();
String tipo = fileNameMap.getContentTypeFor(new File("test.pdf").getName());