/** * ======================== legal notice ====================== * * File: DataManager.java Created: 13. June 2012, 04:57 Author: Geronimo Project: cmpc - a java frontend * (client) part of compound media player uses external players to play the * media * * CMP - compound media player * * is a client/server mediaplayer intended to play any media from any * workstation without the need to export or mount shares. cmps is an easy to * use backend with a (ready to use) HTML-interface. Additionally the backend * supports authentication via HTTP-digest authorization. cmpc is a client with * vdr-like osd-menues. * * Copyright (c) 2012 Reinhard Mantey, some rights reserved! published under * Creative Commons by-sa For details see * http://creativecommons.org/licenses/by-sa/3.0/ * * The cmp project's homepage is at * http://projects.vdr-developer.org/projects/cmp * * -------------------------------------------------------------- */ package de.schwarzrot.media.service; import java.io.File; import java.util.Map; import java.util.Stack; import javax.swing.SwingUtilities; import javax.swing.tree.DefaultMutableTreeNode; import ca.odell.glazedlists.EventList; import de.schwarzrot.base.util.ApplicationServiceProvider; import de.schwarzrot.base.util.SuccessHandler; import de.schwarzrot.media.domain.AbstractMediaNode; import de.schwarzrot.media.domain.Genre; import de.schwarzrot.media.domain.Media; import de.schwarzrot.media.util.ElementConsumer; import de.schwarzrot.media.util.ListLoader; public class DataManager implements Runnable, ElementConsumer { public DataManager(File input, Map cache) { this.input = input; nodeCache = cache; } @Override public void consumeElement(Media m) { if (m.getParent() == null) m.setParent(getGenre(m.getRealPath().getParentFile())); mediaList.getReadWriteLock().writeLock().lock(); mediaList.add(m); mediaList.getReadWriteLock().writeLock().unlock(); } public void load(DefaultMutableTreeNode root, EventList mediaList, SuccessHandler successHandler) { Thread backgroundThread = new Thread(this); nodeCache.clear(); resultHandler = successHandler; rootNode = root; nodeCache.put(new File("/"), rootNode); this.mediaList = mediaList; backgroundThread.setName("load media list"); backgroundThread.setDaemon(true); backgroundThread.start(); } @Override public void run() { @SuppressWarnings("unchecked") ListLoader ll = ApplicationServiceProvider.getService(ListLoader.class); try { long[] info = ll.loadFirst(this); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { resultHandler.handleSuccess(); // feedback to main thread } }); ll.loadRest(info, this); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { resultHandler.handleSuccess(); // feedback to main thread } }); } catch (final Throwable t) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { resultHandler.handleFailure(t); // feedback to main thread } }); } } protected void createGenre(File path) { File tmp = path; Stack unknownGenres = new Stack(); while (tmp != null && !nodeCache.containsKey(tmp)) { unknownGenres.push(tmp); tmp = tmp.getParentFile(); } DefaultMutableTreeNode treeNode = tmp == null ? rootNode : nodeCache.get(tmp); AbstractMediaNode media = (AbstractMediaNode) treeNode.getUserObject(); DefaultMutableTreeNode subNode = null; Genre g = null; if (media != null && media instanceof Genre) g = (Genre) media; while (unknownGenres.size() > 0) { tmp = unknownGenres.pop(); g = new Genre(g, tmp); subNode = new DefaultMutableTreeNode(g); nodeCache.put(tmp, subNode); treeNode.add(subNode); treeNode = subNode; } } protected Genre getGenre(File path) { if (!nodeCache.containsKey(path)) createGenre(path); DefaultMutableTreeNode n = nodeCache.get(path); AbstractMediaNode rv = (AbstractMediaNode) n.getUserObject(); if (rv instanceof Genre) return (Genre) rv; return null; } @SuppressWarnings("unused") private File input; private SuccessHandler resultHandler; private DefaultMutableTreeNode rootNode; private EventList mediaList; private Map nodeCache; }