Jforum para todos os gostos

O Jforum para quem não conhece, é um projeto Open Source de um dos fóruns de discussões baseado em JAVA, que eu me atrevo a dizer, dos mais famosos do planeta, no qual se integra com os principais bancos de dados do mercado.
Para se ter uma ideia, o maior fórum de Java, o GUJ, é baseado no Jforum, logicamente que por ser Open Source, o GUJ possui uma versão melhorada e especifica para sua comunidade.

E por que estou falando disto? Um amigo me procurou essa semana e me propôs que eu fizesse um site para divulgar seu produto e além disto ele gostaria que tivesse um pequeno fórum de discussões fechado para os integrantes desta empresa.
Como já tinha trabalhando com Jforum algum tempo atrás para um cliente, mas sem me aprofundar muito, pois acabou que o projeto foi deixado de lado, sugeri a ele esta solução para o fórum dele, pois como seria uma comunidade simples apenas entre os integrantes da empresa, não precisaria de muitas customizações e o projeto principal daria conta do recado.
Então resolvi tirar o projeto Jforum do fundo do baú e voltar a colocar para funcionar. A instalação é bem simples e funcional, você não encontrará problemas ao executar, no próprio site da comunidade tem um passo a passo de como realizar esta instalação (http://jforum.net/install.jsp), bastando apenas ter um container JAVA, no meu caso eu utilizei o Apache Tomcat6 e o banco de dados PostgreSQL 9.3.
Ao finalizar a instalação ele lhe redireciona para a página principal do fórum e tudo começa a funcionar maravilhosamente bem, porém ao clicar no primeiro tópico que ele cria automaticamente um erro é apresentado

java.sql.SQLException: ERROR: operator doesn't exist : character varying = integer

Pela exceção, vemos claramente que se trata de alguma query do sistema onde está se comparando campo string com integer. Depois de vasculhar o fórum javaranch(http://www.coderanch.com/forums/f-114/jforum), encontrei a solução sem precisar baixar o código fonte do projeto, pois o Jforum lê estas querys diretamente de um arquivo chamado generic_queries.sql que fica localizado na pasta WEB-INF/config/database/generic/. Veja que maravilha, se estas querys ficassem diretamente no código fonte do projeto eu teria que baixar, ajustar e gerar uma nova versão do Jforum, porém apenas tive que mexer na seguinte linha do arquivo:

AND rv.role_value = ?

Ao consultar o banco de dados verifiquei que este campo role_value trata-se de um campo character varying e dentro das classes do Jforum o parâmetro para comparação da clausula where é integer, acredito que nas versões anteriores do JAVA ele fazia essa conversão automaticamente, porém muito me admira não terem soltado algum patch de atualização para este problema. Enfim, para corrigir basta converter o parâmetro para text, ficando da seguinte maneira:

AND rv.role_value = ?::text

Quando achei que tinha terminado, encontrei outro problema ao tentar acessar o painel do administrador, o seguinte erro era apresentado:

by: net.jforum.exceptions.DatabaseException: java.sql.SQLException: ERROR: operator does not exist: timestamp without time zone > integer 
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse 

E mais uma vez é nítido que esta exceção está vinculada a um erro de query, mais uma vez ao consultar o javaranch(http://www.coderanch.com/forums/f-114/jforum), verifiquei que uma condição que não era mais aceita nas novas verões do postgreSQL estava sendo utilizada.
Para ajustar basta apenas abrir novamente o arquivo generic_queries.sql e alterar as seguintes query:

ForumModel.statsFirstPostTime = SELECT MIN(post_time) FROM jforum_posts WHERE post_time > 0

ForumModel.statsFirstRegisteredUserTime = SELECT MIN(user_regdate) FROM jforum_users WHERE user_regdate > 0

PARA

ForumModel.statsFirstPostTime = SELECT MIN(post_time) FROM jforum_posts WHERE extract('day' from post_time) > 0
ForumModel.statsFirstRegisteredUserTime = SELECT MIN(user_regdate) FROM jforum_users WHERE extract('day' from user_regdate) > 0

Pronto seu painel de administrado vai funcionar normalmente. Após isso fiz mais alguns testes e não encontrei problemas, caso você tenha encontrado mais algum e ajustou compartilhe aqui conosco.
Há!, Mais uma coisa, Você vai perceber que algumas imagens não estão aparecendo no seu fórum, como a de criação de um novo tópico. Para que elas apareçam você deve renomear a pasta es_US da pasta images para pt_BR.
Abraços!

Anúncios

Colocando Nexus 4 pra funcionar com Android Studio

Por esses dias estava com um problema para depurar um pequeno aplicativo que estava desenvolvendo para Android, plugava meu smartphone nexus 4 no USB, porém quando clicava no botão para depurar o aplicativo, não aparecia a opção de escolher meu nexus, apenas o emulador.

Fiz algumas pesquisas e descobrir que existi um drive genérico do Google que auxilia na comunicação entre a IDE e o smartphone.
Pois bem, segui o tutorial e consegui resolver o problema, basta apenas baixar o Google USB Driver pelo SDK Manager, depois ir no gerenciador de dispositivos do seu computador e mandar atualizar com o arquivo que foi baixado pelo SDK Manager.

O arquivo vai ficar na pasta android-studio\sdk\extras\google\usb_driver. Basta apenas apontar para esta pasta que o windows se encarrega de atualizar o driver.
Depois disto basta apenas reiniciar o Android Studio.

Segue o link do tutorial, espero que te ajude também

http://androidsecurity.wordpress.com/2013/06/05/install-google-nexus-4-adb-usb-drivers-on-windows-android-studio/

Problema ao iniciar tomcat7 via modo debug

Fala pessoal da terra média, anteriormente eu tinha criado um post sobre como inciar o tomcat6 em modo debug, pois bem, recentemente aqui na empresa mudamos do tomcat6 para o tomcat7 e para minha surpresa ao tentar iniciá-lo no modo debug um erro de falta de classe era apresentado. Para ser mais especifico, este erro abaixo:

erro_tomcat

Após algumas pesquisas, descobrir que na nova versão do Bootstrap, especificamente no arquivo MANIFEST.MF não chama a lib tomcat-juli.jar no seu classpath.

Então, para resolver, basta apenas abrir a lib bootstrap.jar com algum descompactador(Winzip ou Winrar) que fica dentro da pasta bin do seu tomcat e alterar a linha Class-Path: commons-daemon.jar para Class-Path: commons-daemon.jar tomcat-juli.jar.

Agora basta inciar o tomcat e voltar a debugar seus projetos ;P

fonte: http://stackoverflow.com/questions/6750825/unable-to-start-tomcat-server-in-netbeans-and-eclipse

Executar comando linux no java

As vezes temos que executar algum comando linux antes de realizar alguma tarefa no java, por exemplo, gerar uma planilha com informações do servidor linux para depois recuperar esse arquivo e jogar no banco de dados.
Para executar um comando linux no java basta apenas chamar o método exec da classe Runtime.

Um exemplo prático seria:

         Runtime run = Runtime.getRuntime();
        String comando = "";
        
        comando = "wkhtmltoimage --crop-w "+context.get("tmp.ds_corte_width")+" \""+context.get("tmp.ds_servidor")+"\""+context.get("tmp.id_exploracao_pecuaria").concat(".png");
        try {
            run.exec(comando);
        } catch (IOException ex) {
            context.put("tmp.resposta", "Erro ao gerar imagem: "+ex.getMessage());
            ex.printStackTrace();
        } 

Neste exemplo eu executo um programa chamado wkhtmltoimage que pega uma url e transforma o html em imagem, posteriormente pretendo falar mais dele.

Até.

Fonte:http://www.vivaolinux.com.br/dica/Executar-comandos-do-terminal-Linux-em-Java

Debug Remoto em Aplicação Web no NetBeans

Eu que desenvolvo aplicações web com o WI, sei como é difícil criar conectores e tentar achar os bugs no erro e acerto, utilizando System.out em todo o processo.
Uma vez estava cansando disso e resolvi achar uma maneira melhor de achar esses bugs. Uma forma rápida e fácil é utilizar o modo debug do NetBeans, porém não conseguia integrá-lo com o meu tomcat.
Após algumas pesquisa consegui achar uma solução que compartilho com vocês agora, não lembro em que site foi que achei, pois faz muito tempo.

Vamos la!!!

Crie um arquivo .bat(será por ele que vamos iniciar nosso tomcat), pode ser satartup_tomcat.bat

Abra o arquivo e cole esse código

@echo off

cd C:\Program Files\Java\jre1.6.0_06\bin\

call java.exe  -jar -Djavax.net.debug=all -Xdebug -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7001 -Duser.dir="C:\Tomcat6" -Djava.endorsed.dirs="C:\Tomcat6\common\endorsed" "C:\tomcat6\bin\bootstrap.jar" start

:end

Agora substitua os caminhos do JRE e tomcat por da sua máquina.

Agora execute o .bat que foi criado, espere inciar.

Abra o NetBeans, vá no menu Depurar e clique em Anexar Depurador, em porta coloque 7001, em host coloque localhost ou seu ip, em timeout coloque 6000, agora clique em OK e seja feliz, agora todo conector que for executado o debug será ativado.