RiksdagenBallotApiImpl.java

  1. /*
  2.  * Copyright 2010 James Pether Sörling
  3.  *
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  *
  8.  *   http://www.apache.org/licenses/LICENSE-2.0
  9.  *
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  *
  16.  *  $Id$
  17.  *  $HeadURL$
  18. */
  19. package com.hack23.cia.service.external.riksdagen.impl;

  20. import java.text.ParseException;
  21. import java.util.ArrayList;
  22. import java.util.Date;
  23. import java.util.List;
  24. import java.util.Locale;

  25. import javax.xml.bind.JAXBElement;

  26. import org.slf4j.Logger;
  27. import org.slf4j.LoggerFactory;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.beans.factory.annotation.Qualifier;
  30. import org.springframework.oxm.Unmarshaller;
  31. import org.springframework.stereotype.Component;

  32. import com.hack23.cia.model.external.riksdagen.votering.impl.BallotContainer;
  33. import com.hack23.cia.model.external.riksdagen.votering.impl.VoteData;
  34. import com.hack23.cia.model.external.riksdagen.votering.impl.VoteDataDto;
  35. import com.hack23.cia.model.external.riksdagen.votering.impl.VoteDataEmbeddedId;
  36. import com.hack23.cia.model.external.riksdagen.voteringlista.impl.BallotDocumentElement;
  37. import com.hack23.cia.model.external.riksdagen.voteringlista.impl.VoteListContainerElement;
  38. import com.hack23.cia.service.external.common.api.XmlAgent;
  39. import com.hack23.cia.service.external.common.api.XmlAgentException;
  40. import com.hack23.cia.service.external.riksdagen.api.DataFailureException;
  41. import com.hack23.cia.service.external.riksdagen.api.RiksdagenBallotApi;

  42. /**
  43.  * The Class RiksdagenBallotApiImpl.
  44.  */
  45. @Component
  46. final class RiksdagenBallotApiImpl implements RiksdagenBallotApi {

  47.     /** The Constant BALLOT. */
  48.     private static final String BALLOT = "https://data.riksdagen.se/votering/${ID_KEY}/xml";

  49.     /** The Constant BALLOT_LIST. */
  50.     private static final String BALLOT_LIST="https://data.riksdagen.se/voteringlista/?rm=&bet=&punkt=&iid=&parti=&valkrets=&rost=&sz=10000&utformat=xml&gruppering=votering_id";

  51.     /** The Constant HTTP_VOTERING_RIKSDAGEN_EXTERNAL_MODEL_CIA_HACK23_COM_IMPL. */
  52.     private static final String HTTP_VOTERING_RIKSDAGEN_EXTERNAL_MODEL_CIA_HACK23_COM_IMPL = "http://votering.riksdagen.external.model.cia.hack23.com/impl";

  53.     /**
  54.      * The Constant HTTP_VOTERINGLISTA_RIKSDAGEN_EXTERNAL_MODEL_CIA_HACK23_COM_IMPL.
  55.      */
  56.     private static final String HTTP_VOTERINGLISTA_RIKSDAGEN_EXTERNAL_MODEL_CIA_HACK23_COM_IMPL = "http://voteringlista.riksdagen.external.model.cia.hack23.com/impl";


  57.     /** The Constant ID_KEY. */
  58.     private static final String ID_KEY = "${ID_KEY}";

  59.     /** The Constant LOGGER. */
  60.     private static final Logger LOGGER = LoggerFactory
  61.             .getLogger(RiksdagenBallotApiImpl.class);

  62.     /** The Constant PROBLEM_GETTING_BALLOT_ID_S_FROM_DATA_RIKSDAGEN_SE. */
  63.     private static final String PROBLEM_GETTING_BALLOT_ID_S_FROM_DATA_RIKSDAGEN_SE = "Problem getting ballot id:{} from data.riksdagen.se";

  64.     /** The Constant PROBLEM_GETTING_BALLOT_LIST_FROM_DATA_RIKSDAGEN_SE. */
  65.     private static final String PROBLEM_GETTING_BALLOT_LIST_FROM_DATA_RIKSDAGEN_SE = "Problem getting ballot list from data.riksdagen.se";

  66.     /** The riksdagen date util. */
  67.     private final RiksdagenDateUtil riksdagenDateUtil = new RiksdagenDateUtil();
  68.    
  69.     /** The riksdagen ballot list marshaller. */
  70.     @Autowired
  71.     @Qualifier("riksdagenBallotListMarshaller")
  72.     private Unmarshaller riksdagenBallotListMarshaller;

  73.     /** The riksdagen ballot marshaller. */
  74.     @Autowired
  75.     @Qualifier("riksdagenBallotMarshaller")
  76.     private Unmarshaller riksdagenBallotMarshaller;

  77.     /** The xml agent. */
  78.     private final XmlAgent xmlAgent;


  79.     /**
  80.      * Instantiates a new riksdagen ballot api impl.
  81.      *
  82.      * @param xmlAgent
  83.      *            the xml agent
  84.      */
  85.     @Autowired
  86.     public RiksdagenBallotApiImpl(final XmlAgent xmlAgent) {
  87.         super();
  88.         this.xmlAgent = xmlAgent;
  89.     }




  90.     /* (non-Javadoc)
  91.      * @see com.hack23.cia.service.external.riksdagen.api.RiksdagenBallotApi#getBallot(java.lang.String)
  92.      */
  93.     @Override
  94.     public List<VoteData> getBallot(final String id) throws DataFailureException {
  95.         final String url = BALLOT.replace(ID_KEY, id);

  96.         final BallotContainer ballotContainer;
  97.         try {
  98.             ballotContainer = ((JAXBElement<BallotContainer>) xmlAgent.unmarshallXml(
  99.                     riksdagenBallotMarshaller, url,
  100.                     HTTP_VOTERING_RIKSDAGEN_EXTERNAL_MODEL_CIA_HACK23_COM_IMPL,null,null))
  101.                     .getValue();

  102.             final List<VoteData> result = new ArrayList<>();
  103.             if (ballotContainer != null && ballotContainer.getBallotDocumentData() != null) {
  104.                
  105.                 final List<VoteDataDto> voteDataList = ballotContainer.getBallotDocumentData().getVoteDataList();              
  106.                 final Date ballotDate=riksdagenDateUtil.tryToFindValidVoteDate(ballotContainer, voteDataList);
  107.                
  108.                 for (final VoteDataDto voteDataDto: voteDataList) {
  109.                     final VoteData voteData= new VoteData().withEmbeddedId(new VoteDataEmbeddedId().withBallotId(voteDataDto.getBallotId()).withIntressentId(voteDataDto.getIntressentId()).withIssue(voteDataDto.getIssue()).withConcern(voteDataDto.getConcern()));
  110.                    
  111.                     voteData.setBankNumber(voteDataDto.getBankNumber());
  112.                     voteData.setLabel(voteDataDto.getLabel());
  113.                     voteData.setLastName(voteDataDto.getLastName());
  114.                     voteData.setBornYear(voteDataDto.getBornYear());
  115.                     voteData.setFirstName(voteDataDto.getFirstName());
  116.                     voteData.setPlace(voteDataDto.getPlace());
  117.                     voteData.setGender(voteDataDto.getGender());
  118.                     voteData.setFullName(voteDataDto.getFullName());
  119.                     voteData.setParty(voteDataDto.getParty().toUpperCase(Locale.ENGLISH));
  120.                     voteData.setRm(voteDataDto.getRm());
  121.                     voteData.setVote(voteDataDto.getVote());
  122.                     voteData.setBallotType(voteDataDto.getBallotType());
  123.                     voteData.setElectoralRegionNumber(voteDataDto.getElectoralRegionNumber());
  124.                     voteData.setElectoralRegion(voteDataDto.getElectoralRegion());              
  125.                     voteData.setVoteDate(ballotDate);
  126.                    
  127.                     result.add(voteData);
  128.                 }              
  129.             }

  130.             return result;

  131.         } catch (final XmlAgentException | ParseException e) {
  132.             LOGGER.warn(PROBLEM_GETTING_BALLOT_ID_S_FROM_DATA_RIKSDAGEN_SE,id);
  133.             throw new DataFailureException(e);
  134.         }



  135.     }

  136.     /* (non-Javadoc)
  137.      * @see com.hack23.cia.service.external.riksdagen.api.RiksdagenBallotApi#getBallotList()
  138.      */
  139.     @Override
  140.     public List<BallotDocumentElement> getBallotList() throws DataFailureException {

  141.         try {
  142.             final String url = BALLOT_LIST;
  143.             return ((JAXBElement<VoteListContainerElement>) xmlAgent.unmarshallXml(riksdagenBallotListMarshaller, url,
  144.                             HTTP_VOTERINGLISTA_RIKSDAGEN_EXTERNAL_MODEL_CIA_HACK23_COM_IMPL,null,null))
  145.                             .getValue().getVotering();
  146.         } catch (final XmlAgentException e) {
  147.             LOGGER.warn(PROBLEM_GETTING_BALLOT_LIST_FROM_DATA_RIKSDAGEN_SE);
  148.             throw new DataFailureException(e);
  149.         }
  150.     }
  151. }