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

segunda-feira, 3 de maio de 2010

MVC+J

Opa, maio mês das noivas e como diz um amigo meu, casar é bom, mas morrer queimado é um pouquinho pior :)
Ok sem mais delongas vou comentar a respeito de um novo conceito que recentemente vi na web o MVC+J.

Você ja deve ter ouvido falar do famoso MVC (Model, View e Control), agora o que esse J ta fazendo ai? É j de ajax, ou seja é aquela pagina que dinamicamente vai ganhando conteudo ou realizando chamadas sem precisar realizar uma nova requisição na pagina inteira.

Entao temos as seguintes opções:

Model - Dao´s, Services utilizando JPA(hibernate, toplink), JDBC, WebServices geralmente o Spring integrando tudo.

Control - Frameworks web como o proprio Spring MVC, Faces, Struts, WebWork

View - JSP com JSTL, JSF, Groovy

e o J - com JQuery, Prototype, DoJo.

A arquitetura que escolhi foi String com iBatis, e por ja utilizar o framework Spring, aproveitei a parte web dele com o Spring MVC, com view em JSP com JSTL, e jQuery por ser o mais rapido e tem um grande numero de widgets (componente) escritos com sua linguagem.

Outra teoria minha é que esse J possa ser de JSON uma vez que os componentes jQuery podem fazer interação direto com os controller´s utilizando essa anotação.

quarta-feira, 14 de abril de 2010

JQuery, IE6, and 'Could not set the selected property. Unspecified error.'

Opa,

pela primeira vez o jQuery me decepcionou, brincadeira, a culpa nao é dele e sim do Internet Explorer.

estava fazendo um form com dois combos um para ano e outro pra mes, e gostaria que viesse selecionado os itens da data atual.

utilizei

$("#mesoption[value='04']").attr('selected', 'selected');


so que testando no IE6 da o erro Could not set the selected property. Unspecified error, pesquisando no google parece que é um problema do DOM.

então a solução foi colocar selected no momento da criação do option

var listMes = {'01':'Janeiro', '02':'Fevereiro', '03':'Março', '04':'Abril', '05':'Maio', '06':'Junho', '07':'Julho', '08':'Agosto', '09':'Setembro', '10':'Outubro', '11':'Novembro', '12':'Dezembro'};
var agora=new Date();
var mesAtual = agora.getMonth();
var anoAtual = agora.getFullYear();
var optionSelected = "<option selected>/option>";
var optionNormal = "<option>/option>";

.each(listMes, function(key, value)
{
$('#mes').append($((parseInt(mesSelected) == parseInt(key) ? optionSelected : optionNormal)).attr("value",key).text(value));
});


ok assim funga o trem

terça-feira, 23 de fevereiro de 2010

DPEC Erro Root element is missing

