Google Collections Library

Não sei como só vi isto agora mas já está disponível há algum tempo, embora ainda em 0.5 (Alpha).
Trata-se uma biblioteca desenvolvida internamente por pessoal do Google e disponibilizada ao público em geral com uma licença opensource. Pretende ser

uma extensão às Java collections, e as colecções estendem os tipos base das colecções.

Novas Collections

São definidos, os seguintes novos tipos de colecções:

  • BiMap
  • Esta interface estende Map e permite ter um Map bidireccional, ou seja, em que é possível aceder por chave e/ou por valor. São fornecidas três implementações: HashBiMap, EnumBiMap e HashEnumBiMap.
    O HashBiMap contém dois HashMaps e permite a utilização de chaves e valores null. O EnumBiMap utiliza dois EnumMaps na sua implementação mas não permite chaves e valores null. O HashEnumBiMap é um misto, sendo que utiliza um EnumMap para mapear chaves para valores e um HashMap para mapear valores para chaves.

  • Multimap
  • É uma Map que pode ter vários valores para cada chave, ou seja, pode-se fazer algo como

    myMultimap.put(chavexpto,valorA);
    

    As vezes que quisermos, com a mesma chave. Existem dois interfaces principais que extendem Multimap: ListMultimap e SetMultimap.
    O ListMultimap guarda internamente os valores para uma chave numa lista ordenada, preservando assim ordem de inserção. São fornecidas as implementações ArrayListMultimap e LinkedListMultimap.
    O SetMultimap utiliza um Set para guardar os valores de cada chave e por isso não permite pares (chave,valor) repetido. São fornecidas as implementações HashMultimap, LinkedHashMultimap e TreeMultimap. Os nomes penso que são intuitivos :)

  • Multiset
  • É simplesmente um Set que permite duplicados, comummente chamado de Bag.
    Cada elemento tem um número de ocorrências, sendo que a noção de vários elementos com o mesmo valor não tem lógica, mas sim um elemento com X ocorrências. O número de ocorrências de um elemento é alterado quando o mesmo valor é inserido várias vezes e a igualidade entre valores é dependente da classe implementadora do Multiset (e.g. um HashMultiset poderá simplesmente comparar hashcodes, outro poderá ter uma aproximação diferente). Para oferecer esta noção de ocorrência, é fornecido o método

    int count(Object);
    

    São fornecidas as implementações EnumMultiset, HashMultiset, LinkedHashMultiset e TreeMultiset.

Além destas, existem mais classes de colecções derivadas, que estendem algumas das que aqui falei.

Classes Auxiliares

São fornecidas inúmeras classes auxiliares, mais do que as que consigo enumerar aqui e a maioria ainda nem olhei para elas.
Posso destacar alguns helpers, como seja por exemplo os Builders para criar colecções imutáveis de Multimap e BiMap ou um muito útil AbstractIterator, para facilitar a implementação de Iterators.
São fornecidas também Forward Collections, que são colecções que delegam o processamento dos seus métodos nos métodos de uma classe filha. Isto é útil porque a maioria das classes fornecidas pelo google collections library são

final e esta é a forma de adicionar comportamento personalizado. O pattern usado nestas forward collections é o decorator.

Base Google Goodies :)

Além das colecções e classes auxiliares relacionadas, são incluídas e utilizadas classes base e utilitárias google. São coisas simples e algumas delas bem pensadas e que podem ser utilizadas no dia-a-dia. Destaco a classe Preconditions: um conjunto de métodos estáticos para serem usados no início de métodos, para verificar pré-condições de argumentos e verificações de estado interno. Existem soluções de contratos mais completas obviamente mas como solução leve e prática é bastante usável.

Por fim, o mais importante, vão ao site do Google Collections Library, saquem o snapshot e vejam por vocês próprios. Poderá vir a ser uma boa adição aos nossos projectos.

Liferay Portal – Configuração da ligação a uma base de dados MySQL

