/*
* Copyright 2008-2013, ETH Zürich, Samuel Welten, Michael Kuhn, Tobias Langner,
* Sandro Affentranger, Lukas Bossard, Michael Grob, Rahul Jain,
* Dominic Langenegger, Sonia Mayor Alonso, Roger Odermatt, Tobias Schlueter,
* Yannick Stucki, Sebastian Wendland, Samuel Zehnder, Samuel Zihlmann,
* Samuel Zweifel
*
* This file is part of Jukefox.
*
* Jukefox is free software: you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or any later version. Jukefox is
* distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* Jukefox. If not, see <http://www.gnu.org/licenses/>.
*/
package ch.ethz.dcg.jukefox.model;
import java.util.HashMap;
import ch.ethz.dcg.jukefox.commons.AbstractLanguageHelper;
import ch.ethz.dcg.jukefox.commons.DataUnavailableException;
import ch.ethz.dcg.jukefox.commons.utils.Log;
import ch.ethz.dcg.jukefox.data.cache.PreloadedDataManager;
import ch.ethz.dcg.jukefox.data.db.IDbDataPortal;
import ch.ethz.dcg.jukefox.manager.DirectoryManager;
import ch.ethz.dcg.jukefox.manager.ModelSettingsManager;
import ch.ethz.dcg.jukefox.manager.ResourceLoaderManager;
import ch.ethz.dcg.jukefox.manager.libraryimport.LibraryImportManager;
import ch.ethz.dcg.jukefox.model.libraryimport.ImportState;
import ch.ethz.dcg.jukefox.model.providers.AlbumProvider;
import ch.ethz.dcg.jukefox.model.providers.ArtistProvider;
import ch.ethz.dcg.jukefox.model.providers.CollectionPlaylistProvider;
import ch.ethz.dcg.jukefox.model.providers.DbAccessProvider;
import ch.ethz.dcg.jukefox.model.providers.GenreProvider;
import ch.ethz.dcg.jukefox.model.providers.ModifyProvider;
import ch.ethz.dcg.jukefox.model.providers.OtherDataProvider;
import ch.ethz.dcg.jukefox.model.providers.SongCoordinatesProvider;
import ch.ethz.dcg.jukefox.model.providers.SongProvider;
import ch.ethz.dcg.jukefox.model.providers.TagProvider;
/**
* This class manages all collection model providers and changes in the model.
*/
public abstract class AbstractCollectionModelManager {
private static final String TAG = AbstractCollectionModelManager.class.getSimpleName();
private HashMap<String, AbstractPlayerModelManager> playerModelManagers;
// ---===== Data Manages & Other =====---
private final PreloadedDataManager preloadedDataManager;
protected final IDbDataPortal dbDataPortal;
private final ResourceLoaderManager resourceLoaderManager;
protected final ImportState importState;
private final TagPlaylistGenerator tagPlaylistGenerator;
protected final DirectoryManager directoryManager;
protected final ModelSettingsManager modelSettingsManager;
// ---===== Model Providers =====---
private final AlbumProvider albumProvider;
private final ArtistProvider artistProvider;
private final DbAccessProvider dbAccessProvider;
private final GenreProvider genreProvider;
private final OtherDataProvider otherDataProvider;
private final CollectionPlaylistProvider playlistProvider;
private final SongProvider songProvider;
private final SongCoordinatesProvider songCoordinatesProvider;
private final TagProvider tagProvider;
private final ModifyProvider modifyProvider;
private final LibraryImportManager libraryImportManager;
/**
* Creates a new instance of {@link AbstractCollectionModelManager}
*/
protected AbstractCollectionModelManager(DirectoryManager directoryManager) {
this.directoryManager = directoryManager;
modelSettingsManager = new ModelSettingsManager(directoryManager);
playerModelManagers = new HashMap<String, AbstractPlayerModelManager>();
importState = new ImportState();
this.dbDataPortal = createDbDataPortal();
resourceLoaderManager = new ResourceLoaderManager(dbDataPortal, directoryManager);
preloadedDataManager = new PreloadedDataManager(dbDataPortal, resourceLoaderManager, importState,
modelSettingsManager, directoryManager);
try {
preloadedDataManager.loadData();
} catch (DataUnavailableException e) {
Log.w(TAG, e);
}
songProvider = new SongProvider(dbDataPortal, preloadedDataManager);
songCoordinatesProvider = new SongCoordinatesProvider(dbDataPortal, preloadedDataManager);
tagPlaylistGenerator = new TagPlaylistGenerator(songCoordinatesProvider, songProvider);
albumProvider = new AlbumProvider(dbDataPortal, preloadedDataManager);
artistProvider = new ArtistProvider(dbDataPortal);
dbAccessProvider = new DbAccessProvider(dbDataPortal);
genreProvider = new GenreProvider(dbDataPortal);
otherDataProvider = new OtherDataProvider(dbDataPortal, preloadedDataManager);
playlistProvider = new CollectionPlaylistProvider(dbDataPortal);
tagProvider = new TagProvider(dbDataPortal, preloadedDataManager);
modifyProvider = new ModifyProvider(dbDataPortal, preloadedDataManager, directoryManager);
libraryImportManager = createLibraryImportManager();
}
/**
* Gets a {@link AbstractPlayerModelManager} with the given name
*
* @param name
* The name ({@link String}) of the returned {@link AbstractPlayerModelManager}. All characters are
* automatically converted into lower case.
* @return A {@link AbstractPlayerModelManager} with the given name
*/
public AbstractPlayerModelManager getPlayerModelManager(String name) {
AbstractPlayerModelManager result = null;
name = name.toLowerCase();
if (playerModelManagers.containsKey(name)) {
result = playerModelManagers.get(name);
} else {
result = createPlayerModelManager(name, dbDataPortal);
playerModelManagers.put(name, result);
}
return result;
}
public IDbDataPortal getDbDataPortal() {
return dbDataPortal;
}
/**
* Gets the library import manager
*/
public LibraryImportManager getLibraryImportManager() {
return libraryImportManager;
}
/**
* Returns the directory manager
*/
public DirectoryManager getDirectoryManager() {
return directoryManager;
}
/**
* Gets the {@link ResourceLoaderManager}
*/
public ResourceLoaderManager getResourceLoaderManager() {
return resourceLoaderManager;
}
/**
* Gets the {@link ModelSettingsManager}
*/
public ModelSettingsManager getModelSettingsManager() {
return modelSettingsManager;
}
/**
* Gets the tag playlist generator
*/
public TagPlaylistGenerator getTagPlaylistGenerator() {
return tagPlaylistGenerator;
}
/**
* Gets the language helper
*/
public abstract AbstractLanguageHelper getLanguageHelper();
// -----=== Provider Getter ===-----
/**
* Gets the {@link AlbumProvider}
*/
public AlbumProvider getAlbumProvider() {
return albumProvider;
}
/**
* Gets the {@link ArtistProvider}
*/
public ArtistProvider getArtistProvider() {
return artistProvider;
}
/**
* Gets the {@link DbAccessProvider}
*/
public DbAccessProvider getDbAccessProvider() {
return dbAccessProvider;
}
/**
* Gets the {@link GenreProvider}
*/
public GenreProvider getGenreProvider() {
return genreProvider;
}
/**
* Gets the {@link OtherDataProvider}
*/
public OtherDataProvider getOtherDataProvider() {
return otherDataProvider;
}
/**
* Gets the {@link CollectionPlaylistProvider}
*/
public CollectionPlaylistProvider getPlaylistProvider() {
return playlistProvider;
}
/**
* Gets the {@link SongProvider}
*/
public SongProvider getSongProvider() {
return songProvider;
}
/**
* Gets the {@link SongCoordinatesProvider}
*/
public SongCoordinatesProvider getSongCoordinatesProvider() {
return songCoordinatesProvider;
}
/**
* Gets the {@link TagProvider}
*/
public TagProvider getTagProvider() {
return tagProvider;
}
/**
* Gets the {@link ModifyProvider}
*/
public ModifyProvider getModifyProvider() {
return modifyProvider;
}
public void onTerminate() {
for (AbstractPlayerModelManager pmm : playerModelManagers.values()) {
pmm.onTerminate();
}
// Never forget to do this!
dbAccessProvider.close();
}
/**
* Creates a new data base data portal.
*/
protected abstract IDbDataPortal createDbDataPortal();
/**
* Creates a new {@link AbstractPlayerModelManager} with the given name
*
* @param name
* The name ({@link String}) of the returned {@link AbstractPlayerModelManager}
* @param dbDataPortal
* The database data portal which will be used
* @return A new created {@link AbstractPlayerModelManager} with the given name
*/
protected abstract AbstractPlayerModelManager createPlayerModelManager(String name, IDbDataPortal dbDataPortal);
/**
* Creates a new {@link LibraryImportManager}
*/
protected abstract LibraryImportManager createLibraryImportManager();
}