Opa,
esse mês gostaria de continuar escrevendo sobre o spring security e como utiliza-lo atravez de anotação, mas acabei compranto um iphone, dai pensei em escrever um tutorial de como turbinalo, mas vou acabar escrevendo sobre um problema enfrentado que me tirou toda a atenção esses mês :(

Server was unable to process request. ---> Root element is missing.

Esse erro é retornado quando é enviado uma DPEC(resumo das notas fiscais eletronicas) ao projeto NF-e. O erro aparentemente é causado por alguma falha na formatação do XML certo?

Não, infelizmente não é o caso. Justifico:

Primeiro e mais estranho - A mesma DPEC uma hora é aceita outra hora o erro ocorre.
Segundo - O exemplo do manual de contiguencia esta tudo errado e nao serve de base para conferencia.
Terceiro - eu testei com 3 (três maneiras diferentes de envio e a mesma coisa acontecia.
Quarto (já tava no desespero), interceptei as mensagem enviado do proprio programa emissor do projeto que é disponibilizado gratuitamente, e estava igual ao do meu sistema.
Quinto - o erro tambem o ocorre no sitema deles kkkkkkkkkkkkkkk (ri alto)
Sexto - enviei email para o suporte, liguei no 0800, liguei ate em sao paulo na prodesp e ninguem sabe me responder o que acontece

Então meus amigos, o que fazer? Rezar paro o sistema não precisar de contingência?
O que aqui no Paraná quase nao acontece (rir alto)

sexta-feira, 15 de janeiro de 2010

Spring Security 3.0

Opa,

de volta das festas, resolvi criar um projeto utilizando maven,
ja tinha visto alguma coisa na pos-graduaçao, mas o desafio
era maior agora, pois quero criar um projeto que vai utilizar
ibatis na parte de persistencia, e Spring MVC para camada web
e Spring Security para controlar as permissoes do usuario e seu login.

Inicialmente coloquei o plugin m2eclipse (http://docs.codehaus.org/display/M2ECLIPSE/Home),
com ele no eclipse eu ja crio o projeto com o artefact para web.

Uma vez criado o projeto, vamos ao famoso pom.xml. Como eu queria utilizar a ultima versao do Spring a 3.0 o arquivo ficou assim:


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>br.com.mactus</groupId>
<artifactId>projectus</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Gerenciador de Projetos da Mactus Infomatica</name>
<url>http://projectus.mactus.com.br</url>
<repositories>
<repository>
<id>spring-milestone</id>
<name>Spring Milestone Repository</name>
<url>s3://maven.springframework.org/milestone</url>
</repository>
<repository>
<id>ibatis</id>
<name>Ibatis repo</name>
<url>http://svn.apache.org/repos/asf/ibatis/java/ibatis-2/trunk/ibatis-2-core/</url>
</repository>
<repository>
<id>spring-maven-milestone</id>
<name>Springframework Maven Repository</name>
<url>http://s3.amazonaws.com/maven.springframework.org/milestone</url>
</repository>

</repositories>
<pluginRepositories>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>



<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-acl</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.version}</version>
</dependency>




<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-sqlmap</artifactId>
<version>2.3.4.726</version>
</dependency>


</dependencies>
<build>
<finalName>projectus</finalName>
</build>
<properties>
<spring.version>3.0.0.RELEASE</spring.version>
</properties>
</project>



O proximo passo foi colocar as configuraçoes certa em cada xml de configuracao do webproject

web.xml


<web-app>

<display-name>Archetype Created Web Application</display-name>

<welcome-file-list>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>

<!-- Carrega as configuraçoes do Spring security-->

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-security.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Mapeamento para o String MVC-->

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>

<!-- Adicionar filtro para Segurança-->

<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


<!-- Vincular httpsession com o esquema de segurança do Spring-->

<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>

</web-app>


applicationContex-security.xml


<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd">

<http auto-config='true'>

<intercept-url pattern="/login.htm" filters="none" />
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login login-page="/login.htm" always-use-default-target="false"
authentication-failure-url="/login.htm?authfailed=true" />
<logout invalidate-session="true" logout-success-url="/login.htm?loggedout=true"/>

<session-management>
<concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/>
</session-management>

</http>

<!-- Aqui voce pode substituir por um bean que vai no banco de dados e verificao o usuario -->

<authentication-manager>
<authentication-provider>
<user-service>
<user name="user1" password="pass1" authorities="ROLE_USER, ROLE_ADMIN" />
<user name="user2" password="pass2" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>

</beans:beans>


dispatcher-servlet.xml


<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:annotation-config />

<context:component-scan base-package="br.com.mactus.web"/>

<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

</beans>


Com essas configuraçoes voce ja pode inicial um projeto com autenticacao
para continuar voce vai fazer a parte de dao e service mas dai voce pode escolher
como vai fazer, com jdbc simples, hibernate, toplink... tudo por conta do Spring

Para finalizar vou colocar um exemplo de controller



@Controller
public class MainController {


@RequestMapping(value="/index", method = RequestMethod.GET)
public String index() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication.getAuthorities().contains("ROLE_ADMIN")) {
return "redirect:homeAdmin.htm";
} else {
return "redirect:home.htm";
}
}

@RequestMapping(value="/login", method = RequestMethod.GET)
public void login() {

}

@RequestMapping(value="/home", method = RequestMethod.GET)
public void home() {

}

@RequestMapping(value="/homeAdmin", method = RequestMethod.GET)
public void homeAdmin() {

}

}




Pra comerçar a brincadeira e´ isso por enquanto..

quinta-feira, 22 de outubro de 2009

Reflexão em Flex

Como diz um amigo meu:
Opa,

ainda estou apanhando com o flex, mas sei que no começo é assim mesmo
igual a irmão mais novo, despois que cresce ja viu ne...

para fazer reflexao em flex é mais ou menos assim:

