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.

0 comentários:
Postar um comentário