/*******************************************************************************
* Copyright (c) MOBAC developers
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package mobac.program;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Locale;
import javax.swing.JOptionPane;
import mobac.mapsources.MapSourcesManager;
import mobac.program.interfaces.MapSource;
import mobac.program.model.Atlas;
import mobac.program.model.EastNorthCoordinate;
import mobac.program.model.Layer;
import mobac.program.model.Profile;
import mobac.program.model.Settings;
import mobac.utilities.GUIExceptionHandler;
import mobac.utilities.I18nUtils;
import mobac.utilities.Utilities;
import mobac.utilities.file.FileExtFilter;
import mobac.utilities.file.NamePatternFileFilter;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
/**
* Creates the necessary files on first time Mobile Atlas Creator is started or tries to update the environment if the
* version has changed.
*/
public class EnvironmentSetup {
private static boolean FIRST_START = false;
public static Logger log = Logger.getLogger(EnvironmentSetup.class);
public static void checkMemory() {
Runtime r = Runtime.getRuntime();
long maxHeap = r.maxMemory();
String heapMBFormatted = String.format(Locale.ENGLISH, "%3.2f MiB", maxHeap / 1048576d);
log.info("Total available memory to MOBAC: " + heapMBFormatted);
if (maxHeap < 200000000) {
String msg = String.format(I18nUtils.localizedStringForKey("msg_environment_lack_memory"), heapMBFormatted);
JOptionPane.showMessageDialog(null, msg,
I18nUtils.localizedStringForKey("msg_environment_lack_memory_title"), JOptionPane.WARNING_MESSAGE);
}
}
public static void upgrade() {
FileFilter ff = new NamePatternFileFilter("tac-profile-.*.xml");
File profilesDir = DirectoryManager.currentDir;
File[] files = profilesDir.listFiles(ff);
for (File f : files) {
File dest = new File(profilesDir, f.getName().replaceFirst("tac-", "mobac-"));
f.renameTo(dest);
}
}
/**
* In case the <tt>mapsources</tt> directory has been moved by configuration (directories.ini or settings.xml) we
* need to copy the existing map packs into the configured directory
*/
public static void copyMapPacks() {
File userMapSourcesDir = Settings.getInstance().getMapSourcesDirectory();
File progMapSourcesDir = new File(DirectoryManager.programDir, "mapsources");
if (userMapSourcesDir.equals(progMapSourcesDir))
return; // no user specific directory configured
if (userMapSourcesDir.isDirectory())
return; // directory already exists - map packs should have been already copied
try {
Utilities.mkDirs(userMapSourcesDir);
FileUtils.copyDirectory(progMapSourcesDir, userMapSourcesDir, new FileExtFilter(".jar"));
} catch (IOException e) {
log.error(e);
JOptionPane.showMessageDialog(null,
I18nUtils.localizedStringForKey("msg_environment_error_init_mapsrc_dir") + e.getMessage(),
I18nUtils.localizedStringForKey("Error"), JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
}
/**
* Note: This method has be be called before {@link Settings#loadOrQuit()}. Therefore no localization is available at
* this point.
*/
public static void checkFileSetup() {
checkDirectory(DirectoryManager.userSettingsDir, "user settings", true);
checkDirectory(DirectoryManager.atlasProfilesDir, "atlas profile", true);
checkDirectory(DirectoryManager.tileStoreDir, "tile store", true);
checkDirectory(DirectoryManager.tempDir, "temporary atlas download", true);
if (!Settings.FILE.exists()) {
try {
FIRST_START = true;
Settings.save();
} catch (Exception e) {
log.error("Error while creating settings.xml: " + e.getMessage(), e);
String[] options = { "Exit", "Show error report" };
int a = JOptionPane.showOptionDialog(null, "Could not create file settings.xml - program will exit.",
"Error", 0, JOptionPane.ERROR_MESSAGE, null, options, options[0]);
if (a == 1)
GUIExceptionHandler.showExceptionDialog(e);
System.exit(1);
}
}
}
protected static void checkDirectory(File dir, String dirName, boolean checkIsWriteable) {
try {
Utilities.mkDirs(dir);
} catch (IOException e) {
GUIExceptionHandler.processFatalExceptionSimpleDialog(
String.format(I18nUtils.localizedStringForKey("msg_environment_error_create_dir"), dirName,
dir.getAbsolutePath()), e);
}
if (!checkIsWriteable)
return;
try {
// test if we can write into that directory
File testFile = File.createTempFile("MOBAC", "", dir);
testFile.createNewFile();
testFile.deleteOnExit();
testFile.delete();
} catch (IOException e) {
GUIExceptionHandler.processFatalExceptionSimpleDialog(
String.format(I18nUtils.localizedStringForKey("msg_environment_error_write_file"), dirName,
dir.getAbsolutePath()), e);
}
}
public static void createDefaultAtlases() {
if (!FIRST_START)
return;
// TODO:MP change sample to Chinese
Profile p = new Profile("Google Maps New York");
Atlas atlas = Atlas.newInstance();
try {
EastNorthCoordinate max = new EastNorthCoordinate(40.97264, -74.142609);
EastNorthCoordinate min = new EastNorthCoordinate(40.541982, -73.699036);
Layer layer = new Layer(atlas, "GM New York");
MapSource ms = MapSourcesManager.getInstance().getSourceByName("Mapnik");
if (ms == null)
return;
layer.addMapsAutocut("GM New York 16", ms, max, min, 16, null, 32000);
layer.addMapsAutocut("GM New York 14", ms, max, min, 14, null, 32000);
atlas.addLayer(layer);
p.save(atlas);
} catch (Exception e) {
log.error("Creation for example profiles failed", e);
GUIExceptionHandler.showExceptionDialog(e);
}
}
}