LoadDisclistTask.java :  » Music » jukes » com » melloware » jukes » gui » view » tasks » Java Open Source

Java Open Source » Music » jukes 
jukes » com » melloware » jukes » gui » view » tasks » LoadDisclistTask.java
package com.melloware.jukes.gui.view.tasks;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.jgoodies.uif.util.ResourceUtils;
import com.jgoodies.uif.util.Worker;
import com.melloware.jukes.db.orm.Artist;
import com.melloware.jukes.db.orm.Catalog;
import com.melloware.jukes.db.orm.Disc;
import com.melloware.jukes.file.Disclist;

/**
 * In a thread attempts to load the disclist one disc at a time and notify user
 * of the progress.
 * <p>
 * Copyright (c) 1999-2007 Melloware, Inc. <http://www.melloware.com>
 * @author Emil A. Lefkof III <info@melloware.com>
 * @version 4.0 AZ Development 2009
 */
@SuppressWarnings("unchecked")
public final class LoadDisclistTask extends LongTask {

   private static final Log LOG = LogFactory.getLog(LoadDisclistTask.class);
   private static final String BREAK = " - ";
   private final File file;
   private final List discLines;
   private final Disclist disclist;
   private final Map artists;

   /**
    * Constructor that needs a file to load.
    * <p>
    * @param aFile the file to load
    * @throws Exception if any error occurs
    */
   public LoadDisclistTask(File aFile, Disclist aDisclist) throws Exception {
      super();
      LOG.debug("Loading disclist");
      this.file = aFile;
      this.disclist = aDisclist;

      // put all the artists in a map for faster access
      List artists = Catalog.findAllArtists();
      HashMap map = new HashMap(artists.size());
      Iterator iter = artists.iterator();
      while (iter.hasNext()) {
         Artist element = (Artist) iter.next();
         map.put(element.getName(), element);
      }
      this.artists = map;

      // load disclist
      discLines = FileUtils.readLines(file, null);
      lengthOfTask = discLines.size();
      LOG.debug("Length of Task = " + lengthOfTask);
   }

   /**
    * Called to start the task.
    */
   @Override
   public void go() {
      final Worker worker = new Worker() {
         @Override
         public Object construct() {
            current = 0;
            done = false;
            canceled = false;
            statMessage = null;
            return new ActualTask();
         }
      };
      worker.start();
   }

   /**
    * Try to locate this disc in the database and load into disclist.
    * <p>
    * @param artistName the artist name
    * @param discName the disc name
    * @return the Disc if found else null
    */
   private Disc findDisc(String artistName, String discName) {
      Disc result = null;

      Artist artist = (Artist) this.artists.get(artistName);
      if (artist == null) {
         return result;
      }
      Iterator iter = artist.getDiscs().iterator();
      DISC_LOOP: while (iter.hasNext()) {
         Disc disc = (Disc) iter.next();
         if (StringUtils.equalsIgnoreCase(disc.getName(), discName)) {
            result = disc;
            break DISC_LOOP;
         }
      }

      return result;
   }

   /**
    * The actual long running task. This runs in a SwingWorker thread.
    */
   class ActualTask {
      ActualTask() {
         while (!canceled && !done) {
            try {
               if (discLines != null) { // NOPMD
                  int count = 1;
                  final Iterator iter = discLines.iterator();
                  while ((iter.hasNext()) && (!canceled && !done)) {
                     current = count;
                     count++;
                     String element = (String) iter.next();

                     String artist = StringUtils.substringBefore(element, BREAK).trim();
                     element = StringUtils.substringAfter(element, BREAK).trim();
                     element = StringUtils.substringBeforeLast(element, BREAK).trim();
                     String discString = element;
                     Disc disc = findDisc(artist, discString);
                     if (disc != null) {
                        statMessage = ResourceUtils.getString("messages.Loading") + disc.getName();
                        disclist.add(disc);
                     }

                  }
               }

               done = true;
            } catch (Exception ex) {
               stop();
               LOG.info(ResourceUtils.getString("messages.ExceptionLoadingDiscs"), ex);
               statMessage = ResourceUtils.getString("messages.ExceptionLoadingDiscs") + ex.getMessage();
            }
         }
      }

   }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.