Segue um gerador aritimético a partir do console do OSGi

Neste exemplo, vamos tentar fazer algo diferente pela construção de um gerador qualquer dentro do OSGi console. A idéia é escrever um simples console de comando com argumentos.
Neste exemplo, você vai aprender a ampliar o OSGi console, com comandos do usuário personalizado, bem como criar uma classe usando o gerador.

Estendendo o OSGi Console

Para começar, crie um novo plug-in do projeto usando o Plug-in Project Wizard. Nomeie o novo projeto como gererator.calculator. Desmarque a opção “Este plug-in fará com que as contribuições para a interface do usuário” opção e defina “Gostaria de criar um aplicativo cliente rico?” para o número (Este plug-in será executado no âmbito OSGi (equinox); assim, não será um RCP).
O novo plug-in deve ser modificado para estender a OSGi console. Isso permitirá que o usuário digite comandos personalizados quando rodando em modo console. Quando um objeto deseja oferecer uma série de comandos para o console, ele deve implementar a interface org.eclipse.osgi.framework.console.CommandProvider, e define os comandos como métodos começando com um caractere _ e tendo um CommandInterpreter como argumento. Durante a execução, o console irá encontrar todos os comandos público. Por exemplo, o seguinte trecho de código abaixo:

public Object _hello( final CommandInterpreter intp ) {
    return "hello " + intp.nextArgument();
}

Observação: Ao implementar a interface CommandInterpreter, o método do plug-in deve sobrecarregar public String getHelp() para retornar o texto de ajuda que explica o comando.

O objetivo é adicionar um comando de calculadora para gerar algum resultado. Abra a classe Activator (Activator.java) do plug-in e insere um comando para calcular, como mostrado na Listagem 1-1.

Listagem 1-1 Activator Plug-in com um comando calculator

package generator.calculator.internal;

import java.util.Hashtable;

import org.eclipse.core.runtime.Plugin;
import org.eclipse.osgi.framework.console.CommandInterpreter;
import org.eclipse.osgi.framework.console.CommandProvider;
import org.osgi.framework.BundleContext;

import generator.calculator.generator.CalculatorGenerator;

/**
 * The activator class controls the plug-in life cycle
 */
public class Activator extends Plugin implements CommandProvider {

    // The plug-in ID
    public static final String PLUGIN_ID = "generator.calculator";

    // The shared instance
    private static Activator plugin;

    /**
     * The constructor
     */
    public Activator() {
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.core.runtime.Plugin#start(org.osgi.framework.BundleContext)
     */
    @SuppressWarnings("unchecked")
    public void start( final BundleContext context ) throws Exception {
        super.start( context );
        plugin = this;

        final Hashtable properties = new Hashtable();
        context.registerService( CommandProvider.class.getName(), this, properties );

        System.out.println( "CALCULATOR GENERATOR STARTED" );
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
     */
    public void stop( final BundleContext context ) throws Exception {
        plugin = null;
        super.stop( context );
    }

    /**
     * Returns the shared instance
     *
     * @return the shared instance
     */
    public static Activator getDefault() {
        return plugin;
    }

    @Override
    public String getHelp() {
        return "---CALCULATOR Console Commands---"
        + "\n\tcalculator <param1> <operation_type> <param2>"
        + "\n\t\tuser params: 1 + 1...";
    }

    /**
     * Calculator command
     *
     * @param ci CommandInterpreter
     * @throws Exception
     */
    public void _calculator( final CommandInterpreter ci ) throws Exception {
        // Argumentos:
        final String param1 = ci.nextArgument();
        final String operator = ci.nextArgument();
        final String param2 = ci.nextArgument();

        if (param1 == null) {
            ci.println( "Argumentos invalidos.\n" + getHelp() );
            return;
        }

        try {
            CalculatorGenerator generator = new CalculatorGenerator();
            generator.run( param1, operator, param2 );
        } catch (final Exception e) {
            e.printStackTrace();
        }
    }
}

Listagem 1-1 mostra um plug-in activator que define o comando _calculator, que apresentará um relatório a partir da linha de comando. Essa classe também registra o serviço CommandProvider (dentro do método start()), com as propriedades especificas, com o framework:

context.registerService(CommandProvider.class.getName(), this, properties)

Gerando o calculador

package generator.calculator;

import java.util.HashMap;

public class CalculatorGenerator {

    public CalculatorGenerator() {
    }

    /**
     * Run
     * @param param1
     * @param operation
     * @param param2
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    public void run( String param1, String operation, String param2 ) throws Exception {

        Executa as operações aritiméticas...
        ...
        ...
    }
}

O arquivo do manifest segue abaixo:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Calculator Plug-in
Bundle-SymbolicName: generator.calculator
Bundle-Version: 1.0.0
Bundle-Activator: generator.calculator.internal.Activator
Require-Bundle: org.eclipse.core.runtime
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6

Com este exemplo você poderá criar diversos comandos, ou até algum outro gerador, por exemplo: gerador de relatório, gráfico etc.

About LuisCM

Mentor, Architect, Developer and Evangelism OSGi, D, Qt, Android, Eclipse Platform and Middleware Applications. Representative Eclipse Regional Communities Brazil OSGi Alliance Supporter Opal SWT Widgets Committer RoboVM Committer
This entry was posted in OSGi and tagged . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s