+ support for config file relative paths when saving simulations
+ support for quickstarting from simulation config
This commit is contained in:
parent
7099572282
commit
67407d6f36
|
@ -24,7 +24,7 @@
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: GUI.java,v 1.115 2009/03/12 13:04:10 fros4943 Exp $
|
* $Id: GUI.java,v 1.116 2009/03/12 15:10:00 fros4943 Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.sics.cooja;
|
package se.sics.cooja;
|
||||||
|
@ -1028,6 +1028,18 @@ public class GUI extends Observable {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean quickStartSimulationConfig(String source) {
|
||||||
|
logger.info("> Starting COOJA");
|
||||||
|
JDesktopPane desktop = new JDesktopPane();
|
||||||
|
desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
|
||||||
|
frame = new JFrame("COOJA Simulator");
|
||||||
|
GUI gui = new GUI(desktop);
|
||||||
|
configureFrame(gui, false);
|
||||||
|
|
||||||
|
gui.doLoadConfig(false, true, new File(source));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows user to create a simulation with a single mote type.
|
* Allows user to create a simulation with a single mote type.
|
||||||
*
|
*
|
||||||
|
@ -2877,6 +2889,18 @@ public class GUI extends Observable {
|
||||||
if (args.length > 0 && args[0].startsWith("-quickstart=")) {
|
if (args.length > 0 && args[0].startsWith("-quickstart=")) {
|
||||||
String contikiApp = args[0].substring("-quickstart=".length());
|
String contikiApp = args[0].substring("-quickstart=".length());
|
||||||
|
|
||||||
|
/* Cygwin fix */
|
||||||
|
if (contikiApp.startsWith("/cygdrive/")) {
|
||||||
|
char driveCharacter = contikiApp.charAt("/cygdrive/".length());
|
||||||
|
contikiApp = contikiApp.replace("/cygdrive/" + driveCharacter + "/", driveCharacter + ":/");
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean ok = false;
|
||||||
|
if (contikiApp.endsWith(".csc")) {
|
||||||
|
|
||||||
|
ok = quickStartSimulationConfig(contikiApp);
|
||||||
|
|
||||||
|
} else {
|
||||||
if (contikiApp.endsWith(".cooja")) {
|
if (contikiApp.endsWith(".cooja")) {
|
||||||
contikiApp = contikiApp.substring(0, contikiApp.length() - ".cooja".length());
|
contikiApp = contikiApp.substring(0, contikiApp.length() - ".cooja".length());
|
||||||
}
|
}
|
||||||
|
@ -2884,13 +2908,9 @@ public class GUI extends Observable {
|
||||||
contikiApp += ".c";
|
contikiApp += ".c";
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cygwin fix */
|
ok = quickStartSimulation(contikiApp);
|
||||||
if (contikiApp.startsWith("/cygdrive/")) {
|
|
||||||
char driveCharacter = contikiApp.charAt("/cygdrive/".length());
|
|
||||||
contikiApp = contikiApp.replace("/cygdrive/" + driveCharacter + "/", driveCharacter + ":/");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean ok = quickStartSimulation(contikiApp);
|
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
|
@ -3022,6 +3042,8 @@ public class GUI extends Observable {
|
||||||
*/
|
*/
|
||||||
public Simulation loadSimulationConfig(File file, boolean quick)
|
public Simulation loadSimulationConfig(File file, boolean quick)
|
||||||
throws UnsatisfiedLinkError, SimulationCreationException {
|
throws UnsatisfiedLinkError, SimulationCreationException {
|
||||||
|
this.currentConfigFile = file; /* Used to generate config relative paths */
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SAXBuilder builder = new SAXBuilder();
|
SAXBuilder builder = new SAXBuilder();
|
||||||
Document doc = builder.build(file);
|
Document doc = builder.build(file);
|
||||||
|
@ -3153,6 +3175,7 @@ public class GUI extends Observable {
|
||||||
* File to write
|
* File to write
|
||||||
*/
|
*/
|
||||||
public void saveSimulationConfig(File file) {
|
public void saveSimulationConfig(File file) {
|
||||||
|
this.currentConfigFile = file; /* Used to generate config relative paths */
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Create simulation config
|
// Create simulation config
|
||||||
|
@ -3745,41 +3768,16 @@ public class GUI extends Observable {
|
||||||
moteRelationObservable.deleteObserver(observer);
|
moteRelationObservable.deleteObserver(observer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static File stripTrailingUpDirs(File file) {
|
public File createPortablePath(File file) {
|
||||||
file = file.getAbsoluteFile();
|
|
||||||
|
|
||||||
/* Strip trailing "..":s */
|
|
||||||
boolean deletedDirs = false;
|
|
||||||
do {
|
|
||||||
int nrDirs = 0;
|
|
||||||
deletedDirs = false;
|
|
||||||
|
|
||||||
while (file.getName().equals("..")) {
|
|
||||||
nrDirs++;
|
|
||||||
file = file.getParentFile();
|
|
||||||
deletedDirs = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (nrDirs > 0 && !file.getName().equals("..")) {
|
|
||||||
nrDirs--;
|
|
||||||
file = file.getParentFile();
|
|
||||||
}
|
|
||||||
} while (deletedDirs);
|
|
||||||
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static File stripAbsoluteContikiPath(File file) {
|
|
||||||
try {
|
try {
|
||||||
File contikiPath = new File(GUI.getExternalToolsSetting("PATH_CONTIKI", null));
|
File contikiPath = new File(GUI.getExternalToolsSetting("PATH_CONTIKI", null));
|
||||||
String contikiRelative = contikiPath.getPath();
|
String contikiRelative = contikiPath.getPath();
|
||||||
String contikiCanonical = contikiPath.getCanonicalPath();
|
String contikiCanonical = contikiPath.getCanonicalPath();
|
||||||
|
|
||||||
/* Replace absolute path with relative path */
|
|
||||||
String fileCanonical = file.getCanonicalPath();
|
String fileCanonical = file.getCanonicalPath();
|
||||||
if (!fileCanonical.startsWith(contikiCanonical)) {
|
if (!fileCanonical.startsWith(contikiCanonical)) {
|
||||||
logger.warn("Error when converting to Contiki relative paths: file is not in Contiki: " + file.getAbsolutePath());
|
/*logger.warn("Error when converting to Contiki relative path: file is not in Contiki: " + file.getAbsolutePath());*/
|
||||||
return file;
|
return createConfigPath(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Replace Contiki's canonical path with Contiki's relative path */
|
/* Replace Contiki's canonical path with Contiki's relative path */
|
||||||
|
@ -3787,20 +3785,73 @@ public class GUI extends Observable {
|
||||||
|
|
||||||
File newFile = new File(newFilePath);
|
File newFile = new File(newFilePath);
|
||||||
if (!newFile.exists()) {
|
if (!newFile.exists()) {
|
||||||
logger.warn("Error when converting to Contiki relative paths: new file does not exist: " + newFile.getAbsolutePath());
|
/*logger.warn("Error when converting to Contiki relative path: new file does not exist: " + newFile.getAbsolutePath());*/
|
||||||
return file;
|
return createConfigPath(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*logger.info("Converted Contiki relative path '" + file.getPath() + "' to '" + newFile.getPath() + "'");*/
|
logger.info("Generated Contiki relative path '" + file.getPath() + "' to '" + newFile.getPath() + "'");
|
||||||
return newFile;
|
return newFile;
|
||||||
|
|
||||||
} catch (IOException e1) {
|
} catch (IOException e1) {
|
||||||
logger.warn("Error when converting to Contiki relative paths: " + e1.getMessage());
|
/*logger.warn("Error when converting to Contiki relative path: " + e1.getMessage());*/
|
||||||
|
}
|
||||||
|
|
||||||
|
return createConfigPath(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
public File restorePortablePath(File file) {
|
||||||
|
return restoreConfigPath(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
private File currentConfigFile = null; /* Used to generate config relative paths */
|
||||||
|
public File createConfigPath(File file) {
|
||||||
|
if (currentConfigFile == null) {
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
File configPath = currentConfigFile.getParentFile();
|
||||||
|
String configIdentifier = "[CONFIG_DIR]";
|
||||||
|
String configCanonical = configPath.getCanonicalPath();
|
||||||
|
|
||||||
|
String fileCanonical = file.getCanonicalPath();
|
||||||
|
if (!fileCanonical.startsWith(configCanonical)) {
|
||||||
|
/*logger.warn("Error when converting to config relative path: file not in config directory: " + file.getAbsolutePath());*/
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Replace config's canonical path with config identifier */
|
||||||
|
String newFilePath = fileCanonical.replace(configCanonical, configIdentifier);
|
||||||
|
|
||||||
|
File newFile = new File(newFilePath);
|
||||||
|
logger.info("Generated config relative path: '" + file.getPath() + "' to '" + newFile.getPath() + "'");
|
||||||
|
return newFile;
|
||||||
|
|
||||||
|
} catch (IOException e1) {
|
||||||
|
/*logger.warn("Error when converting to config relative path: " + e1.getMessage());*/
|
||||||
}
|
}
|
||||||
|
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public File restoreConfigPath(File file) {
|
||||||
|
if (currentConfigFile == null) {
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
File configPath = currentConfigFile.getParentFile();
|
||||||
|
|
||||||
|
String path = file.getPath();
|
||||||
|
if (!path.startsWith("[CONFIG_DIR]")) {
|
||||||
|
/*logger.info("Not config relative path: " + file.getAbsolutePath());*/
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
File newFile = new File(path.replace("[CONFIG_DIR]", configPath.getAbsolutePath()));
|
||||||
|
logger.info("Reverted config relative path: '" + path + "' to '" + newFile.getPath() + "'");
|
||||||
|
return newFile;
|
||||||
|
}
|
||||||
|
|
||||||
private static JProgressBar PROGRESS_BAR = null;
|
private static JProgressBar PROGRESS_BAR = null;
|
||||||
public static void setProgressMessage(String msg) {
|
public static void setProgressMessage(String msg) {
|
||||||
if (PROGRESS_BAR != null && PROGRESS_BAR.isShowing()) {
|
if (PROGRESS_BAR != null && PROGRESS_BAR.isShowing()) {
|
||||||
|
|
Loading…
Reference in a new issue