package br.gov.mj.sislegis.app.parser.senado;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import br.gov.mj.sislegis.app.enumerated.Origem;
import br.gov.mj.sislegis.app.model.Proposicao;
import br.gov.mj.sislegis.app.parser.ParserFetcher;
import br.gov.mj.sislegis.app.parser.ProposicaoSearcher;
import br.gov.mj.sislegis.app.parser.TipoProposicao;
import br.gov.mj.sislegis.app.parser.senado.xstream.DetalheMateriaV4;
import br.gov.mj.sislegis.app.parser.senado.xstream.ListMateriaClass;
import br.gov.mj.sislegis.app.parser.senado.xstream.ListaSubtiposMateria;
import br.gov.mj.sislegis.app.parser.senado.xstream.Materia;
import br.gov.mj.sislegis.app.parser.senado.xstream.PesquisaBasicaMateria;
import br.gov.mj.sislegis.app.util.SislegisUtil;
import com.thoughtworks.xstream.XStream;
/**
* Obtem dados de proposicao dos webservices da Senado: <br>
* O principal webservice é o ListarProposicao cuja url é:
*
* <pre>
* http://legis.senado.leg.br/dadosabertos/materia/113361?v=4
* </pre>
*
* <br>
* O mapeamento dos campos da proposicao e do webservices são:<br>
* <ul>
* <li>CAMPO - XPATH</li>
* <li>idProposicao - DetalheMateria/Materia/IdentificacaoMateria/CodigoMateria</li>
* <li>tipo - DetalheMateria/Materia/IdentificacaoMateria/SiglaSubtipoMateria</li>
* <li>ano - DetalheMateria/Materia/IdentificacaoMateria/AnoMateria</li>
* <li>numero - DetalheMateria/Materia/IdentificacaoMateria/NumeroMateria</li>
* <li>situacao - DetalheMateria/Materia/SituacaoAtual/Autuacoes/Autuacao/Situacao/SiglaSituacao</li>
* <li>comissao - DetalheMateria/Materia/SituacaoAtual/Autuacoes/Autuacao/Local/SiglaLocal</li>
* <li>autor - DetalheMateria/Materia/Autoria/Autor/NomeAutor</li>
* <li>ementa - DetalheMateria/Materia/DadosBasicosMateria/EmentaMateria</li>
* <li>linkProposicao - DetalheMateria/Materia/id</li>
* </ul>
*
* Veja o metodo conversor em @see ProposicaoWS
*/
public class ParserProposicaoSenado implements ProposicaoSearcher {
public static void main(String[] args) throws Exception {
ParserProposicaoSenado parser = new ParserProposicaoSenado();
System.out.println(parser.listaTipos());
Collection<Proposicao> searchProps = parser.searchProposicao("RQS", 1, 2015);
System.out.println("Busca retornou " + searchProps.size() + " proposicoes");
Proposicao propLista = searchProps.iterator().next();
Proposicao propGet = parser.getProposicao(propLista.getIdProposicao().longValue());
System.out.println(propGet.toString());
System.out.println(propLista.toString());
}
@Override
public Proposicao getProposicao(Long idProposicao) throws IOException {
String wsURL = "http://legis.senado.leg.br/dadosabertos/materia/" + idProposicao + "?v=4";
XStream xstream = new XStream();
xstream.ignoreUnknownElements();
DetalheMateriaV4 detalhaMateria = new DetalheMateriaV4();
DetalheMateriaV4.configXstream(xstream);
ParserFetcher.fetchXStream(wsURL, xstream, detalhaMateria);
Proposicao proposicao = new Proposicao();
proposicao = detalhaMateria.getProposicao();
if (proposicao == null) {
throw new IOException("Nao foi possível parsera proposicao");
}
return proposicao;
}
@Override
public List<TipoProposicao> listaTipos() throws IOException {
String wsUrl = "http://legis.senado.leg.br/dadosabertos/materia/subtipos";
XStream xstream = new XStream();
xstream.ignoreUnknownElements();
ListaSubtiposMateria list = new ListaSubtiposMateria();
ListaSubtiposMateria.configXstream(xstream);
ParserFetcher.fetchXStream(wsUrl, xstream, list);
return list.getTiposProposicao();
}
/**
* Retorna uma busca de proposições.<br>
* Documentação do serviço aqui:<br>
* http://legis.senado.leg.br/dadosabertos/docs/path__materia_pesquisa_lista
* .html
*
* @return
* @throws IOException
*/
public Collection<Proposicao> searchProposicao(String sigla, Integer numero, Integer ano) throws IOException {
StringBuilder wsURL = new StringBuilder("http://legis.senado.leg.br/dadosabertos/materia/pesquisa/lista?");
wsURL.append("v=4");
wsURL.append("&sigla=").append(URLEncoder.encode(sigla, "UTF-8"));
if (numero != null) {
wsURL.append("&numero=").append(numero);
}
wsURL.append("&ano=").append(ano);
try {
XStream xstream = new XStream();
xstream.ignoreUnknownElements();
PesquisaBasicaMateria pesquisaMateria = new PesquisaBasicaMateria();
PesquisaBasicaMateria.configXstream(xstream);
ParserFetcher.fetchXStream(wsURL.toString(), xstream, pesquisaMateria);
Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).fine(
"Descricao do data set retornado: '" + pesquisaMateria.getDescricaoResposta() + "'");
List<Materia> listMaterias = pesquisaMateria.getMaterias();
Collection<Proposicao> listProposicao = new ListMateriaClass(listMaterias);
return listProposicao;
} catch (Exception e) {
Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).log(
Level.SEVERE,
"Falhou ao procurar por proposicao. Params " + sigla + "," + numero + "," + ano + ". URL "
+ wsURL.toString(), e);
return null;
}
}
}