quinta-feira, 27 de novembro de 2008

Axis2 no Eclipse

Quando se corre o Axis2 Code Generator no eclipse e se obtém uma InvocationTargetException, pensa-se que é um problema nosso. Por incrível que pareça, até pode não ser. Depois de ter perdido horas neste erro, eis aqui a solução.

São necessários vários "artifícios" para se conseguir colocar o Axis2 Code Generator (versão 1.4.1) a funcionar no eclipse (versão europa).

Antes de mais referir que na realidade a versão 1.4.1 que se descarrega do site do Axis2 é a versão 1.3.0. E isto é um problema.

Para se conseguir gerar algo é necessário efectuar os seguintes passos no local onde está instalado o plugin no eclipse (...\eclipse\plugins\Axis2_Codegen_Wizard_1.3.0):
  • Copiar para a pasta lib os jars seguintes:
- backport-util-concurrent-3.1.jar
- geronimo-stax-api_1.0_spec-1.0.1.jar
- jsr173_1.0_api.jar
  • Copiar o seguinte para o ficheiro plugin.xml

<library name="lib/backport-util-concurrent-3.1.jar">
<export name="*"/>
</library>
<library name="lib/geronimo-stax-api_1.0_spec-1.0.1.jar">
<export name="*"/>
</library>
<library name="lib/jsr173_1.0_api.jar">
<export name="*"/>
</library>
  • Mudar no ficheiro plugin.xml a versão de 1.3.0 para 1.4.0
<plugin
id="Axis2_Codegen_Wizard"
name="Axis2 Codegen Wizard Plug-in"
version="1.4.0"
  • Alterar o nome da pasta do plugin para o número da nova versão (de Axis2_Codegen_Wizard_1.3.0 para Axis2_Codegen_Wizard_1.4.0)
E pronto adeus excepção e temos o eclipse a gerar que nem um doido. :-D

Actualização

Links para as libs

sexta-feira, 21 de novembro de 2008

Em que jar estás tu ó classe?

Há alturas em que é preciso descobrir em que jar está uma certa classe.
Para essas alturas temos o sítio web seguinte:

http://www.findjar.com/

Dá jeito. Dá mesmo muito jeito.

quinta-feira, 20 de novembro de 2008

Target runtime Apache Tomcat v5.5 is not defined - Parte II

Ás vezes quando se importa um projecto de eclipse, que tenha já uma configuração de Tomcat associada, o erro seguinte aparece:

Target runtime Apache Tomcat v5.5 is not defined

Para corrigir este erro é necessário um dos dois passos seguintes:
  1. Se no eclipse ainda não se tiver nenhum servidor configurado, então configurar um (Window->Preferences->Server->Installed Runtimes). Em princípio o problema fica resolvido quando se correr o projecto com o Run As -> Run on Server.
  2. Se o erro continuar, então efectuar o seguinte: sobre o projecto, carregando com o botão da direita, escolher Properties->Targeted Runtimes, e selecionar a checkbox ao lado do servidor Tomcat. Em princípio o erro desaparece.
  3. Se nenhum dos passos anteriores resultar então recorrer ao seguinte: Quando o eclipse se passa...

quarta-feira, 15 de outubro de 2008

Configurando o Eclipse Ganymede com o Weblogic

O servidor aplicacional Weblogic não vem com uma configuração disponível no eclipse Ganymede. Para ter o Weblogic disponível na configuração dos Servers no eclipse, é necessário fazer um update que está disponível no site:

https://eclipse-plugin.projects.dev2dev.bea.com/update

Depois de instalado, o eclipse já encontrará os servidores Weblogic.

segunda-feira, 13 de outubro de 2008

Cálculo de espaço ocupado na Base de Dados Oracle

A Base de Dados da Oracle, tem algumas ferramentas úteis que permitem calcular o espaço em disco que tabelas e índices virão a ocupar.

