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