Tal como prometido no meu último artigo, aqui ficam as instruções para configurar o Liferay Portal para aceder a uma base de dados MySQL usando o ambiente de desenvolvimento com o eclipse.

viagra for women

>1 – Criação da Base de Dados MySQL

Criem a base de dados com o nome lportal.

Poderão fazer isto utilizando o MySQL Administrator (a ferramenta de administração do MySQL) ou usando a seguinte linha de comando:
mysqladmin --default-character-set=utf8 create lportal

2 – Configuração do acesso à base de dados com o eclipse

Abram o Data Source Explorer do eclipse (Window -> Show view -> Data Source Explorer).

Seleccionem o icon ‘New Connection Profile’ ou usem o botão direito do rato do sobre ‘Databases’ e depois seleccionem ‘New’.

Na janela ‘New Connection Profile’ seleccionem o tipo SQL Model-JDBC Connection.

No quadro seguinte indiquem um nome para o perfil (ex: ‘Liferay – Mysql’).

No último quadro, usem o botão de procura (‘…’) na lista “Select a browser”.

    Adicionem uma

    nova definição:

  • localizem o template para bases de dados MySQL na árvore (Database -> MySQL -> 5.0 -> MySQL JDBC Driver).
  • Alterem as definições do driver:
    • Alterem o nome para ‘Liferay MySQL Driver';
    • Removam o driver ‘default’ e adicionem um novo Jar correspondente ao ficheiro $WORKSPACE/ext/lib/development/mysql.jar ($WORKSPACE corresponde à localização da pasta do vosso workspace no sistema de ficheiros);
    • Configurem o valor das propriedades de acesso (username, password, etc…) tendo em atenção que o valor do ‘Database Name’ (e por consequência o final da linha do ‘Connection URL’ deverá ser ‘lportal‘.
  • Confirmem as alterações e seleccionem agora este driver nas definições do driver (Database -> MySQL -> 5.0 -> Liferay MySQL Driver).

Voltem de novo à janela de criação do perfil e validem que todas as informações estão de acordo com a vossa configuração (podem testar a ligação a partir desta janela).

3 – Criação do modelo de dados

Editem o ficheiro create-mysql.sql na pasta /sql/create do projecto ‘ext’.
Caso não tenham memoria para desperdiçar (é o meu caso) respondam afirmativamente quando o eclipse perguntar se pretendem desligar a validação de sintaxe do ficheiro.

No topo da janela de edição do ficheiro encontram a configuração do ‘Connection profile’. Seleccionem o tipo Generic JDBC_1.x, o driver ‘Liferay - Mysql‘ e a base de dados lportal.

Nota: caso o status não seja ‘Connected‘ não vão conseguir ver o nome da base de dados.
Neste caso devem aceder ao Data Source Explorer ( Window -> Show View -> Data Source Explorer), seleccionar a Database ‘Liferay – MySQL’ e fazer connect (botão direito do rato)

Comentem as três primeiras linhas do ficheiro, uma vez que a base de dados já foi criada

-- drop database if exists lportal;
-- create database lportal character set utf8;
-- use lportal;

Gravem e executem o sql (ctrl+alt+X ou Execute All no menu contextual).

4 – Configuração do datasource no tomcat

Editem o ficheiro Root.xml localizado na pasta servers/tomcat/conf/Catalina/localhost do projecto ‘ext’.

Comentem o datasource do Hypersonic e descomentem o datasource do MySQL.

Preencham os atributos username e password e, caso não estejam a usar os valores default do MySQL, editem tambem o valor do atributo url, de acordo com a vossa configuração.

Gravem as alterações.

5 – Deploy da configuração para o servidor

Copiem o ficheiro Root.xml para a pasta conf/Catalina/localhost do tomcat.

Copiem e o ficheiro mysql.jar para para a pasta lib/ext do tomcat.

Voltarei a falar sobre a forma correcta de fazer deploy destes ficheiros no meu próximo artigo.