Cálculo de Espaço em Disco de Um Index

O código seguinte permite saber quanto espaço em disco irá ocupar um índice depois de criado.

set serveroutput on

DECLARE
ub NUMBER;
ab NUMBER;

BEGIN

DBMS_SPACE.CREATE_INDEX_COST('CREATE INDEX t_id ON ESQUEMA.NOME_DE_TABELA(id)',ub, ab, NULL);

DBMS_OUTPUT.PUT_LINE('Used Bytes: ' || TO_CHAR(ub));
DBMS_OUTPUT.PUT_LINE('Alloc Bytes: ' || TO_CHAR(ab));
END;
/

A tabela tem de existir previamente.

Substituir ESQUEMA e NOME_TABELA, pelo esquema e nome da tabela onde irá ser criado o índice.


Cálculo de Espaço em Disco Ocupado por uma Tabela

Quando se está a tentar saber quanto armazenamento é necessário para acomodar uma tabela, os códigos seguintes ajudam a determinar quanto espaço é necessário.

Cálculo Feito com Base no Tamanho Médio de uma Linha

O código seguinte permite saber, com base no tamanho médio de um registo na base de dados e no número de registos estimados, o tamanho de armazenamento necessário (em bytes) para acomodar uma tabela.

set serveroutput on

DECLARE
ub NUMBER;
ab NUMBER;

BEGIN

DBMS_SPACE.CREATE_TABLE_COST('USERS',45000,2000000,0,ub,ab);

DBMS_OUTPUT.PUT_LINE('Used Bytes: ' || TO_CHAR(ub));
DBMS_OUTPUT.PUT_LINE('Alloc Bytes: ' || TO_CHAR(ab));
END;
/

Onde,

USERS - Tablespace onde a tabela irá ser criada.
45000 - Tamanho médio de uma linha em bytes.
2000000 - Número total de linhas que a tabela irá conter.
0 - Espaço livre que a tabela deverá ter para novos inserts e updates.


Cálculo Feito com Base na Especificação de uma Tabela

O código seguinte permite saber o tamanho de armazenamento necessário para uma tabela, com a especificação fornecida e com o número de registos estimados.

set serveroutput on

DECLARE
ub NUMBER;
ab NUMBER;
cl sys.create_table_cost_columns;
BEGIN
cl := sys.create_table_cost_columns(
sys.create_table_cost_colinfo('VARCHAR2',100),
sys.create_table_cost_colinfo('CHAR',1),
sys.create_table_cost_colinfo('DATE',NULL),
sys.create_table_cost_colinfo('NUMBER',4)
);

DBMS_SPACE.CREATE_TABLE_COST('USERS',cl,2000000,0,ub,ab);

DBMS_OUTPUT.PUT_LINE('Used Bytes: ' || TO_CHAR(ub));
DBMS_OUTPUT.PUT_LINE('Alloc Bytes: ' || TO_CHAR(ab));
END;
/

Onde,

USERS - Tablespace onde a tabela irá ser criada.

cl - Definição da tabela cujo espaço é pretendido calcular.

2000000 - Número total de linhas que a tabela irá conter.

0 - Espaço livre que a tabela deverá ter para novos inserts e updates.





quarta-feira, 10 de setembro de 2008

Adicionando Itens aos Menus de Lançamento do Eclipse (XXX as)

A lógica de adicionar um novo item a um menu de Eclipse de lançamento (Run As, Debug As) deve ser feita de modo diferente de adicionar um item a um outro qualquer menu (seja menu, toolbal ou popupmenu).

Um item a ser colocado num menu de lançamento tem de estender

Forçar um Plug-In de Eclipse a Ser Carregado

Quando se desenvolve um plug-in para Eclipse (versão 3.3 ou superior) que necessita de adicionar itens a menus, e o estado destes itens dependem de condições (por exemplo a opção estar activa ou não), então, estas condições só serão verificadas se o plug-in já estiver sido carregado.