flash.utils.getQualifiedClassName(obj:Object); // para pegar o qualify name de um obejto

e getDefinitionByName(name:String); // para pegar um objeto a partir de uma string;

exemplos:

var methodRef:Function = Function(flash.utils.getDefinitionByName(method));
methodRef.call(this);

var classReference:myClass;
var klas:Class=getDefinitionByName("myClass") as Class;



então a dica é a seginte: para elaborar um menu eu passava como parametro o objeto da janela que queria abrir para uma funcao showForm, no meu caso. So que mesmo passano o caminho correto recebia o erro:

Variable List is not defined. at global/flash.utils::getDefinitionByName()....

então, o esquema é criar uma variavel do tipo que vc vai instanciar por reflexao para o copilador nao se perder. ( eu sei que no Java isso nao precisa :p)

ex:


var formUsuario:usuario.List;
var formPassaro:passaro.List;
var formAlterarSenha:usuario.AlterarSenha;
new Util().showForm(this, getDefinitionByName(item) as Class);

segunda-feira, 19 de outubro de 2009

Conversao latin1 para utf-8

Uma dica rapida para outubro nao passar em branco.

como uso o postgres desde a versao 6.4
no inicio para aceitar os caracteres do brasil utilizava o latin1
como enconding.

hoje na versao 8.4 o suporte a utf-8 esta se tornando padrao, entao o
que fazer para migrar as bases antigas?

Resposta esta na utilizacao de conversores de codificaçao do arquivo de backup.

para linux faça o seguinte:

- Gere um backup normal com pg_dump:
pg_dump -i banco > backup.sql

- utilize recodificadores de caracteres, no meu caso escolhi o recode (http://www.gnu.org/software/recode/recode.html):
recode l1..utf8 backup.sql

- por final, edite o arquivo para retirar o SET client_encoding = 'LATIN1'; que o pg_dump gera:
vim backup.sql

- feito isso basta importa o backup para o novo banco ja criado com a codificaçao UTF-8
psql banco < backup.sql

sexta-feira, 11 de setembro de 2009

Palestra sobre Java Mobile com Roger Brinkley (Sun Microsystems)

Opa,

Dia 10 de setembro em maringa, mais precisamente no Cesumar, foi realizado uma palestra : "O futuro do desenvolvimento móvel com JavaME", com Roger Brinkley.

Roger Brinkley é o Líder da Comunidade Móvel & Embarcados da Sun Microsystems. É responsável pelo desenvolvimento comunitário relacionado a tecnologias Java ME. Roger possui mais de 30 anos de experiência profissional, sendo mais de 14 na Sun. É um palestrante asssíduo em conferências técnicas ao redor do mundo.

Estive la, com a ajuda (leia-se carona) do pessoal da unimake, e pude conferir de perto, estava na primeira fila, mais sobre o assunto.

O cara é estranho, começou lançando duas bolinhas de brinde da sun, com taco de golf,
pensei, hoje eu ganho brinde, que nada, foram os unicos de todo o encontro.

A desculpa foi que o tudo foi arranjado na hora, e ate o datashow e a tradução falharam.

Roger basicamente comentou sobre tres aspectos: mobile, tv digital, e embarcados.

Em relação a parte movel, ele comentou de um novo projeto chamado phoneME, que vai começar a vir no celulares para daqui uns 6 meses, esse projeto traz recursos avançados para o desenvolvedor inventar moda no celular. Assim ele pode programar para um e rodar em qualquer dispositivo com phoneME e tera o mesmo resultado, a mesma cara no caso. Comentou tambem sobre o lwuit (https://lwuit.dev.java.net/) que é um conjunto de componente para trabalhar com java me.

Na parte da tv digital o fato importante esta que a tecnologia brasileira esta toda em java, ele falou de projeto nos EUA o que pra mim ainda nao vem ao caso.

Por final, os embarcados (brinquedinhos caros), foi a que o pessoal gostou mais. Ele demonstrou o SUN SPOT, uns cubinhos que rodam aplicações java, que da pra inventar um monte de coisa, exemplo que ele demonstrou:

- um spot jogando bola com outro
- um carinho robo que desvia de obstaculos e ate de buraco
- um luva do tipo minority report, que ele usou para manipular imagens
- um dipositivo do tamnaho de uma carteira aberta que recebe dispositivos plug-play

Ja no no pinga-fogo, onde era proibido fazer pergunta sobre a oracle, o destaque foi para a resposta sobre o phoneME em relação o Java FX, a ide nova para programar para java mobile, e o suporte a multi-touch e android.

Do mais, o evento foi muito bom pois revi amigos e professores, e é bom ficar interado um pouco sobre novas tecnologias :)

terça-feira, 18 de agosto de 2009

replicaçao postgres morna quase pelando

Voltamos!

E hoje num dia chuvoso nada melhor que escrever um tutorial
- Ta loko!
- Por que?
- Bom mesmo e´ se funcionar :)

