Java tutorial
/* * SoMeSPC - powerful tool for measurement * * Copyright (C) 2013 Ciro Xavier Maretto * Copyright (C) 2015 Henrique Nspoli Castro, Vincius Soares Fonseca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <https://www.gnu.org/licenses/lgpl.html>. */ package org.somespc.webservices.rest; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Query; import javax.persistence.TemporalType; import javax.persistence.TypedQuery; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.UriInfo; import org.apache.commons.lang.NullArgumentException; import org.openxava.jpa.XPersistence; import org.somespc.integracao.SoMeSPCIntegrator; import org.somespc.integracao.sonarqube.SonarQubeIntegrator; import org.somespc.integracao.sonarqube.model.MedidasSonarQube; import org.somespc.integracao.sonarqube.model.Recurso; import org.somespc.integracao.taiga.TaigaIntegrator; import org.somespc.integracao.taiga.model.MedidasTaiga; import org.somespc.integracao.taiga.model.Projeto; import org.somespc.model.definicao_operacional_de_medida.Periodicidade; import org.somespc.model.entidades_e_medidas.EntidadeMensuravel; import org.somespc.model.medicao.Medicao; import org.somespc.model.plano_de_medicao.PlanoDeMedicao; import org.somespc.util.json.JSONObject; import org.somespc.webservices.rest.dto.EntidadeMensuravelDTO; import org.somespc.webservices.rest.dto.ItemPlanoDeMedicaoDTO; import org.somespc.webservices.rest.dto.MedicaoDTO; import org.somespc.webservices.rest.dto.PeriodicidadeDTO; import org.somespc.webservices.rest.dto.PlanoDTO; /** * API REST para os recursos da SoMeSPC * * @author Vinicius * */ @Path("") public class SoMeSPCResource { @Context private UriInfo uriInfo; //So funciona com esse padrao de data. private SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); @Path("/ItensPlanoDeMedicao") @GET @Consumes(MediaType.APPLICATION_JSON + ";charset=utf-8") @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8") public Response obterItensPlanoDeMedicao() throws Exception { String OE_1 = "Melhorar o gerenciamento dos projetos de software da organizao"; String OE_2 = "Melhorar a qualidade do cdigo fonte produzido"; String OM_1 = "Monitorar a concluso de pontos de estria nos projetos"; String OM_2 = "Monitorar a realizao de sprints nos projetos"; String OM_3 = "Monitorar desempenho na sprint"; String OM_4 = "Monitorar desempenho no projeto"; String OM_5 = "Monitorar quantidade de doses de Iocaine nas sprints"; String OM_6 = "Monitorar o desempenho dos membros da equipe no projeto"; String OM_7 = "Monitorar a qualidade do cdigo fonte produzido nos projetos"; List<ItemPlanoDeMedicaoDTO> itensPlanoDeMedicao = new ArrayList<ItemPlanoDeMedicaoDTO>(); itensPlanoDeMedicao.add( new ItemPlanoDeMedicaoDTO(OE_1, OM_1, "Quantos pontos de estria foram planejados para o projeto?", "Pontos de Estria Planejados para o Projeto", "Taiga")); itensPlanoDeMedicao .add(new ItemPlanoDeMedicaoDTO(OE_1, OM_1, "Quantos pontos de estria foram concludos no projeto?", "Pontos de Estria Concludos no Projeto", "Taiga")); itensPlanoDeMedicao.add( new ItemPlanoDeMedicaoDTO(OE_1, OM_1, "Qual a taxa de concluso de pontos de estria no projeto?", "Taxa de Concluso de Pontos de Estria no Projeto", "Taiga")); itensPlanoDeMedicao .add(new ItemPlanoDeMedicaoDTO(OE_1, OM_2, "Quantas sprints foram planejadas para o projeto?", "Nmero de Sprints Planejadas para o Projeto", "Taiga")); itensPlanoDeMedicao .add(new ItemPlanoDeMedicaoDTO(OE_1, OM_2, "Quantas sprints foram realizadas no projeto?", "Nmero de Sprints Realizadas no Projeto", "Taiga")); itensPlanoDeMedicao .add(new ItemPlanoDeMedicaoDTO(OE_1, OM_2, "Qual a taxa de concluso de sprints no projeto?", "Taxa de Concluso de Sprints no Projeto", "Taiga")); itensPlanoDeMedicao .add(new ItemPlanoDeMedicaoDTO(OE_1, OM_3, "Quantas estrias foram planejadas para a sprint?", "Nmero de Estrias Planejadas para a Sprint", "Taiga")); itensPlanoDeMedicao .add(new ItemPlanoDeMedicaoDTO(OE_1, OM_3, "Quantas estrias foram concludas na sprint?", "Nmero de Estrias Concludas na Sprint", "Taiga")); itensPlanoDeMedicao .add(new ItemPlanoDeMedicaoDTO(OE_1, OM_3, "Qual a taxa de concluso de estrias na sprint?", "Taxa de Concluso de Estrias na Sprint", "Taiga")); itensPlanoDeMedicao .add(new ItemPlanoDeMedicaoDTO(OE_1, OM_3, "Quantos pontos de estria foram concludos na sprint?", "Pontos de Estria Concludos na Sprint", "Taiga")); itensPlanoDeMedicao.add( new ItemPlanoDeMedicaoDTO(OE_1, OM_3, "Qual a taxa de concluso de pontos de estrias na sprint?", "Taxa de Concluso de Pontos de Estrias na Sprint", "Taiga")); itensPlanoDeMedicao .add(new ItemPlanoDeMedicaoDTO(OE_1, OM_3, "Quantas tarefas foram planejados para a sprint?", "Nmero de Tarefas Planejadas para a Sprint", "Taiga")); itensPlanoDeMedicao.add(new ItemPlanoDeMedicaoDTO(OE_1, OM_3, "Quantas tarefas foram concludas na sprint?", "Nmero de Tarefas Concludas na Sprint", "Taiga")); itensPlanoDeMedicao .add(new ItemPlanoDeMedicaoDTO(OE_1, OM_3, "Qual a taxa de concluso de tarefas na sprint?", "Taxa de Concluso de Tarefas na Sprint", "Taiga")); itensPlanoDeMedicao.add( new ItemPlanoDeMedicaoDTO(OE_1, OM_3, "Quantos pontos de estria foram planejados para a sprint?", "Pontos de Estria Planejados para a Sprint", "Taiga")); itensPlanoDeMedicao .add(new ItemPlanoDeMedicaoDTO(OE_1, OM_4, "Quantas sprints foram realizadas no projeto?", "Nmero de Sprints Realizadas no Projeto", "Taiga")); itensPlanoDeMedicao .add(new ItemPlanoDeMedicaoDTO(OE_1, OM_4, "Quantas estrias foram concludas para o projeto?", "Nmero de Estrias Concludas para o Projeto", "Taiga")); itensPlanoDeMedicao .add(new ItemPlanoDeMedicaoDTO(OE_1, OM_4, "Quantos pontos de estria foram concludos no projeto?", "Pontos de Estria Concludos no Projeto", "Taiga")); itensPlanoDeMedicao.add(new ItemPlanoDeMedicaoDTO(OE_1, OM_4, "Qual o nmero mdio de estrias concludas por sprint no projeto?", "Mdia de Estrias Concludas por Sprint do Projeto", "Taiga")); itensPlanoDeMedicao.add(new ItemPlanoDeMedicaoDTO(OE_1, OM_4, "Qual o nmero mdio de pontos de estrias concludos por sprint no projeto? ", "Velocidade da Equipe no Projeto", "Taiga")); itensPlanoDeMedicao.add(new ItemPlanoDeMedicaoDTO(OE_1, OM_5, "Quantas tarefas foram concludas na sprint?", "Nmero de Tarefas Concludas na Sprint", "Taiga")); itensPlanoDeMedicao.add(new ItemPlanoDeMedicaoDTO(OE_1, OM_5, "Quantas doses de Iocaine ocorreram na sprint", "Nmero de Doses de Iocaine na Sprint", "Taiga")); itensPlanoDeMedicao.add(new ItemPlanoDeMedicaoDTO(OE_1, OM_5, "Qual a taxa de doses de Iocaine na sprint?", "Taxa de Doses de Iocaine na Sprint", "Taiga")); itensPlanoDeMedicao.add(new ItemPlanoDeMedicaoDTO(OE_1, OM_6, "Quantas tarefas foram atribudas a um membro da equipe do projeto?", "Nmero de Tarefas Atribudas a Membro do Projeto", "Taiga")); itensPlanoDeMedicao.add(new ItemPlanoDeMedicaoDTO(OE_1, OM_6, "Quantas tarefas foram concludas por um membro da equipe do projeto?", "Nmero de Tarefas Concludas pelo Membro do Projeto", "Taiga")); itensPlanoDeMedicao.add(new ItemPlanoDeMedicaoDTO(OE_1, OM_6, "Qual a taxa de concluso de tarefas de um membro da equipe do projeto?", "Taxa de Concluso de Tarefas de Membro do Projeto", "Taiga")); itensPlanoDeMedicao.add(new ItemPlanoDeMedicaoDTO(OE_1, OM_6, "Quantos pontos de estria foram atribudos a um membro da equipe do projeto?", "Nmero de Pontos de Estria Atribudos a Membro do Projeto", "Taiga")); itensPlanoDeMedicao.add(new ItemPlanoDeMedicaoDTO(OE_1, OM_6, "Quantas pontos de estria foram concludos por um membro da equipe do projeto?", "Nmero de Pontos de Estria Concludos pelo Membro do Projeto", "Taiga")); itensPlanoDeMedicao.add(new ItemPlanoDeMedicaoDTO(OE_1, OM_6, "Qual a taxa de concluso de pontos de estria de um membro da equipe do projeto?", "Taxa de Concluso de Pontos de Estria de Membro do Projeto", "Taiga")); itensPlanoDeMedicao.add(new ItemPlanoDeMedicaoDTO(OE_1, OM_6, "Quantas doses de Iocaine foram atribudas a um membro da equipe do projeto?", "Nmero de Doses de Iocaine Atribudas a Membro do Projeto", "Taiga")); itensPlanoDeMedicao.add(new ItemPlanoDeMedicaoDTO(OE_1, OM_6, "Qual a taxa de doses de Iocaine de um membro da equipe do projeto?", "Taxa de Doses de Iocaine de Membro do Projeto", "Taiga")); itensPlanoDeMedicao .add(new ItemPlanoDeMedicaoDTO(OE_2, OM_7, "Qual a complexidade ciclomtica mdia por mtodo?", "Mdia da Complexidade Ciclomtica por Mtodo", "SonarQube")); itensPlanoDeMedicao.add(new ItemPlanoDeMedicaoDTO(OE_2, OM_7, "Qual a taxa de duplicao de cdigo?", "Taxa de Duplicao de Cdigo", "SonarQube")); itensPlanoDeMedicao.add(new ItemPlanoDeMedicaoDTO(OE_2, OM_7, "Qual o percentual da dvida tcnica?", "Percentual da Dvida Tcnica", "SonarQube")); return Response.ok().entity(itensPlanoDeMedicao).build(); } /** * Obtem as periodicidades. * * @return * @throws Exception */ @Path("Periodicidade") @GET @Consumes(MediaType.APPLICATION_JSON + ";charset=utf-8") @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8") public Response obterPeriodicidades() throws Exception { Response response; EntityManager manager = XPersistence.createManager(); TypedQuery<Periodicidade> query = manager.createQuery("FROM Periodicidade", Periodicidade.class); List<Periodicidade> result = query.getResultList(); if (result == null) response = Response.status(Status.NOT_FOUND).build(); else { List<PeriodicidadeDTO> listaDto = new ArrayList<PeriodicidadeDTO>(); for (Periodicidade periodicidade : result) { PeriodicidadeDTO p = new PeriodicidadeDTO(); p.setNome(periodicidade.getNome()); listaDto.add(p); } response = Response.status(Status.OK).entity(listaDto).build(); } manager.close(); return response; } /** * Cria plano projeto. * * @param planoDto * - Recebe um objeto que contm todas as entidades pertencentes * ao plano de medio para a persistencia do mesmo. * @throws Exception */ @Path("/Plano") @POST @Consumes(MediaType.APPLICATION_JSON + ";charset=utf-8") @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8") public synchronized Response criarPlanoMedicao(PlanoDTO planoDto) throws Exception { if (planoDto.getNomePeriodicidade() == null || planoDto.getNomePeriodicidade().isEmpty()) throw new NullArgumentException("Periodicidade"); if (planoDto.getItensPlanoDeMedicao() == null || planoDto.getItensPlanoDeMedicao().isEmpty()) throw new NullArgumentException("ItemPlanoDeMedicaoDTO"); List<Periodicidade> periodicidades = SoMeSPCIntegrator.obterPeriodicidades(); Periodicidade periodicidadeSelecionada = null; for (Periodicidade periodicidade : periodicidades) { if (periodicidade.getNome().equalsIgnoreCase(planoDto.getNomePeriodicidade())) periodicidadeSelecionada = periodicidade; } boolean contemItemsTaiga = false; boolean contemItemsSonar = false; //Verifica se existem medidas do Taiga. for (ItemPlanoDeMedicaoDTO item : planoDto.getItensPlanoDeMedicao()) { MedidasTaiga medidaTaiga = MedidasTaiga.get(item.getMedida()); if (medidaTaiga != null) { contemItemsTaiga = true; break; } } //Verifica se existem medidas do SonarQube. for (ItemPlanoDeMedicaoDTO item : planoDto.getItensPlanoDeMedicao()) { MedidasSonarQube medidaSonar = MedidasSonarQube.get(item.getMedida()); if (medidaSonar != null) { contemItemsSonar = true; break; } } JSONObject json = new JSONObject(); int i = 0; //Caso 1 - Apenas medidas do Taiga if (contemItemsTaiga && !contemItemsSonar) { TaigaIntegrator taigaIntegrator = new TaigaIntegrator(planoDto.getTaigaLogin().getUrl(), planoDto.getTaigaLogin().getUsuario(), planoDto.getTaigaLogin().getSenha()); for (String apelido : planoDto.getProjetosTaiga()) { Projeto projeto = taigaIntegrator.obterProjetoTaiga(apelido); PlanoDeMedicao plano = SoMeSPCIntegrator.criarPlanoMedicaoProjetoTaigaSoMeSPC( planoDto.getItensPlanoDeMedicao(), periodicidadeSelecionada, planoDto.getTaigaLogin(), projeto); json.append("Plano " + (i + 1), plano.getNome()); i++; } //Caso 2 - Apenas medidas do Sonar } else if (!contemItemsTaiga && contemItemsSonar) { SonarQubeIntegrator sonarIntegrator = new SonarQubeIntegrator(planoDto.getSonarLogin().getUrl()); for (String chave : planoDto.getProjetosSonar()) { Recurso projetoSonar = sonarIntegrator.obterRecurso(chave); PlanoDeMedicao plano = SoMeSPCIntegrator.criarPlanoMedicaoProjetoSonarQubeSoMeSPC( planoDto.getItensPlanoDeMedicao(), periodicidadeSelecionada, planoDto.getSonarLogin(), projetoSonar); json.append("Plano " + (i + 1), plano.getNome()); i++; } //Caso 3 - medidas do Sonar e Taiga } else if (contemItemsTaiga && contemItemsSonar) { TaigaIntegrator taigaIntegrator = new TaigaIntegrator(planoDto.getTaigaLogin().getUrl(), planoDto.getTaigaLogin().getUsuario(), planoDto.getTaigaLogin().getSenha()); SonarQubeIntegrator sonarIntegrator = new SonarQubeIntegrator(planoDto.getSonarLogin().getUrl()); //Para cada projeto do Taiga, adiciona as medidas do Taiga e Sonar. for (String apelido : planoDto.getProjetosTaiga()) { List<Recurso> projetosSonar = new ArrayList<Recurso>(); for (String chave : planoDto.getProjetosSonar()) { Recurso projetoSonar = sonarIntegrator.obterRecurso(chave); projetosSonar.add(projetoSonar); } Projeto projeto = taigaIntegrator.obterProjetoTaiga(apelido); PlanoDeMedicao plano = SoMeSPCIntegrator.criarPlanoMedicaoProjetoTaigaSonarQubeSoMeSPC( planoDto.getItensPlanoDeMedicao(), periodicidadeSelecionada, planoDto.getTaigaLogin(), projeto, planoDto.getSonarLogin(), projetosSonar); json.append("Plano " + (i + 1), plano.getNome()); i++; } //Caso 4 - No encontrou itens de nenhuma das ferramentas } else { throw new Exception("No foram informadas medidas para nenhuma das ferramentas coletoras disponveis."); } return Response.ok().entity(json).build(); } @Path("Medicao/Total") @GET @Consumes(MediaType.APPLICATION_JSON + ";charset=utf-8") @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8") public Response obterTotalMedicoes(@QueryParam("medida") String nomeMedida, @QueryParam("entidade") int idEntidade, @QueryParam("dataInicio") String dtInicio, @QueryParam("dataFim") String dtFim) throws ParseException { Response response; Date dataInicio = fmt.parse(dtInicio); Date dataFim = fmt.parse(dtFim); EntityManager manager = XPersistence.createManager(); Query queryTotal = manager.createQuery("SELECT COUNT(*) FROM Medicao m " + "WHERE m.medidaPlanoDeMedicao.medida.nome = :nomeMedida " + "AND m.entidadeMensuravel.id = :idEntidade AND cast(m.data as date) BETWEEN :dataInicio AND :dataFim") .setParameter("nomeMedida", nomeMedida).setParameter("idEntidade", idEntidade) .setParameter("dataInicio", dataInicio, TemporalType.DATE) .setParameter("dataFim", dataFim, TemporalType.DATE); Long total = (Long) queryTotal.getSingleResult(); manager.close(); response = Response.status(Status.OK).entity(total).build(); return response; } /** * Obtem as medicoes. * * @return * @throws Exception */ @Path("Medicao") @GET @Consumes(MediaType.APPLICATION_JSON + ";charset=utf-8") @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8") public Response obterMedicoes(@QueryParam("medida") String nomeMedida, @QueryParam("entidade") int idEntidade, @QueryParam("indiceAtual") int indiceAtual, @QueryParam("tamanhoPagina") int tamanhoPagina, @QueryParam("dataInicio") String dtInicio, @QueryParam("dataFim") String dtFim) throws Exception { Response response; if (nomeMedida == null || nomeMedida.isEmpty() || dtInicio == null || dtInicio.isEmpty() || dtFim == null || dtFim.isEmpty() || idEntidade == 0) { response = Response.status(Status.BAD_REQUEST).build(); } else { EntityManager manager = XPersistence.createManager(); Date dataInicio = fmt.parse(dtInicio); Date dataFim = fmt.parse(dtFim); TypedQuery<Medicao> query = manager.createQuery("Select m FROM Medicao m " + "WHERE m.medidaPlanoDeMedicao.medida.nome = :nomeMedida " + "AND m.entidadeMensuravel.id = :idEntidade AND cast(m.data as date) BETWEEN :dataInicio AND :dataFim ORDER BY m.data ASC", Medicao.class).setParameter("nomeMedida", nomeMedida).setParameter("idEntidade", idEntidade) .setParameter("dataInicio", dataInicio, TemporalType.DATE) .setParameter("dataFim", dataFim, TemporalType.DATE) .setFirstResult((indiceAtual * tamanhoPagina) - tamanhoPagina).setMaxResults(tamanhoPagina); List<Medicao> result = query.getResultList(); if (result == null) response = Response.status(Status.NOT_FOUND).build(); else { List<MedicaoDTO> listaDto = new ArrayList<MedicaoDTO>(); for (Medicao medicao : result) { MedicaoDTO dto = new MedicaoDTO(); dto.setId(medicao.getId()); dto.setData(medicao.getData()); dto.setValorMedido(medicao.getValorMedido().getValorMedido()); listaDto.add(dto); } response = Response.status(Status.OK).entity(listaDto).build(); } manager.close(); } return response; } /** * Obtem as entidades com medies. * * @return Entidades com medies. * @throws Exception */ @Path("Medicao/Entidade") @GET @Consumes(MediaType.APPLICATION_JSON + ";charset=utf-8") @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8") public Response obterEntidadesComMedicoes(@QueryParam("medida") String nomeMedida) throws Exception { Response response; EntityManager manager = XPersistence.createManager(); TypedQuery<EntidadeMensuravel> query = manager.createQuery( "Select distinct(m.entidadeMensuravel) FROM Medicao m " + "WHERE m.medidaPlanoDeMedicao.medida.nome=:nomeMedida ORDER BY m.entidadeMensuravel.nome ", EntidadeMensuravel.class).setParameter("nomeMedida", nomeMedida); List<EntidadeMensuravel> result = query.getResultList(); if (result == null) response = Response.status(Status.NOT_FOUND).build(); else { List<EntidadeMensuravelDTO> listaDto = new ArrayList<EntidadeMensuravelDTO>(); for (EntidadeMensuravel em : result) { EntidadeMensuravelDTO dto = new EntidadeMensuravelDTO(); dto.setId(em.getId()); dto.setNome(em.getNome()); dto.setNomeTipo(em.getTipoDeEntidadeMensuravel().getNome()); listaDto.add(dto); } response = Response.status(Status.OK).entity(listaDto).build(); } manager.close(); return response; } }