package br.gov.mj.sislegis.app.parser.camara;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
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.camara.xstream.Erro;
import br.gov.mj.sislegis.app.parser.camara.xstream.ListProposicaoLazy;
import br.gov.mj.sislegis.app.parser.camara.xstream.ListaSigla;
import br.gov.mj.sislegis.app.parser.camara.xstream.ObterProposicaoPorID;
import br.gov.mj.sislegis.app.parser.camara.xstream.Proposicoes;
import br.gov.mj.sislegis.app.util.SislegisUtil;
import com.thoughtworks.xstream.XStream;
/**
* Obtem dados de proposicao dos webservices da Câmara: <br>
* O principal webservice é o ListarProposicao cuja url é:
*
* <pre>
* http://www.camara.gov.br/SitCamaraWS/Proposicoes.asmx/ListarProposicoes?sigla=CON&numero=1&ano=2015&datApresentacaoIni=&datApresentacaoFim=&idTipoAutor=&parteNomeAutor=&siglaPartidoAutor=&siglaUFAutor=&generoAutor=&codEstado=&codOrgaoEstado=&emTramitacao=&v=4
* </pre>
*
* <br>
* O mapeamento dos campos da proposicao e do webservices são:<br>
* <ul>
* <li>CAMPO - XPATH</li>
* <li>idProposicao - proposicoes/proposicao/id</li>
* <li>tipo - proposicoes/proposicao/tipoProposicao/sigla</li>
* <li>ano - proposicoes/proposicao/ano</li>
* <li>numero - proposicoes/proposicao/numero</li>
* <li>situacao - proposicoes/proposicao/situacao/descricao</li>
* <li>comissao - proposicoes/proposicao/situacao/orgao/siglaOrgaoEstado</li>
* <li>autor - proposicoes/proposicao/autor1/txtNomeAutor</li>
* <li>ementa - proposicoes/proposicao/txtEmenta</li>
* <li>linkProposicao - proposicoes/proposicao/id + link estatico http://www2.camara.leg.br/proposicoesWeb/fichadetramitacao?idProposicao=</li>
* </ul>
*
* Veja o metodo conversor em @see ProposicaoWS
*/
public class ParserProposicaoCamara implements ProposicaoSearcher {
public static void main(String[] args) throws Exception {
ParserProposicaoCamara parser = new ParserProposicaoCamara();
Long idProposicao = 1197825l; // TODO: Informação que vem do filtro
// System.out.println(parser.getProposicao(idProposicao).toString());
// System.out.println(parser.listaTipos());
Collection<Proposicao> prop = parser.searchProposicao("PL", 5965, 2013);
for (Iterator iterator = prop.iterator(); iterator.hasNext();) {
Proposicao proposicaoLista = (Proposicao) iterator.next();
Proposicao proposicaoId = parser.getProposicao(proposicaoLista.getIdProposicao().longValue());
System.out.println("Busca '" + proposicaoLista.toString());
System.out.println("PorId '" + proposicaoId);
if (!proposicaoId.toString().equals(proposicaoLista.toString())) {
System.err.println("Proposicoes sao diferntes dependendo do WS usado");
}
}
}
/**
* Busca proposicao da camara por parametros<br>
* veja endpoint da camara aqui:<br>
* http://www.camara.gov.br/SitCamaraWS/Proposicoes.asmx?op=
* ListarProposicoes
*/
public Collection<Proposicao> searchProposicao(String tipo, Integer numero, Integer ano) throws IOException {
// http://www.camara.gov.br/SitCamaraWS/Proposicoes.asmx/ListarProposicoes?sigla=DIS&numero=&ano=2015&datApresentacaoIni=&datApresentacaoFim=&idTipoAutor=&parteNomeAutor=&siglaPartidoAutor=&siglaUFAutor=&generoAutor=&codEstado=&codOrgaoEstado=&emTramitacao=
StringBuilder wsURL = new StringBuilder(
"http://www.camara.gov.br/SitCamaraWS/Proposicoes.asmx/ListarProposicoes?");
wsURL.append("sigla=").append(tipo);
wsURL.append("&numero=").append(numero);
wsURL.append("&ano=").append(ano);
wsURL.append("&datApresentacaoIni=&datApresentacaoFim=&idTipoAutor=&parteNomeAutor=&siglaPartidoAutor=&siglaUFAutor=&generoAutor=&codEstado=&codOrgaoEstado=&emTramitacao=&v=4");
XStream xstream = new XStream();
xstream.ignoreUnknownElements();
Proposicoes proposicoes = new Proposicoes();
Proposicoes.configXstream(xstream);
Collection<Proposicao> listProposicao = new ArrayList<Proposicao>();
try {
ParserFetcher.fetchXStream(wsURL.toString(), xstream, proposicoes);
listProposicao = new ListProposicaoLazy(proposicoes.getProposicoes());
} catch (FileNotFoundException e) {
Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).log(Level.INFO, "Nenhum resultado encontrado");
} catch (Exception e) {
if (e.getMessage().equals("erro")) {
try {
Erro erro = new Erro();
xstream = new XStream();
xstream.ignoreUnknownElements();
xstream.processAnnotations(Erro.class);
ParserFetcher.fetchXStream(wsURL.toString(), xstream, erro);
Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).log(
Level.SEVERE,
"WebService retornou erro '" + erro.getDescricao() + "' para URL '" + wsURL.toString()
+ "'");
} catch (Exception e1) {
throw new IOException(e);
}
} else {
Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).log(Level.SEVERE,
"Falhou na conversão do parser para url " + wsURL.toString(), e);
throw new IOException(e);
}
}
return listProposicao;
}
public Proposicao getProposicao(Long idProposicao) throws IOException {
// Versao mais precisa usando o search.
String wsURL = "http://www.camara.gov.br/SitCamaraWS/Proposicoes.asmx/ObterProposicaoPorID?idProp="
+ idProposicao;
XStream xstream = new XStream();
xstream.ignoreUnknownElements();
ObterProposicaoPorID obterProposicaoWS = new ObterProposicaoPorID();
ObterProposicaoPorID.config(xstream);
ParserFetcher.fetchXStream(wsURL, xstream, obterProposicaoWS);
Proposicao prop = obterProposicaoWS.toProposicao();
// por algum motivo o search é melhor (possui todos os campos), portanto
// bucsamos novamente por
// ele.
Collection<Proposicao> props = searchProposicao(prop.getTipo(), Integer.parseInt(prop.getNumero()),
Integer.parseInt(prop.getAno()));
if (!props.isEmpty() && props.size() == 1) {
prop = props.iterator().next();
}
return prop;
}
public List<TipoProposicao> listaTipos() throws IOException {
String wsUrl = "http://www.camara.gov.br/SitCamaraWS/Proposicoes.asmx/ListarSiglasTipoProposicao";
XStream xstream = new XStream();
xstream.ignoreUnknownElements();
ListaSigla list = new ListaSigla();
xstream.alias("siglas", ListaSigla.class);
xstream.alias("sigla", TipoProposicao.class);
xstream.addImplicitCollection(ListaSigla.class, "siglas");
xstream.aliasAttribute(TipoProposicao.class, "sigla", "tipoSigla");
xstream.aliasAttribute(TipoProposicao.class, "nome", "descricao");
ParserFetcher.fetchXStream(wsUrl, xstream, list);
return list.getSiglas();
}
}