/*
* The GPLv3 licence :
* -----------------
* Copyright (c) 2009 Ricardo Dias
*
* This file is part of MuVis.
*
* MuVis 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
* (at your option) any later version.
*
* MuVis 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 MuVis. If not, see <http://www.gnu.org/licenses/>.
*/
package muvis;
import com.vlsolutions.swing.docking.DockingDesktop;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Properties;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.swing.JFrame;
import muvis.audio.AudioSnippetPlayerManager;
import muvis.audio.MuVisAudioPlayer;
import muvis.audio.playlist.BasePlaylist;
import muvis.audio.playlist.Playlist;
import muvis.database.MusicLibraryDatabaseManager;
import muvis.exceptions.CantSavePropertiesFileException;
import muvis.filters.TableFilterManager;
import muvis.util.Util;
import muvis.view.ViewManager;
import muvis.view.main.filters.TreemapFilterManager;
import nbtree.NBTree;
import nbtree.exceptions.NBTreeException;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.ConfigurationFactory;
/**
* This Singleton class holds the main elements of MuVis application
* List of elements:
* -AudioPlayer
* -Playlist
* -AudioSnippetPlayerManager
* -Properties Configuration file
* -Database Manager
* -Docking desktop
* -NBTreeManager
* @author Ricardo
*/
public class Environment {
//Fields necessary for the MuVisApp
private static MuVisAudioPlayer audioPlayer;
private static AudioSnippetPlayerManager snippetManager;
private static Playlist userPlaylist;
private static Properties configFile;
private static ViewManager viewManager;
private static NBTreeManager nbtreesManager;
private static MusicLibraryDatabaseManager databaseManager;
private static DockingDesktop desk;
private static TableFilterManager tableFilterManager;
private static TreemapFilterManager treemapFilterManager;
private static JFrame rootFrame;
private static Configuration configuration;
/**
* The only instance of Workspace
*/
private static Environment environment = new Environment();
/**
* @return the treemapFilterManager
*/
public TreemapFilterManager getTreemapFilterManager() {
return treemapFilterManager;
}
/**
* @param aTreemapFilterManager the treemapFilterManager to set
*/
public void setTreemapFilterManager(TreemapFilterManager aTreemapFilterManager) {
treemapFilterManager = aTreemapFilterManager;
}
/**
* @return the tableFilterManager
*/
public TableFilterManager getTableFilterManager() {
return tableFilterManager;
}
/**
* @param aTableFilterManager the tableFilterManager to set
*/
public void setTableFilterManager(TableFilterManager aTableFilterManager) {
tableFilterManager = aTableFilterManager;
}
/**
* @return the snippetManager
*/
public AudioSnippetPlayerManager getSnippetManager() {
return snippetManager;
}
/**
* @return the desk
*/
public DockingDesktop getDesk() {
return desk;
}
/**
* @param aDesk the desk to set
*/
public void setDesk(DockingDesktop aDesk) {
desk = aDesk;
}
/**
* @return the nbtreesManager
*/
public NBTreeManager getNbtreesManager() {
return nbtreesManager;
}
/**
* @return the databaseManager
*/
public synchronized MusicLibraryDatabaseManager getDatabaseManager() {
if (databaseManager == null){
databaseManager = new MusicLibraryDatabaseManager();
try {
databaseManager.connect();
databaseManager.initDatabase();
} catch (SQLException ex) {
System.out.println("Cannot init the database!" + ex.toString());
}
}
return databaseManager;
}
/**
* @return the viewManager
*/
public ViewManager getViewManager() {
return viewManager;
}
/**
* @param aViewManager the viewManager to set
*/
public void setViewManager(ViewManager aViewManager) {
viewManager = aViewManager;
}
/**
* @return the configFile
*/
public Properties getConfigFile() {
return configFile;
}
/**
* @param aConfigFile the configFile to set
*/
public void setConfigFile(Properties aConfigFile) {
configFile = aConfigFile;
}
/**
* @return the root frame of the MuVis application
*/
public JFrame getRootFrame(){
return rootFrame;
}
/**
* Must be careful with this method
* @param frame the new root Frame
*/
public void setRootFrame(JFrame frame){
rootFrame = frame;
}
private Environment() {
//Loading the main configuration
ConfigurationFactory factory = new ConfigurationFactory("config.xml");
try {
configuration = factory.getConfiguration();
} catch (ConfigurationException ex) {
System.out.println("Couldn't not load the configuration file! Possible reason: " + ex.toString());
}
initializeDataFolders();
//initialize all the elements in the workspace
audioPlayer = new MuVisAudioPlayer();
snippetManager = new AudioSnippetPlayerManager(audioPlayer);
userPlaylist = new BasePlaylist();
configFile = new Properties();
viewManager = new ViewManager();
desk = new DockingDesktop();
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new MemoryCollector(), 300, 300, TimeUnit.SECONDS);
nbtreesManager = new NBTreeManager();
try {
String dataFolder = configuration.getString("muvis.data_folder");
String nbtreeMainFolder = configuration.getString("muvis.nbtree_folder");
String nbtreeFullfolder = dataFolder + Util.getOSEscapeSequence() + nbtreeMainFolder + Util.getOSEscapeSequence();
nbtreesManager.addNBTree(Elements.TRACKS_NBTREE, new NBTree(Elements.TRACKS_NBTREE, nbtreeFullfolder));
nbtreesManager.addNBTree(Elements.ALBUMS_NBTREE, new NBTree(Elements.ALBUMS_NBTREE, nbtreeFullfolder));
nbtreesManager.addNBTree(Elements.ARTISTS_NBTREE, new NBTree(Elements.ARTISTS_NBTREE, nbtreeFullfolder));
} catch (NBTreeException ex) {
ex.printStackTrace();
System.out.println("An error occured when trying to initialize the nbtreemanager!");
}
initConfigFile();
}
//initializes the data folder, or creates it if necessary
private void initializeDataFolders() {
String dataFolder = configuration.getString("muvis.data_folder");
String nbtreeFolder = configuration.getString("muvis.nbtree_folder");
String databaseFolder = configuration.getString("muvis.database_folder");
File file = new File(dataFolder);
if (!file.isDirectory()) {
boolean success = (new File(dataFolder)).mkdir();
if (success) {
new File(dataFolder + Util.getOSEscapeSequence() + nbtreeFolder).mkdir();
new File(dataFolder + Util.getOSEscapeSequence() + databaseFolder).mkdir();
}
}
}
public void saveWorkspace() throws FileNotFoundException {
nbtreesManager.save();
}
public void loadWorkspace() throws FileNotFoundException {
//nothing to do here
}
/**
* This method returns the only instance of Workspace
* @return workspace The only instance of Workspace
*/
public static Environment getEnvironmentInstance() {
return environment;
}
/**
* This method returns the MuVisAudioPlayer instance
* @return audioPlayer the only audioplayer for this application
*/
public MuVisAudioPlayer getAudioPlayer() {
return audioPlayer;
}
/**
* Gets an element in the configuration file
* @param property
* @return
*/
public Object getProperty(String property){
return configuration.getProperty(property);
}
/**
* This method returns the playlist built by the user, so we can add tracks,
* get track being played, etc.
* @return userPlaylist The playlist built by the user
*/
public Playlist getAudioPlaylist() {
return userPlaylist;
}
public String getDataFolderPath(){
String dataFolder = configuration.getString("muvis.data_folder") + Util.getOSEscapeSequence();
return dataFolder;
}
/**
* Initializes the configuration file.
*/
public void initConfigFile() {
if (!configFileExists()) {
createConfigFile();
} else {
readConfigFile();
}
}
/**
* Checks if the configuration file exists.
* @return a boolean that indicates if the file exists
*/
public boolean configFileExists() {
String configurationFolder = configuration.getString("muvis.configuration_folder") + Util.getOSEscapeSequence();
File file = new File(configurationFolder + ".properties");
if (file.exists() && file.length() != 0) {
return true;
} else {
return false;
}
}
//reads the configuration file
public void readConfigFile() {
try {
String configurationFolder = configuration.getString("muvis.configuration_folder") + Util.getOSEscapeSequence();
getConfigFile().load(new FileInputStream(new File(configurationFolder + ".properties")));
} catch (IOException ex) {
System.out.println("Can't load the config file.");
}
}
//creates the configuration file.
public void createConfigFile() {
String configurationFolder = configuration.getString("muvis.configuration_folder") + Util.getOSEscapeSequence();
File file = new File(configurationFolder + ".properties");
try {
if (file.createNewFile()) {
getConfigFile().load(new FileInputStream(file));
System.out.println("Properties file was succeful created!");
}
} catch (IOException ex1) {
System.out.println("Cannot create .properties file!");
}
}
//saves the config file under workspace control
public void saveConfigFile() throws CantSavePropertiesFileException{
try {
String configurationFolder = configuration.getString("muvis.configuration_folder") + Util.getOSEscapeSequence();
FileOutputStream stream = new FileOutputStream(new File(configurationFolder + ".properties"));
configFile.store(stream, "");
} catch (FileNotFoundException ex) {
throw new CantSavePropertiesFileException("Can't save the configuration file!");
} catch (IOException ex) {
throw new CantSavePropertiesFileException("Can't save the configuration file!");
}
}
class MemoryCollector implements Runnable{
@Override
public void run() {
System.out.println("GC at Environment running!");
System.gc();
}
}
}