depois de algumas pesquisas(google) de como fazer replicaçao com bando de dados
postgres chegamos a alguns resultados:

Com slony, ´e legal quando voce quer replicar determinadas partes do banco,
e tem o pgadmin que ajuda muito na configuracao. Contras nao replica
objetos largos. qualquer coisa que mexer no master ex. alterar tipo de campo, criar tabela
tem que fazer a mesma coisa no slave, o replicador nao faz automatico.

Com pgcluter precisa de no minimo tres maquinas, em algums casos com maquina virtual
vc coloca pra funcionar tudo na mesma maquina, mas dai nao tem vantagem :(

Ai foi que nosso amigo Edson (unimake), sugeriu o modo standby, no qual o slaver fica sendo atualizado
pelo master em um determinado tempo e no que precisa esta pronto para entrar em produçao.

Em busca de mais detalhes desse modo, descobrimos que existe o modo hot, e warm,
o hot o slave fica no ar e esta apto para consultas, no modo war o slave fica baixado

E com base nesse tutorial (http://www.gulbf.com.br/?q=node/33) estamos fornecendo um modo
de fazer isso.

O ambiente testado foi ubuntu e a versao do postgresql 8.3.

Para facilitar vamos utilizar simbolos para descrever onde o comando deve ser executado:
* na maquina master @
* na maquina slave #

- instalar o postgres:
# @ apt-get install postgresql

- instalar o rsync
# @ apt-get install rsync

- parar o banco
# invoke-rc.d postgresql-8.3 stop

- habilitar a conexao do ssh por chave publica
@ ssh-keygen

- copiar a chave publica para a slave
@ scp .ssh/id_rsa.pub root@192.168.1.x:/root/

- copiar o arquvio para .ssh/authorized_keys se nao existir
# cp /root/id_rsa.pub /root/.ssh/authorized_keys
- ou ediar se exister e colar o conteudo do id_rsa.pub para dentro
# vim .ssh/authorized_keys

- igualar o UID do usuario e do grupo postgres de ambas as maquinas

# vim /etc/group
# find / -group 109 -exec /bin/chown -v .125 {} \;
- onde o 109 era o uid antigo e 125 ´e o uid novo, caso for diferente o uid do slave em relacao ao master

# vim /etc/passwd
- lembrar de alterar o uid do group caso foi alterado acima
# find / -user 104 -exec /bin/chown -v 113 {} \;
- onde o 104 era o uid antigo e 113 ´e o uid novo, caso for diferente o uid do slave em relacao ao master

- mover o diretorio da instalacao e preparar um novo para recever os arquivo do master
# mv main/ main-old/
# mkdir main
# chown postgres:postgres main -R

Tudo pronto so sincronizar e rezar

@ /usr/bin/rsync -Cravzp /var/lib/postgresql/8.3/main/ root@192.168.1.x:/var/lib/postgresql/8.3/main/

Funciono? Graças a Deus?

agora so colocar um scrpt prar a cada intervalo sincronizar


#!/bin/bash
echo 'Iniciando sincronizacao de arquivos...'
/usr/bin/rsync -Cravzp /var/lib/postgresql/8.3/main/ root@192.168.1.x:/var/lib/postgresql/8.3/main/
echo 'Finalizado.'
echo 'Aguardando proxima sincronizacao...'
sleep 60
exec $(pwd)/replica.sh




Entao vou acrescentar mais algumas dicas como forma de melhoria do post

a primeira dela é simples, para poder configurar o rsync para poder conectar em uma porta diferente do ssh. Deve-se utilizar o parametro:
/usr/bin/rsync -Cravzp --rsh='ssh -p2220'

a segunda é tambem relacionada ao rsync. Em alguns casos o servidor slave pode executar o comando de sincronismo sem problemas, assim varias maquinas podem ser sincronizadas ou tambem, por algum motivo de segurança o servidor nao pode acessar o ssh do slave.

a terceira é importante! nao foi colocado nesse post mas é recomendavel habilitar os archives do postgres, assim se o db no master corromper, a replicação é repassada mas pelo logs da pra recuperar

sexta-feira, 29 de maio de 2009

Margem espelho ireport (jasper para os leigos)

Trata-se de uma POG utiliza para gerar relatorios com margem espelhos:
o esquema ´e o seginte:
- cria-se dois relatorios iguais no conteudo, um com a margem certa e outro com a margem recuada
- depois passa pegando uma folha de cada para gerar o relatorio final



Report report = new Report(txDateInitial.getText(), txDateFinal.getText());
report.setBeginBefore(beginBefore);
report.setIsVerso((rbFrente.isSelected() ? Boolean.FALSE: Boolean.TRUE));
report.setFolha(folha);


String pathReportRecto = Util.getResource().getProperty("pathReportRecto");
JasperPrint printRecto = report.getReport(pathReportRecto);

String pathReportVerso = Util.getResource().getProperty("pathReportVerso");
report.setFolha((rbFrente.isSelected() ? folha-1: folha));
JasperPrint printVerso = report.getReport(pathReportVerso);

JasperPrint jasperPrint = new JasperPrint();
jasperPrint.setOrientation(JasperReport.ORIENTATION_LANDSCAPE);
jasperPrint.setName("Protocolo");

if (rbFrente.isSelected()) {
jasperPrint.setPageWidth(printRecto.getPageWidth());
jasperPrint.setPageHeight(printRecto.getPageHeight());
} else {
jasperPrint.setPageWidth(printVerso.getPageWidth());
jasperPrint.setPageHeight(printVerso.getPageHeight());
}

int i = 0;
Iterator<jrprintpage> iterator = printRecto.getPages().iterator();
Iterator<jrprintpage> iterator2 = printVerso.getPages().iterator();

if (rbFrente.isSelected()) {

while ( iterator.hasNext() ){
if (i % 2 == 0) {
jasperPrint.addPage(i, iterator.next());
if (iterator2.hasNext())
iterator2.next();
} else {
jasperPrint.addPage(i, iterator2.next());
if (iterator.hasNext())
iterator.next();
}
i++;
}

} else {
while ( iterator2.hasNext() ){
if (i % 2 == 0) {
jasperPrint.addPage(i, iterator2.next());
if (iterator.hasNext())
iterator.next();
} else {
jasperPrint.addPage(i, iterator.next());
if (iterator2.hasNext())
iterator2.next();
}
i++;
}

}

report.closeConnection();


if (jasperPrint.getPages().size()>0) {
Preview preview = new Preview(jasperPrint);
preview.setVisible(true);
preview.setExtendedState(MAXIMIZED_BOTH);
} else {
JOptionPane.showMessageDialog( this, "Os parametros informados não geraram nenhum relatório.", "Erro", JOptionPane.ERROR_MESSAGE);
}
} catch (Exception ex) {
JOptionPane.showMessageDialog(this, ex.getMessage());
ex.printStackTrace();
}

quarta-feira, 1 de abril de 2009

iBatis + Spring + Flex = uau

Acho que fiquei loko de vez, em plena ferias to aproveitando pra aprender ibatis
e to fazendo isso convertendo um sistema simples, desenvolvido em um esquema velho
em MVC.

a ideia é aproveitar e fazer a jogadinha iBatis+spring +flex
mas como diz Jack, vamos por parte.

ate agora ta divertido e estou postando algumas dicas sobreo ibatis que estou encontrando:

1- cuidade em usar $xxx$, isso é bom pra gerar sql dinamico mas conforme a implementação abre espaço para um ataque sqlinjection, ex: voce colocar pra ordenar dinamicamente a tabela passando como paramentro o campo atravez de um lik na coluna /servlet?allCliente&orderBy=nome , e la na sql vc usa
order by $orderBy$ o cara pode mandar um comendo junto com a url.
nesses casos melhor usar alguma hash map ou ate mesmo enum para pega o paramentro e trocar pelo nome da coluna.

2 - result property="estado.id" column="estado_id" . isso serve para mapear uma bean que tenha como atributo uma outra bean e vc vai fazer um select so com join.

3 - Como fazer like com % já que no ibatis ele vai trocar? simples no sql vc usa o recurso de concatenar string do banco de dados ex. postgres where nome like '%' || #valuee# || '%'

4- typeAlias alias="Passaro" isso serve para colocar um apelido para a classe. assim vc nao precisa ficar passando sempre br.com.suaempresa.bean.Obejeto
nos depais tags sql vc so passa Passaro.

5 - sql id="fragmentWherePassaro". Esse é sem duvida o recurso mais interesante do ibatis. imagina que vc tem dois select um com count e outro o select normal. os dois utilizan a mesma clausula where. vc faz o where em uma tag separada e pode usar nos dois ou outros sql, lembrando sempre que o where pode ser dinamico

6 - nome dos parametro ex. #cliente.id# coloque #clienteID# se nao ele nao acha no map, para o ibatis o cliente.id ele vai tentan procurar por um objeto cliente com atributo id e nao um parametro "cliente.id"

o proximo post vou mostar algus configurações para usar spring com anotaçlões e com um service e dao generica e o terceiro e o Flex

segunda-feira, 23 de março de 2009

WEB SERVICES SEGUROS EM JAVA

Estou de ferias meio periodo (problemas no software), mas para o blog não ficar muito parado estou disponibilizando minha monografia do curso de pos-graduação que fiz em java.
Segue o resumo:

No momento, a arquitetura orientada a serviços encontra-se no radar de muitos
gerentes de TI, e um numero maior de empresas passam a dedicar cada vez mais
recursos à SOA. Se a SOA é a arquitetura, os Web Services são os blocos de
construção (IBM, 2008). Desta forma, Web Services estão em destaque no mundo
da computação distribuída como uma tecnologia que resolve os problemas de
interoperabilidade dos sistemas, pois utilizam padrões abertos e independentes de
plataforma, como HTTP e XML. Porem, por possuir uma infra-estrutura publica
oferece, também, uma maior preocupação no tocante a segurança. Neste presente
trabalho pretende-se demonstrar o funcionamento de Web Services seguros
utilizando a tecnologia Java abordando conceitos da arquitetura orientada a
serviços. Através de um estudo de caso será implementado Web Services, com o
auxilio de frameworks como Apache Axis e CXF, utilizando os padrões de protocolos
adotados pela industria demonstrando a especificação WS-Security.

download

terça-feira, 3 de março de 2009

Call Procedure Oracle with Java and Param Out

Segue um exemplo de como executar uma procedure com parametro de entrada e saida no oracle.


public static void main(String[] args) {
try {

Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:xe";
Connection con = DriverManager.getConnection(url, db_user, password);
System.out.println("Connected to database");

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date now = new java.sql.Date(simpleDateFormat.parse("12/02/2001").getTime());

String command = "{call SALDOS(?,?)}";
CallableStatement cstmt = con.prepareCall (command);
cstmt.registerOutParameter(2, Types.DECIMAL);

cstmt.setDate(1, now);
cstmt.execute();
Double str = cstmt.getDouble(2);

cstmt.close();

System.out.println("Retorno: "+str);

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


isso foi testado com oracle 9 e 10 xe
usando driver jdbc oracle
ojdb14.jar
ojdb14_g.jar

sexta-feira, 27 de fevereiro de 2009

Welcome.blog

Este é o meu primeiro post, e quero aqui compartilhar algumas idéias em relação ao meu trabalho e se for interessante algum fato da minha vida tambem.

Espero que o que for colocado aqui seja util à alguem, assim como muitas coisas que encontrei na internet e que já me ajudo e ajudam muito.

A internet hoje tornou-se um grande mundo virtual, o lado b da realidade, onde encontra-se te tudo! Mas se formos analisar, ela pode ser muito mais, afinal quantas coisas vc já compartilhou na rede?

Bom... se sua resposta limita-se a um perfil no orkut ta na hora de pelo menos começar a responder a algum forum ou então fazer iqual eu e criar um blog. Vamos lá, comece vc tambem! Não doi nada :)

Algumas razões que me motivaram:

pessoas mediocres discutem pessoas
pessoas médias dicutem fatos
pessoas grandes dicutem ideias

Um pouco de publicidade não faz mal a ninguem.

Imagine um jornalista que sabe onde Osama Bin Ladem esta escondido, mas guarda essa informação so pra ele...

Perder no varejo para ganhar no atacado.