Utilizando Equinox P2 - Obtendo informações sobre plugins e features instaladas

Bom dia a todos.

Estou utilizando o Eclipse 3.7 para desenvolver um projeto e estou precisando fazer algumas coisas, utilizando as informações dos plugins e das features instaladas:

Estou utilizando o recurso de provisionamento P2 para permitir a atualização do software.

1º: Preciso obter a lista de plugins e features que estão instaladas e que estão rodando no momento. Preciso de algo como o que é exibido na aba “Installed Software”, que pode ser visualizada no menu “Ajuda > Sobre > Installation Details”.

Obs.: Irei utilizar essa informação para obter dados sobre as features instaladas, como número de versão e descrição.

2º: Preciso obter a lista das instalações realizadas. Preciso de algo como o que é exibido na aba “Installation History”, que pode ser visualizada no menu “Ajuda > Sobre > Installation Details”.

Obs.: Irei utilizar essa informação para adicionar uma funcionalidade de limpar instalações antigas. Algo como “Manter apenas as 5 últimas instalações”.




Bom dia a todos.

Após analisar como funciona a janela que exibe os plugins e feature instalados, desenvolvi o seguinte código:

import org.eclipse.core.runtime.Platform;
import org.eclipse.equinox.p2.engine.IProfileRegistry;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.metadata.Version;
import org.eclipse.equinox.p2.operations.ProvisioningSession;
import org.eclipse.equinox.p2.query.IQueryResult;
import org.eclipse.equinox.p2.query.IQueryable;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.ui.ProvisioningUI;

...


try {
	ProvisioningUI provisioningUI = ProvisioningUI.getDefaultUI();

	if ( null == provisioningUI ) {
		return;
	}

	String profileId = provisioningUI.getProfileId();

	ProvisioningSession provisioningSession = provisioningUI.getSession();

	if ( null == provisioningSession ) {
		return;
	}

	IQueryable<IInstallableUnit> queryable = ((IProfileRegistry) provisioningSession.getProvisioningAgent().getService(IProfileRegistry.SERVICE_NAME))
			.getProfile( profileId );


	if ( null == queryable ) {
		return;
	}

	// to get the product ID
	//String pId = Platform.getProduct().getId();
	
	String pId = "feature.1";

	if ( null != queryable ) {
		IQueryResult<IInstallableUnit> iqr = queryable.query( QueryUtil.createIUQuery( pId ), null );

		if ( null != iqr ) {
			Iterator<IInstallableUnit> ius = iqr.iterator();
			if( ius.hasNext() ) {
				IInstallableUnit iu = ius.next();
				Version v = iu.getVersion();

				if ( null != v ) {
					System.out.println( "ID: " + iu.getId() + " | IU: " + iu.toString() + " | Version: " + v.toString() );
				}
			}
		}
	}
} catch ( Exception e ) {
	System.out.println( e.getStackTrace() );
	return;
}

Gostaria que saber se alguém tem uma forma melhor de fazer isso, ou se ve algum problema em ser feito dessa forma.

VLW