added simconfig attribute EXPORT that determines how files should be handled when a simulation is exported as an executable JAR
This commit is contained in:
parent
e99c906caf
commit
e83635832a
1 changed files with 82 additions and 74 deletions
|
@ -24,26 +24,28 @@
|
||||||
* (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: ExecuteJAR.java,v 1.9 2010/03/19 12:34:37 fros4943 Exp $
|
* $Id: ExecuteJAR.java,v 1.10 2010/03/19 15:02:26 fros4943 Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.sics.cooja.util;
|
package se.sics.cooja.util;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.security.AccessControlException;
|
import java.security.AccessControlException;
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.apache.log4j.BasicConfigurator;
|
import org.apache.log4j.BasicConfigurator;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.apache.log4j.xml.DOMConfigurator;
|
import org.apache.log4j.xml.DOMConfigurator;
|
||||||
|
import org.jdom.Attribute;
|
||||||
import org.jdom.Document;
|
import org.jdom.Document;
|
||||||
import org.jdom.Element;
|
import org.jdom.Element;
|
||||||
|
import org.jdom.input.SAXBuilder;
|
||||||
import org.jdom.output.Format;
|
import org.jdom.output.Format;
|
||||||
import org.jdom.output.XMLOutputter;
|
import org.jdom.output.XMLOutputter;
|
||||||
|
|
||||||
|
@ -63,7 +65,6 @@ public class ExecuteJAR {
|
||||||
public final static String SIMCONFIG_FILENAME = "simulation.csc";
|
public final static String SIMCONFIG_FILENAME = "simulation.csc";
|
||||||
public final static String EXTERNALTOOLS_FILENAME = "exttools.config";
|
public final static String EXTERNALTOOLS_FILENAME = "exttools.config";
|
||||||
public final static String PROJECT_DEFAULT_CONFIG_FILENAME = "cooja_default.config";
|
public final static String PROJECT_DEFAULT_CONFIG_FILENAME = "cooja_default.config";
|
||||||
public final static String FIRMWARE_SUFFIX = ".sky";
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
try {
|
try {
|
||||||
|
@ -113,7 +114,7 @@ public class ExecuteJAR {
|
||||||
try {
|
try {
|
||||||
buildExecutableJAR(s.getGUI(), jar);
|
buildExecutableJAR(s.getGUI(), jar);
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
logger.fatal(e.getMessage());
|
logger.fatal(e.getMessage(), e);
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
System.exit(0);
|
System.exit(0);
|
||||||
|
@ -176,33 +177,10 @@ public class ExecuteJAR {
|
||||||
}
|
}
|
||||||
GUI.externalToolsUserSettingsFile = diskFile;
|
GUI.externalToolsUserSettingsFile = diskFile;
|
||||||
|
|
||||||
int firmwareCounter = 0;
|
/* Unpack files from JAR (with attribute EXPORT=copy) */
|
||||||
while (true) {
|
SAXBuilder builder = new SAXBuilder();
|
||||||
File firmwareFile = new File(firmwareCounter + FIRMWARE_SUFFIX);
|
Document doc = builder.build(new File(executeDir, SIMCONFIG_FILENAME));
|
||||||
diskFile = new File(executeDir, firmwareCounter + FIRMWARE_SUFFIX);
|
handleExportAttributesFromJAR(doc.getRootElement(), new File(executeDir, SIMCONFIG_FILENAME), new File(executeDir));
|
||||||
firmwareCounter++;
|
|
||||||
if (OVERWRITE || !diskFile.exists()) {
|
|
||||||
logger.info("Unpacking firmware file: " + firmwareFile.getName() + " -> " + diskFile.getName());
|
|
||||||
inputStream = GUI.class.getResourceAsStream("/" + firmwareFile.getName());
|
|
||||||
if (inputStream == null) {
|
|
||||||
/* Not available in simulation */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
byte[] fileData = ArrayUtils.readFromStream(inputStream);
|
|
||||||
if (fileData == null) {
|
|
||||||
logger.info("Failed extracting file (read fail)");
|
|
||||||
System.exit(1);
|
|
||||||
}
|
|
||||||
boolean ok = ArrayUtils.writeToFile(diskFile, fileData);
|
|
||||||
if (!ok) {
|
|
||||||
logger.info("Failed extracting file (write fail)");
|
|
||||||
System.exit(1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logger.info("Skip: firmware files already exist: " + diskFile);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.fatal("Error when unpacking executable JAR: " + e.getMessage());
|
logger.fatal("Error when unpacking executable JAR: " + e.getMessage());
|
||||||
return;
|
return;
|
||||||
|
@ -334,49 +312,7 @@ public class ExecuteJAR {
|
||||||
/* Prepare simulation config */
|
/* Prepare simulation config */
|
||||||
Element rootElement = gui.extractSimulationConfig();
|
Element rootElement = gui.extractSimulationConfig();
|
||||||
logger.info("Extracting simulation configuration");
|
logger.info("Extracting simulation configuration");
|
||||||
logger.info("Simconfig: Stripping project references");
|
handleExportAttributesToJAR(rootElement, gui, workingDir);
|
||||||
rootElement.removeChildren("project"); /* Remove project references */
|
|
||||||
for (Object simElement : rootElement.getChildren()) {
|
|
||||||
if (((Element) simElement).getName().equals("simulation")) {
|
|
||||||
int firmwareCounter = 0;
|
|
||||||
for (Object moteTypeElement : ((Element)simElement).getChildren()) {
|
|
||||||
if (((Element) moteTypeElement).getName().equals("motetype")) {
|
|
||||||
logger.info("Simconfig: Stripping source references");
|
|
||||||
logger.info("Simconfig: Stripping build commands");
|
|
||||||
((Element)moteTypeElement).removeChildren("source"); /* Remove source references */
|
|
||||||
((Element)moteTypeElement).removeChildren("commands"); /* Remove build commands */
|
|
||||||
for (Object pathElement : ((Element)moteTypeElement).getChildren()) {
|
|
||||||
if (((Element) pathElement).getName().equals("firmware")) {
|
|
||||||
String newName = (firmwareCounter++) + FIRMWARE_SUFFIX;
|
|
||||||
/* Copy firmwares, and update firmware references */
|
|
||||||
String firmwarePath = ((Element)pathElement).getText();
|
|
||||||
File firmwareFile = gui.restorePortablePath(new File(firmwarePath));
|
|
||||||
if (!firmwareFile.exists()) {
|
|
||||||
throw new RuntimeException(
|
|
||||||
"Firmware file does not exist: " + firmwareFile
|
|
||||||
);
|
|
||||||
}
|
|
||||||
logger.info("Simconfig: Copying firmware file: " + firmwareFile.getAbsolutePath());
|
|
||||||
byte[] data = ArrayUtils.readFromFile(firmwareFile);
|
|
||||||
if (data == null) {
|
|
||||||
throw new RuntimeException(
|
|
||||||
"Error when reading firmware file: " + firmwareFile
|
|
||||||
);
|
|
||||||
}
|
|
||||||
boolean ok = ArrayUtils.writeToFile(new File(workingDir, newName), data);
|
|
||||||
if (!ok) {
|
|
||||||
throw new RuntimeException(
|
|
||||||
"Error when writing firmware file: " + firmwareFile
|
|
||||||
);
|
|
||||||
}
|
|
||||||
logger.info("Simconfig: Update firmware path reference: " + firmwareFile.getAbsolutePath() + " -> " + ("[CONFIG_DIR]/" + newName));
|
|
||||||
((Element)pathElement).setText("[CONFIG_DIR]/" + newName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Save simulation config */
|
/* Save simulation config */
|
||||||
File configFile = new File(workingDir, SIMCONFIG_FILENAME);
|
File configFile = new File(workingDir, SIMCONFIG_FILENAME);
|
||||||
|
@ -506,7 +442,79 @@ public class ExecuteJAR {
|
||||||
logger.info("Done! To run simulation: > java -jar " + outputFile.getName());
|
logger.info("Done! To run simulation: > java -jar " + outputFile.getName());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void handleExportAttributesToJAR(Element e, GUI gui, File toDir) {
|
||||||
|
/* Checks configuration for EXPORT attributes:
|
||||||
|
* copy: file copy file to exported JAR, update file path.
|
||||||
|
* discard: remove config element */
|
||||||
|
|
||||||
|
for (Element c : ((List<Element>) e.getChildren()).toArray(new Element[0])) {
|
||||||
|
Attribute a = c.getAttribute("EXPORT");
|
||||||
|
if (a != null && a.getValue().equals("copy")) {
|
||||||
|
/* Copy file to JAR */
|
||||||
|
File file = gui.restorePortablePath(new File(c.getText()));
|
||||||
|
if (!file.exists()) {
|
||||||
|
throw new RuntimeException("File not found: " + file);
|
||||||
|
}
|
||||||
|
byte[] data = ArrayUtils.readFromFile(file);
|
||||||
|
if (data == null) {
|
||||||
|
throw new RuntimeException("Could not copy file: " + file);
|
||||||
|
}
|
||||||
|
|
||||||
|
String newFilename = file.getName();
|
||||||
|
while (new File(toDir, newFilename).exists()) {
|
||||||
|
newFilename += "-1";
|
||||||
|
}
|
||||||
|
boolean ok = ArrayUtils.writeToFile(new File(toDir, newFilename), data);
|
||||||
|
if (!ok) {
|
||||||
|
throw new RuntimeException("Error when copying file: " + file);
|
||||||
|
}
|
||||||
|
logger.info("Simconfig: Copied file: " + file.getAbsolutePath() + " -> " + ("[CONFIG_DIR]/" + newFilename));
|
||||||
|
((Element)c).setText("[CONFIG_DIR]/" + newFilename);
|
||||||
|
} else if (a != null && a.getValue().equals("discard")) {
|
||||||
|
/* Remove config element */
|
||||||
|
e.removeChild(c.getName());
|
||||||
|
logger.info("Simconfig: Discarded element '" + c.getName() + "': " + c.getText());
|
||||||
|
continue;
|
||||||
|
} else if (a != null) {
|
||||||
|
throw new RuntimeException("Unknown EXPORT attribute value: " + a.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Recursive search */
|
||||||
|
handleExportAttributesToJAR(c, gui, toDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void handleExportAttributesFromJAR(Element e, File config, File toDir) {
|
||||||
|
for (Element c : ((List<Element>) e.getChildren()).toArray(new Element[0])) {
|
||||||
|
Attribute a = c.getAttribute("EXPORT");
|
||||||
|
if (a != null && a.getValue().equals("copy")) {
|
||||||
|
/* Copy file from JAR */
|
||||||
|
File file = GUI.restoreConfigRelativePath(config, new File(c.getText()));
|
||||||
|
InputStream inputStream = GUI.class.getResourceAsStream("/" + file.getName());
|
||||||
|
if (inputStream == null) {
|
||||||
|
throw new RuntimeException("Could not unpack file: " + file);
|
||||||
|
}
|
||||||
|
byte[] fileData = ArrayUtils.readFromStream(inputStream);
|
||||||
|
if (fileData == null) {
|
||||||
|
logger.info("Failed unpacking file");
|
||||||
|
throw new RuntimeException("Could not unpack file: " + file);
|
||||||
|
}
|
||||||
|
if (OVERWRITE || !file.exists()) {
|
||||||
|
boolean ok = ArrayUtils.writeToFile(file, fileData);
|
||||||
|
if (!ok) {
|
||||||
|
throw new RuntimeException("Failed unpacking file: " + file);
|
||||||
|
}
|
||||||
|
logger.info("Unpacked file from JAR: " + file.getName());
|
||||||
|
} else if (OVERWRITE) {
|
||||||
|
logger.info("Skip: unpack file from JAR: " + file.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Recursive search */
|
||||||
|
handleExportAttributesFromJAR(c, config, toDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
private static boolean deleteDirectory(File path) {
|
private static boolean deleteDirectory(File path) {
|
||||||
if(path.exists()) {
|
if(path.exists()) {
|
||||||
File[] files = path.listFiles();
|
File[] files = path.listFiles();
|
||||||
|
|
Loading…
Add table
Reference in a new issue