Para não obrigar o plug-in a ser carregado cada vez que o Eclipse é iniciado (gastando recursos sem necessidade), existem 2 opções que permitem que as condições sejam verificadas, mesmo se o plug-in ainda não estiver sido carregado, quando os itens têm de ser mostrados em menus:
- Uma é ter activa a opção - Activate this plug-in when one of its classes is loaded
- Outra é ter a opção na condição forcePlugInActivation a true

A opção forcePluginActivation só aparece para condições do tipo test. Se os menus estiverem a ser mal disponibilizados, pode-se forçar a criação de um teste "dummy" só para obrigar a carregar o plug-in, fazendo com que a partir daí os menus sejam correctamente disponibilizados.

Criação de Acções (Comandos) em Plug-Ins de Eclipse a Partir da Versão 3.3

As acções no Eclipse permitem estender os menus existentes, adicionar novos menus, criar botões nas toolbars, menus de popup, etc., que por sua vez podem (ou não) levar à execução de código.

As acções são essenciais na criação de novos plug-ins.

A partir da versão 3.3 do Eclipse (Europa), o mecanismo de criação de acções mudou radicalmente. Embora o mecanismo anterior de criação de acções através de actionSets ainda se mantenha, este por ser bastante limitado deve ser abandonado.

A partir de agora deve-se utilizar o mecanismo que foi baptizado de commands.

Os commands além de permitirem a separação real entre a definição de um comando e o código que o comando executa, alarga de sobremaneira as condições associadas ao comando. Estas condições permitem definir por exemplo quando um comando está visível, quando está activo, quando está acessível, etc. Os commands permitem também a reutilização em larga escala da definição do comando (coisa que com actionSets é impossível).

É necessário ter bastante cuidado quando se segue um tutorial para criação de um plug-in em Eclipse. Se já se está a desenvolver um plug-in para a versão 3.3 ou superior, então convém seguir tutoriais e exemplos que já utilizem a noção de comandos. Não é que tutoriais mais antigos eventualmente não funcionem, mas os comandos alargam e facilitam em larga escala o desenvolvimento.

Convém também notar que entre a versão 3.3 (Europa) e a 3.4 (Ganymede) a API dos comandos (e não só) sofreu alterações.

No link seguinte explica-se a noção de comandos:

http://www.ibm.com/developerworks/library/os-eclipse-3.3menu/index.html

terça-feira, 2 de setembro de 2008

Como criar um Plug-In de Eclipse

Eis um bom tutorial de como criar um plug-in de Eclipse:

http://www.javabeat.net/articles/26-introduction-to-eclipse-plugin-architecture-1.html

Uma boa referência, diria mesmo imprescindível, para começar a construir plug-ins em Eclipse de real qualidade, é o livro Eclipse: Building Commercial-Quality Plug-ins.

O próprio Eclipse vem com um conjunto de templates e exemplos pré-definidos que ajudam bastante no desenvolvimento de novos plug-ins.

Neste caso em particular, é bom aprender por exemplo, pois o desenvolvimento de novos plug-ins é bastante complexo e sem ser através de exemplos, tinha-se de saber bastante sobre a framework.

Para desenvolver novos plug-ins tem de se ter instalado o PDE (Plugin Development Environment)

O Eclipse na secção Help->Help Contents->Platform Plug-in Developer Guide, contém uma referência sobre o PDE e também a API completa do PDE. Esta referência é bastante útil durante o desenvolvimento de novos plug-ins.

segunda-feira, 25 de agosto de 2008

Matriz Comparativa de CMSs

Neste site http://www.cmsmatrix.org/ podem comparar todos os CMSs existentes no mercado, quer opensource quer comerciais. Ter em atenção que a comparação não é 100% fidedigna, mas dá para ter uma ideia das capacidades de cada CMS. O maior problema do comparador está relacionado com as datas de actualização de cada CMS (o quão actualizado o CMS está) e em algumas novas capacidades que não aparecem.

