Coverage Report - org.jtheque.films.services.impl.utils.web.analyzers.GenericFilmAnalyzer
 
Classes in this File Line Coverage Branch Coverage Complexity
GenericFilmAnalyzer
0 %
0/121
0 %
0/56
3.917
 
 1  
 package org.jtheque.films.services.impl.utils.web.analyzers;
 2  
 
 3  
 /*
 4  
  * This file is part of JTheque.
 5  
  *
 6  
  * JTheque is free software: you can redistribute it and/or modify
 7  
  * it under the terms of the GNU General Public License as published by
 8  
  * the Free Software Foundation, either version 3 of the License.
 9  
  *
 10  
  * JTheque is distributed in the hope that it will be useful,
 11  
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 12  
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 13  
  * GNU General Public License for more details.
 14  
  *
 15  
  * You should have received a copy of the GNU General Public License
 16  
  * along with JTheque.  If not, see <http://www.gnu.org/licenses/>.
 17  
  */
 18  
 
 19  
 import org.jtheque.core.managers.Managers;
 20  
 import org.jtheque.core.managers.beans.IBeansManager;
 21  
 import org.jtheque.films.IFilmsModule;
 22  
 import org.jtheque.films.services.able.IActorService;
 23  
 import org.jtheque.films.services.able.INotesService;
 24  
 import org.jtheque.films.services.able.IRealizersService;
 25  
 import org.jtheque.primary.od.able.Kind;
 26  
 import org.jtheque.primary.od.able.Person;
 27  
 import org.jtheque.primary.services.able.ICountriesService;
 28  
 import org.jtheque.primary.services.able.IKindsService;
 29  
 import org.jtheque.primary.utils.web.analyzers.generic.GenericGenerator;
 30  
 import org.jtheque.primary.utils.web.analyzers.generic.field.FieldGetter;
 31  
 import org.jtheque.primary.utils.web.analyzers.generic.operation.ScannerPossessor;
 32  
 import org.jtheque.utils.StringUtils;
 33  
 import org.jtheque.utils.bean.DataUtils;
 34  
 
 35  
 import javax.annotation.Resource;
 36  
 import java.util.Scanner;
 37  
 import java.util.regex.Pattern;
 38  
 
 39  
 /**
 40  
  * A generic film analyzer. It seems an analyzer who takes its parser information from an XML file.
 41  
  *
 42  
  * @author Baptiste Wicht
 43  
  */
 44  
 public final class GenericFilmAnalyzer extends AbstractFilmAnalyzer implements ScannerPossessor {
 45  
     @Resource
 46  
     private IKindsService kindsService;
 47  
 
 48  
     @Resource
 49  
     private IRealizersService realizersService;
 50  
 
 51  
     @Resource
 52  
     private INotesService notesService;
 53  
 
 54  
     @Resource
 55  
     private ICountriesService countriesService;
 56  
 
 57  
     @Resource
 58  
     private IActorService actorService;
 59  
 
 60  
     @Resource
 61  
     private IFilmsModule filmsModule;
 62  
 
 63  
     /**
 64  
      * The generator of the field getters.
 65  
      */
 66  
     private final GenericGenerator generator;
 67  
 
 68  
     private FieldGetter dateGetter;
 69  
     private FieldGetter durationGetter;
 70  
     private FieldGetter imageGetter;
 71  
     private FieldGetter kindGetter;
 72  
     private FieldGetter realizerGetter;
 73  
     private FieldGetter resumeGetter;
 74  
     private FieldGetter actorsGetter;
 75  
 
 76  
     private static final int SECONDS_IN_A_MINUTE = 60;
 77  
 
 78  0
     private static final Pattern ACTOR_SEPARATOR_PATTERN = Pattern.compile("%%%");
 79  0
     private static final Pattern HOUR_SEPARATOR_PATTERN = Pattern.compile("h");
 80  
 
 81  
     /**
 82  
      * Construct a new GenericFilmAnalyzer.
 83  
      *
 84  
      * @param generator The generator to use.
 85  
      */
 86  
     public GenericFilmAnalyzer(GenericGenerator generator) {
 87  0
         super();
 88  
 
 89  0
         this.generator = generator;
 90  
 
 91  0
         init();
 92  
 
 93  0
         Managers.getManager(IBeansManager.class).inject(this);
 94  0
     }
 95  
 
 96  
     @Override
 97  
     public Scanner getScanner() {
 98  0
         return null;
 99  
     }
 100  
 
 101  
     /**
 102  
      * Init the parser.
 103  
      */
 104  
     private void init() {
 105  0
         dateGetter = generator.getFieldGetter("date");
 106  0
         durationGetter = generator.getFieldGetter("duration");
 107  0
         imageGetter = generator.getFieldGetter("image");
 108  0
         kindGetter = generator.getFieldGetter("kind");
 109  0
         realizerGetter = generator.getFieldGetter("realizer");
 110  0
         resumeGetter = generator.getFieldGetter("resume");
 111  0
         actorsGetter = generator.getFieldGetter("actors");
 112  0
     }
 113  
 
 114  
     @Override
 115  
     public void findDate(String line) {
 116  0
         if (isDateDo()) {
 117  0
             return;
 118  
         }
 119  
 
 120  0
         if (dateGetter.mustGet(line)) {
 121  0
             String transformedLine = dateGetter.performOperations(line, this);
 122  
 
 123  0
             String value = dateGetter.getValue(transformedLine);
 124  
 
 125  0
             if (value != null) {
 126  0
                 getFilm().setYear(Integer.parseInt(value));
 127  
 
 128  0
                 setDate(true);
 129  
             }
 130  
         }
 131  0
     }
 132  
 
 133  
     @Override
 134  
     public void findDuration(String line) {
 135  0
         if (isDurationDo()) {
 136  0
             return;
 137  
         }
 138  
 
 139  0
         if (durationGetter.mustGet(line)) {
 140  0
             String transformedLine = durationGetter.performOperations(line, this);
 141  
 
 142  0
             String value = durationGetter.getValue(transformedLine);
 143  
 
 144  0
             if (value != null) {
 145  
                 int minutes;
 146  
 
 147  0
                 if (value.contains("h")) {
 148  0
                     String[] hour = HOUR_SEPARATOR_PATTERN.split(value);
 149  0
                     minutes = Integer.parseInt(hour[0]) * SECONDS_IN_A_MINUTE + Integer.parseInt(hour[1]);
 150  0
                 } else {
 151  0
                     minutes = Integer.parseInt(value);
 152  
                 }
 153  
 
 154  0
                 getFilm().setDuration(minutes);
 155  
 
 156  0
                 setDuration(true);
 157  
             }
 158  
         }
 159  0
     }
 160  
 
 161  
     @Override
 162  
     public void findImage(String line) {
 163  0
         if (isImageDo()) {
 164  0
             return;
 165  
         }
 166  
 
 167  0
         if (imageGetter.mustGet(line)) {
 168  0
             String transformedLine = imageGetter.performOperations(line, this);
 169  
 
 170  0
             String value = imageGetter.getValue(transformedLine);
 171  
 
 172  0
             if (value != null) {
 173  0
                 AnalyzerUtils.downloadMiniature(getFilm(), value);
 174  
 
 175  0
                 setImage(true);
 176  
             }
 177  
         }
 178  0
     }
 179  
 
 180  
     @Override
 181  
     public void findKind(String line) {
 182  0
         if (isKindDo()) {
 183  0
             return;
 184  
         }
 185  
 
 186  0
         if (kindGetter.mustGet(line)) {
 187  0
             String transformedLine = kindGetter.performOperations(line, this);
 188  
 
 189  0
             String value = kindGetter.getValue(transformedLine);
 190  
 
 191  0
             if (StringUtils.isNotEmpty(value)) {
 192  0
                 value = StringUtils.setFirstLetterOnlyUpper(value);
 193  
 
 194  0
                 if (kindsService.exists(value)) {
 195  0
                     getFilm().addKind(kindsService.getKind(value));
 196  
                 } else {
 197  0
                     Kind kind = kindsService.getEmptyKind();
 198  
 
 199  0
                     kind.setName(value);
 200  
 
 201  0
                     kindsService.create(kind);
 202  
 
 203  0
                     getFilm().addKind(kind);
 204  
                 }
 205  
 
 206  0
                 setKind(true);
 207  
             }
 208  
         }
 209  0
     }
 210  
 
 211  
 
 212  
     @Override
 213  
     public void findRealizer(String line) {
 214  0
         if (isRealizerDo()) {
 215  0
             return;
 216  
         }
 217  
 
 218  0
         if (realizerGetter.mustGet(line)) {
 219  0
             String transformedLine = realizerGetter.performOperations(line, this);
 220  
 
 221  0
             String value = realizerGetter.getValue(transformedLine);
 222  
 
 223  0
             if (value != null) {
 224  0
                 String[] nameAndFirstName = DataUtils.getNameAndFirstName(value);
 225  
 
 226  0
                 setRealizerOfFilm(nameAndFirstName[0], nameAndFirstName[1]);
 227  
 
 228  0
                 setRealizer(true);
 229  
             }
 230  
         }
 231  0
     }
 232  
 
 233  
     /**
 234  
      * Set the realizer of the film.
 235  
      *
 236  
      * @param name      The name of the realizer.
 237  
      * @param firstName The first name of the realizer.
 238  
      */
 239  
     private void setRealizerOfFilm(String name, String firstName) {
 240  0
         if (realizersService.exists(firstName, name)) {
 241  0
             getFilm().setTheRealizer(realizersService.getRealizer(firstName, name));
 242  
         } else {
 243  0
             Person realizer = realizersService.getEmptyRealizer();
 244  0
             realizer.setName(name);
 245  0
             realizer.setFirstName(firstName);
 246  0
             realizer.setTheCountry(countriesService.getDefaultCountry());
 247  0
             realizer.setNote(notesService.getDefaultNote());
 248  
 
 249  0
             realizersService.create(realizer);
 250  
 
 251  0
             getFilm().setTheRealizer(realizer);
 252  
         }
 253  0
     }
 254  
 
 255  
     @Override
 256  
     public void findActors(String line) {
 257  0
         if (isActorsDo()) {
 258  0
             return;
 259  
         }
 260  
 
 261  0
         if (actorsGetter.mustGet(line)) {
 262  0
             String transformedLine = actorsGetter.performOperations(line, this);
 263  
 
 264  0
             String value = actorsGetter.getValue(transformedLine);
 265  
 
 266  0
             if (value != null) {
 267  0
                 value = StringUtils.removeHTMLEntities(value);
 268  
 
 269  0
                 String[] actorsTemp = ACTOR_SEPARATOR_PATTERN.split(value);
 270  
 
 271  0
                 int current = 0;
 272  
 
 273  0
                 for (String name : actorsTemp) {
 274  0
                     if (current++ >= filmsModule.getConfiguration().getNumberOfActors()) {
 275  0
                         break;
 276  
                     }
 277  
 
 278  0
                     String[] nameAndFirstName = DataUtils.getNameAndFirstName(name);
 279  
 
 280  0
                     addActor(nameAndFirstName[0], nameAndFirstName[1]);
 281  
 
 282  0
                     if (getFilm().getActors().size() >= filmsModule.getConfiguration().getNumberOfActors()) {
 283  0
                         break;
 284  
                     }
 285  
                 }
 286  
             }
 287  
         }
 288  0
     }
 289  
 
 290  
     /**
 291  
      * Add an actor to the film.
 292  
      *
 293  
      * @param name      The name of the actor.
 294  
      * @param firstName The first name of the actor.
 295  
      */
 296  
     private void addActor(String name, String firstName) {
 297  0
         if (actorService.exist(firstName, name)) {
 298  0
             Person actor = actorService.getActor(firstName, name);
 299  0
             getFilm().addActor(actor);
 300  0
         } else {
 301  0
             Person actor = actorService.getEmptyActor();
 302  0
             actor.setName(name);
 303  0
             actor.setFirstName(firstName);
 304  0
             actor.setTheCountry(countriesService.getDefaultCountry());
 305  0
             actor.setNote(notesService.getDefaultNote());
 306  
 
 307  0
             actorService.create(actor);
 308  
 
 309  0
             getFilm().addActor(actor);
 310  
         }
 311  0
     }
 312  
 
 313  
     @Override
 314  
     public void findResume(String line) {
 315  0
         if (isResumeDo()) {
 316  0
             return;
 317  
         }
 318  
 
 319  0
         if (resumeGetter.mustGet(line)) {
 320  0
             String transformedLine = resumeGetter.performOperations(line, this);
 321  
 
 322  0
             String value = resumeGetter.getValue(transformedLine);
 323  
 
 324  0
             if (value != null) {
 325  0
                 getFilm().setResume(StringUtils.removeHTMLEntities(value));
 326  
 
 327  0
                 setResume(true);
 328  
             }
 329  
         }
 330  0
     }
 331  
 }