Coverage Report - org.jtheque.films.services.impl.utils.web.GenericWebGetter
 
Classes in this File Line Coverage Branch Coverage Complexity
GenericWebGetter
0 %
0/102
0 %
0/40
3.182
 
 1  
 package org.jtheque.films.services.impl.utils.web;
 2  
 
 3  
 import org.jtheque.core.managers.Managers;
 4  
 import org.jtheque.core.managers.beans.IBeansManager;
 5  
 import org.jtheque.core.managers.log.ILoggingManager;
 6  
 import org.jtheque.core.managers.update.UpdateListener;
 7  
 import org.jtheque.films.persistence.od.able.Film;
 8  
 import org.jtheque.films.services.able.IFilmsService;
 9  
 import org.jtheque.films.services.able.INotesService;
 10  
 import org.jtheque.films.services.impl.utils.EditArguments;
 11  
 import org.jtheque.films.services.impl.utils.web.analyzers.GenericFilmAnalyzer;
 12  
 import org.jtheque.films.services.impl.utils.web.analyzers.GenericFilmResultAnalyzer;
 13  
 import org.jtheque.films.utils.Constants.Site;
 14  
 import org.jtheque.primary.services.able.IKindsService;
 15  
 import org.jtheque.primary.services.able.ILanguagesService;
 16  
 import org.jtheque.primary.services.able.ITypesService;
 17  
 import org.jtheque.primary.utils.web.analyzers.generic.GenericGenerator;
 18  
 import org.jtheque.primary.utils.web.analyzers.generic.Page;
 19  
 import org.jtheque.primary.utils.web.analyzers.generic.Pages;
 20  
 import org.jtheque.primary.utils.web.analyzers.generic.operation.ScannerPossessor;
 21  
 import org.jtheque.primary.utils.web.analyzers.generic.transform.Transformer;
 22  
 
 23  
 import javax.annotation.Resource;
 24  
 import java.io.File;
 25  
 import java.io.IOException;
 26  
 import java.net.MalformedURLException;
 27  
 import java.net.URL;
 28  
 import java.net.URLConnection;
 29  
 import java.util.ArrayList;
 30  
 import java.util.Collection;
 31  
 import java.util.Scanner;
 32  
 
 33  
 /*
 34  
  * This file is part of JTheque.
 35  
  *
 36  
  * JTheque is free software: you can redistribute it and/or modify
 37  
  * it under the terms of the GNU General Public License as published by
 38  
  * the Free Software Foundation, either version 3 of the License.
 39  
  *
 40  
  * JTheque is distributed in the hope that it will be useful,
 41  
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 42  
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 43  
  * GNU General Public License for more details.
 44  
  *
 45  
  * You should have received a copy of the GNU General Public License
 46  
  * along with JTheque.  If not, see <http://www.gnu.org/licenses/>.
 47  
  */
 48  
 
 49  
 /**
 50  
  * A generic web getter.
 51  
  *
 52  
  * @author Baptiste Wicht
 53  
  */
 54  
 public final class GenericWebGetter extends AbstractWebGetter implements ScannerPossessor, UpdateListener {
 55  
     @Resource
 56  
     private ITypesService typesService;
 57  
 
 58  
     @Resource
 59  
     private INotesService notesService;
 60  
 
 61  
     @Resource
 62  
     private ILanguagesService languagesService;
 63  
 
 64  
     @Resource
 65  
     private IKindsService kindsService;
 66  
 
 67  
     @Resource
 68  
     private IFilmsService filmsService;
 69  
 
 70  
     private Scanner scanner;
 71  
 
 72  
     private Pages pages;
 73  
 
 74  
     private final String xmlFile;
 75  
     private final Site site;
 76  
 
 77  
     /**
 78  
      * Construct a new GenericWebGetter.
 79  
      *
 80  
      * @param xmlFile The xml file path.
 81  
      * @param site    The site of the generic web getter.
 82  
      */
 83  
     public GenericWebGetter(String xmlFile, Site site) {
 84  0
         super();
 85  
 
 86  0
         this.xmlFile = xmlFile;
 87  0
         this.site = site;
 88  
 
 89  0
         Managers.getManager(IBeansManager.class).inject(this);
 90  
 
 91  0
         generate();
 92  
 
 93  0
         GettersUpdatable.getInstance().addUpdateListener(this);
 94  0
     }
 95  
 
 96  
     /**
 97  
      * Fill the web getter using a generic generator.
 98  
      */
 99  
     private void generate() {
 100  0
         GenericGenerator generator = new GenericGenerator(this);
 101  0
         generator.generate(new File(Managers.getCore().getFolders().getApplicationFolder(), "/analyzers/" + xmlFile));
 102  
 
 103  0
         pages = generator.getPages();
 104  
 
 105  0
         setAnalyzer(new GenericFilmAnalyzer(generator));
 106  0
         setResultAnalyzer(new GenericFilmResultAnalyzer(generator, site));
 107  0
     }
 108  
 
 109  
     @Override
 110  
     public boolean canGetOn(Site site) {
 111  0
         return this.site == site;
 112  
     }
 113  
 
 114  
     @Override
 115  
     public Film getFilm(FilmResult search, Film filmToModify, EditArguments args) {
 116  
         Film film;
 117  
 
 118  0
         boolean editActors = true;
 119  
 
 120  0
         if (filmToModify == null) {
 121  0
             film = filmsService.getEmptyFilm();
 122  
         } else {
 123  0
             film = filmToModify;
 124  
 
 125  0
             if (args != null) {
 126  0
                 getAnalyzer().configureWithEditArgs(args);
 127  0
                 editActors = args.isEditActors();
 128  
             }
 129  
         }
 130  
 
 131  0
         getAnalyzer().setFilm(film);
 132  
 
 133  0
         film.setTitle(search.getTitre());
 134  0
         film.setTheLanguage(languagesService.getDefaultLanguage());
 135  0
         film.setNote(notesService.getDefaultNote());
 136  0
         film.setTheType(typesService.getDefaultType());
 137  
 
 138  0
         String index = search.getIndex();
 139  
 
 140  0
         boolean twoPhase = pages.getActorsPage() != null;
 141  
 
 142  0
         launchFirstPhase(index, twoPhase);
 143  0
         launchSecondPhaseIfNeeded(editActors, index, twoPhase);
 144  
 
 145  0
         getAnalyzer().reset();
 146  
 
 147  0
         completeKinds(film);
 148  
 
 149  0
         return film;
 150  
     }
 151  
 
 152  
     /**
 153  
      * Complete the kinds of the film.
 154  
      *
 155  
      * @param film The film to complete.
 156  
      */
 157  
     private void completeKinds(Film film) {
 158  0
         if (film.hasKinds()) {
 159  0
             film.addKind(kindsService.getDefaultKind());
 160  
         }
 161  0
     }
 162  
 
 163  
     /**
 164  
      * Launch the first phase of the web getting process.
 165  
      *
 166  
      * @param index    The index url.
 167  
      * @param twoPhase Indicate if there is two phase or not.
 168  
      */
 169  
     private void launchFirstPhase(String index, boolean twoPhase) {
 170  
         try {
 171  0
             Page filmsPage = pages.getFilmsPage();
 172  
 
 173  0
             String url = filmsPage.getUrl() + index;
 174  
 
 175  0
             for (Transformer transformer : filmsPage.getTransformers()) {
 176  0
                 url = transformer.transform(url);
 177  
             }
 178  
 
 179  0
             openConnectionToURL(url);
 180  
 
 181  0
             getAnalyzer().setScanner(scanner);
 182  
 
 183  0
             if (twoPhase) {
 184  0
                 getAnalyzer().setActors(true);
 185  
             }
 186  
 
 187  0
             while (scanner.hasNextLine() && getAnalyzer().isNotComplete()) {
 188  0
                 String line = scanner.nextLine().trim();
 189  
 
 190  0
                 getAnalyzer().analyzeLine(line);
 191  0
             }
 192  
 
 193  0
         } catch (MalformedURLException e) {
 194  0
             Managers.getManager(ILoggingManager.class).getLogger(getClass()).error(e);
 195  0
         } catch (IOException e) {
 196  0
             Managers.getManager(ILoggingManager.class).getLogger(getClass()).error(e);
 197  
         } finally {
 198  0
             if (scanner != null) {
 199  0
                 scanner.close();
 200  
             }
 201  
         }
 202  0
     }
 203  
 
 204  
     /**
 205  
      * Launch the second phase if needed.
 206  
      *
 207  
      * @param editActors Indicate if we must edit actors.
 208  
      * @param index      The index url.
 209  
      * @param twoPhase   Indicate if we must make the second phase or not.
 210  
      */
 211  
     private void launchSecondPhaseIfNeeded(boolean editActors, String index, boolean twoPhase) {
 212  0
         if (twoPhase && editActors) {
 213  
             try {
 214  0
                 Page actorsPage = pages.getActorsPage();
 215  
 
 216  0
                 String url = actorsPage.getUrl() + index;
 217  
 
 218  0
                 for (Transformer transformer : actorsPage.getTransformers()) {
 219  0
                     url = transformer.transform(url);
 220  
                 }
 221  
 
 222  0
                 openConnectionToURL(url);
 223  
 
 224  0
                 getAnalyzer().setScanner(scanner);
 225  0
                 getAnalyzer().setActors(false);
 226  
 
 227  0
                 while (scanner.hasNextLine() && getAnalyzer().isNotComplete()) {
 228  0
                     String line = scanner.nextLine().trim();
 229  
 
 230  0
                     getAnalyzer().analyzeLine(line);
 231  0
                 }
 232  0
             } catch (MalformedURLException e) {
 233  0
                 Managers.getManager(ILoggingManager.class).getLogger(getClass()).error(e);
 234  0
             } catch (IOException e) {
 235  0
                 Managers.getManager(ILoggingManager.class).getLogger(getClass()).error(e);
 236  
             } finally {
 237  0
                 if (scanner != null) {
 238  0
                     scanner.close();
 239  
                 }
 240  
             }
 241  
         }
 242  0
     }
 243  
 
 244  
     @Override
 245  
     public Collection<FilmResult> getFilms(String search) {
 246  
         try {
 247  0
             Page resultsPage = pages.getResultsPage();
 248  
 
 249  0
             String url = resultsPage.getUrl() + search;
 250  
 
 251  0
             for (Transformer transformer : resultsPage.getTransformers()) {
 252  0
                 url = transformer.transform(url);
 253  
             }
 254  
 
 255  0
             openConnectionToURL(url);
 256  
 
 257  0
             getResultAnalyzer().setScanner(scanner);
 258  
 
 259  0
             while (scanner.hasNextLine() && getResultAnalyzer().isNotComplete()) {
 260  0
                 String line = scanner.nextLine().trim();
 261  
 
 262  0
                 getResultAnalyzer().analyzeLine(line);
 263  0
             }
 264  0
         } catch (MalformedURLException e) {
 265  0
             Managers.getManager(ILoggingManager.class).getLogger(getClass()).error(e);
 266  0
         } catch (IOException e) {
 267  0
             Managers.getManager(ILoggingManager.class).getLogger(getClass()).error(e);
 268  
         } finally {
 269  0
             if (scanner != null) {
 270  0
                 scanner.close();
 271  
             }
 272  
         }
 273  
 
 274  0
         Collection<FilmResult> films = new ArrayList<FilmResult>(getResultAnalyzer().getResults());
 275  
 
 276  0
         getResultAnalyzer().reset();
 277  
 
 278  0
         return films;
 279  
     }
 280  
 
 281  
     /**
 282  
      * Open a connection to the URL.
 283  
      *
 284  
      * @param url The URL to open connection to.
 285  
      * @throws IOException If an error occurs during opening the connection to the URL.
 286  
      */
 287  
     private void openConnectionToURL(String url) throws IOException {
 288  0
         URL fileUrl = new URL(url);
 289  
 
 290  0
         URLConnection urlConnection = fileUrl.openConnection();
 291  0
         urlConnection.setUseCaches(false);
 292  0
         urlConnection.connect();
 293  
 
 294  0
         scanner = new Scanner(urlConnection.getInputStream());
 295  0
     }
 296  
 
 297  
     @Override
 298  
     public Scanner getScanner() {
 299  0
         return scanner;
 300  
     }
 301  
 
 302  
     @Override
 303  
     public void updated() {
 304  0
         generate();
 305  0
     }
 306  
 }