terça-feira, 12 de agosto de 2008

Invalid LOB locator specified

Durante umas largas horas estive à luta com um erro muito "abrangente" cuja mensagem é a seguinte:

ORA-22275: invalid LOB locator specified

As condições nas quais o erro apareceu foram:
  • Base de dados Oracle 9
  • Chamada à BD a partir de uma classe Java
  • Chamada a um Store Procedure Oracle (PL/SQL)
  • O retorno era um CURSOR que continha lá dentro, entre outros um BLOB
  • Sempre que se tentava fazer algo com o BLOB (aceder a qualquer propriedade), o erro aparecia.
Depois de alguma investigação, chegou-se à conclusão (se é certa ou não isso já é outra história) de que não é possível ler um BLOB que tenha sido retornado dentro de um CURSOR.

Ou seja o Store Procedure tem de devolver o BLOB directamente e não através de um CURSOR.

quinta-feira, 31 de julho de 2008

Aqui à Gato do Tom!

Actualização

Vejam o 2º comentário. Ao que parece é uma melhor maneira de resolver o problema. Ainda não testei.
____________________________________________________________________

Bem, quando o eclipse se passa dos carretos às vezes são precisas medidas drásticas.

Num determinado projecto web, depois de configurar o TomCat no Window->Preferences->Server->Installed Runtimes, e de correr o projecto com sucesso no "Gato do Tom", passado algum tempo (sim, não é um mito, o software degrada-se...) o projecto ao compilar começou a dar um erro muito engraçado: Target runtime Apache Tomcat v5.5 is not defined.

Bem indo às propriedades do projecto, na parte do Server, ele estava lá. Contudo a mensagem aparecia na mesma. Depois de pesquisar na net por uma solução, nada encontrei que me ajudasse.

Fiz umas pesquisas na máquina local por "Gato do Tom" nos ficheiros do projecto e encontrei 2 entradas nos seguintes ficheiros:
  • org.eclipse.jst.common.project.facet.core.prefs
  • org.eclipse.wst.common.project.facet.core.xml
Comentei as entradas do "Gato do Tom" e voltei a abrir o projecto.

O erro desapareceu. É caso para dizer... "Aqui à Gato (do Tom)!".

terça-feira, 29 de julho de 2008

(Não) Usar GWT-EXT e GWT-DND

Se pretendem usar GWT-DND juntamente com GWT-EXT, é melhor esquecerem pois neste momento não dá para usar os dois em conjunto. O problema fundamental tem a ver com o uso de paineis (Panel) do GWT-EXT. Por alguma razão eles (os Panel) não deixam que os componentes de GWT-DND recebam os eventos que permitem fazer drag and drop impossibilitando o seu uso em conjunto. Se entretanto descobrir uma solução irei aqui colocar.

segunda-feira, 21 de julho de 2008

Como colocar o GWT a funcionar com o GWT-EXT

Para se poder usar o GWT-EXT juntamente com o GWT num projecto, os seguintes passos têm de ser realizados:
  • Copiar para a pasta public a pasta js (esta pasta contém o javascript do EXT).
  • No HTML que tem o nome do módulo, é necessário adicionar as seguintes linhas:

<!-- Begin ExtJS library files -->
<link rel="stylesheet" type="text/css" href="js/ext/resources/css/ext-all.css"/>
<script type="text/javascript" src="js/ext/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="js/ext/ext-all.js"></script>
<!-- End ExtJS library files -->

  • No ficheiro .gwt.xml do módulo colocar:
<inherits name="com.gwtext.GwtExt"/>

E pronto, temos o GWT a funcionar com o GWT-EXT.

Drag and Drop (Arrastar e Deixar Cair)


O que o Windows tem de bom!
Isto vem a propósito da tarefa actual. Realizar uma consola Drag and Drop!