sexta-feira, janeiro 08, 2010

Moving towards the integration between Jira and Enterprise Architect

Dando seguimento ao post inicial sobre integração entre o Jira e o Enterprise Architect (EA), nesta semana que passou, acredito que dei dois passos importantes até agora.

Primeiro, consegui no commit número #93 deixar a parte 1 de 3 do referido plugin (vou descrever a arquitetura dele em outro post) funcionando.

Em outras palavras, já tenho um servico EJB Stateful que provê acesso a múltiplos clientes e invocações repetidas ao repositório do EA. Também, usando o padrão Factory com um cache de mapas, consigo manipular múltiplos repositórios do EA de forma transparente; e com o uso da anotação @PreDestroy, garanto que não ocorra vazamento de recursos em caso de queda de sessões de clientes. De quebra, usando o padrão Delegate entre a camada EJB e a classe Wrapper, consigo usar o Wrapper para manipular o repositório do EA localmente (ex. sem uso de container JavaEE), se for o caso.

Segundo, e isso levou esta noite toda, consegui seguir o passo-a-passo do pessoal da Atlassian para montar um ambiente de desenvolvimento com o Atlassian SDK para o meu Eclipse.

Com isso, posso fazer a parte 2 de 3 do plugin, que visa a conexão dos elementos do EA via protocolo SOAP (é um protocolo mesmo?) com as issues no Jira.

Depois de muito sofrer com o Maven (detesto ele!), tendo que baixar os Jars da JTA e JNDI por fora, e transformar o projeto em um projeto Eclipse (isso foi fácil, com mvn eclipse:eclipse; mas demorou 27 minutos!), montei o projeto e rodei os demos. Bingo!

Minha primeira issue Jira via SOAP

Com os demos rodando, criei uma classe tosca, e alterei a URL do Jira demo para apontar para o nosso Jira. Depois, regerei as classses Java via o WSDL e, voilá.

Abaixo, o screenshot da issue JB-552, criada em nosso ambiente, e logo após a classe de teste:







/**
 *  Copyright 2010 3L TECNOLOGIA
 * 
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */
package com.atlassian.jira_soapclient;

import java.net.MalformedURLException;
import java.net.URL;

import com.atlassian.jira.rpc.soap.client.JiraSoapService;
import com.atlassian.jira.rpc.soap.client.RemoteAuthenticationException;
import com.atlassian.jira.rpc.soap.client.RemoteException;
import com.atlassian.jira.rpc.soap.client.RemoteIssue;
import com.atlassian.jira.rpc.soap.client.RemotePermissionException;
import com.atlassian.jira.rpc.soap.client.RemoteValidationException;

/**
 * @author mmrack
 * @since 08/01/2010 01:09:47
 *
 */
public class LM2JiraSOAPClient {

    private JiraSoapService jiraSoapService;

    private String authToken;

    public LM2JiraSOAPClient(String user, String password) throws Exception {
        authToken = connectTo(
                "http://jboss.lm2.com.br/jira/rpc/soap/jirasoapservice-v2", user,
                password);
    }

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        LM2JiraSOAPClient jiraClient = new LM2JiraSOAPClient("mmrack",
                "mypassword");
        String iKey = jiraClient.createIssue("JB", "1", "LM2JiraSOAPClient Issue",
                ":)");
        System.out.println(iKey);
    }

    private String createIssue(String pkey, String type, String summary,
            String description) throws Exception {
        String iKey;

        RemoteIssue issue = new RemoteIssue();
        issue.setProject(pkey);
        issue.setType(type);
        issue.setSummary(summary);
        issue.setDescription(description);

        RemoteIssue returnedIssue = jiraSoapService.createIssue(authToken, issue);
        return returnedIssue.getKey();
    }

    private String connectTo(String url, String user, String password)
            throws Exception {
        SOAPSession soapSession = new SOAPSession(new URL(url));
        soapSession.connect(user, password);
        this.jiraSoapService = soapSession.getJiraSoapService();
        return soapSession.getAuthenticationToken();
    }

}

Próximos passos

Estou trabalhando com o P. nesse projeto fora de horário, e ele deve dar ênfase na parte da interface do usuário, que espero fazer em Grails.

Quanto à parte 3 de 3 do plugin, esta envolve Model Driven Architecture (MDA) e, por isso, devo iniciar um projeto logo (já faz mais de ano que digo isso!) com o F., lá na PUCRS.

Enquanto as partes 1 e 2 do plugin visam ser totalmente Open Source, essa parte 3 visa dar um retorno financeiro para nós e, assim, o objetivo é fazer algo bem estruturado, que possa operar de forma fragmentada ou integrada, visando tando desenvolvedores standalone, quando softwarehouses de porte, onde projetos grandes carecem de sincronia de informações.

Bye.