| 46 |
|
|
| 47 |
|
void XmlPatch::insertNodesOperation(const QString &xmlString, XmlFilter &filters, const QString &xPathExpression, const QString &filesWildcard){ |
| 48 |
|
|
| 49 |
< |
QStringList filesToProcess; |
| 49 |
> |
QVector<QString> filesToProcess; |
| 50 |
|
QList<pugi::xml_node> nodesToInsertion; |
| 51 |
|
pugi::xml_document newNode; |
| 52 |
|
pugi::xml_parse_result result; |
| 114 |
|
|
| 115 |
|
void XmlPatch::removeNodesOperation(XmlFilter &filters, const QString &xPathExpression, const QString &filesWildcard){ |
| 116 |
|
|
| 117 |
< |
QStringList filesToProcess; |
| 117 |
> |
QVector<QString> filesToProcess; |
| 118 |
|
|
| 119 |
|
QList<pugi::xml_node> nodesToDeletion; |
| 120 |
|
|
| 211 |
|
UtilXmlTools::displaySuccessMessage(1,"@COMMAND"); |
| 212 |
|
} |
| 213 |
|
|
| 214 |
– |
QScriptValue echo(QScriptContext *context, QScriptEngine *engine) |
| 215 |
– |
{ |
| 216 |
– |
std::cout << context->argument(0).toString().toUtf8().constData() << std::endl; |
| 217 |
– |
|
| 218 |
– |
return ""; |
| 219 |
– |
} |
| 220 |
– |
|
| 214 |
|
void XmlPatch::executeCustomCommandOperation(const QString &jsString, const QString &filesWildcard){ |
| 215 |
|
|
| 216 |
< |
QString rexmlString, jsxmlString; |
| 224 |
< |
QStringList filesToProcess=UtilXmlTools::getAllXmlFilesByWildcard(filesWildcard); |
| 216 |
> |
QVector<QString> filesToProcess=UtilXmlTools::getAllXmlFilesByWildcard(filesWildcard); |
| 217 |
|
|
| 218 |
|
if(filesToProcess.isEmpty()){ |
| 219 |
|
UtilXmlTools::displayErrorMessage("@CUSTOM_CODE","No XML files were found for the wildcard: "+filesWildcard); |
| 220 |
|
} |
| 221 |
|
|
| 222 |
< |
QFile rexmlfile(":/resources/libs/rexml.js"); |
| 231 |
< |
QFile jsxmlfile(":/resources/libs/jsxml.js"); |
| 232 |
< |
|
| 233 |
< |
rexmlfile.open(QFile::ReadOnly | QFile::Text); |
| 234 |
< |
jsxmlfile.open(QFile::ReadOnly | QFile::Text); |
| 235 |
< |
|
| 236 |
< |
rexmlString=QTextStream(&rexmlfile).readAll(); |
| 237 |
< |
jsxmlString=QTextStream(&jsxmlfile).readAll(); |
| 238 |
< |
|
| 239 |
< |
// Process all XmlFiles |
| 240 |
< |
#pragma omp parallel for |
| 241 |
< |
for(int i=0; i<filesToProcess.size(); i++){ |
| 242 |
< |
|
| 243 |
< |
QString currXmlFileString; |
| 244 |
< |
|
| 245 |
< |
QScriptEngine engine; |
| 246 |
< |
QScriptValue engineResult; // variable to check for js_errors |
| 247 |
< |
double elapsed_secs; // elapsed seconds that a user script took |
| 248 |
< |
clock_t begin; // seconds that a script started |
| 249 |
< |
|
| 250 |
< |
// Add echo function so user can debug the code |
| 251 |
< |
QScriptValue echoFunction = engine.newFunction(echo); |
| 252 |
< |
engine.globalObject().setProperty("echo", echoFunction); |
| 253 |
< |
|
| 254 |
< |
engine.evaluate(rexmlString); // load js libraries |
| 255 |
< |
engine.evaluate(jsxmlString); |
| 256 |
< |
|
| 257 |
< |
if(this->backupsEnabled){ |
| 258 |
< |
UtilXmlTools::backupFile(filesToProcess[i], this->verboseEnabled); |
| 259 |
< |
} |
| 260 |
< |
|
| 261 |
< |
QFile currXmlFile(filesToProcess[i]); |
| 262 |
< |
|
| 263 |
< |
if(!currXmlFile.open(QFile::ReadOnly | QFile::Text)){ |
| 264 |
< |
UtilXmlTools::displayErrorMessage("@CUSTOM_CODE","Error loading '" + filesToProcess[i] + "' file for read operation."); |
| 265 |
< |
} |
| 266 |
< |
|
| 267 |
< |
currXmlFileString=QTextStream(&currXmlFile).readAll(); |
| 268 |
< |
|
| 269 |
< |
currXmlFile.close(); // close reading |
| 222 |
> |
this->customCodeOperation.executeCustomCode(jsString,filesToProcess,this->backupsEnabled,this->verboseEnabled); |
| 223 |
|
|
| 271 |
– |
engine.globalObject().setProperty("$xmlData",currXmlFileString); |
| 272 |
– |
|
| 273 |
– |
begin = clock(); |
| 274 |
– |
|
| 275 |
– |
// main needs to be called so the user code is evaluated |
| 276 |
– |
// alternatively you can do: myFunc=engine.evaluate('(function main(){})'); myFunc.call(); |
| 277 |
– |
// Note the () around the function |
| 278 |
– |
engineResult=engine.evaluate("main(); function main() {"+jsString+"}"); // main funtion allows to use return to exit prematurely from user code |
| 279 |
– |
|
| 280 |
– |
if(this->verboseEnabled){ |
| 281 |
– |
elapsed_secs = double(clock() - begin) / CLOCKS_PER_SEC; |
| 282 |
– |
|
| 283 |
– |
// Warn the user if the script took much time |
| 284 |
– |
if(elapsed_secs>SLOW_SCRIPT_TIME){ |
| 285 |
– |
std::cout << "Warning: Slow javascript code detected.\n" << |
| 286 |
– |
"Warning: Script execution seconds: " << elapsed_secs |
| 287 |
– |
<< std::endl; |
| 288 |
– |
} |
| 289 |
– |
} |
| 290 |
– |
|
| 291 |
– |
if (engine.hasUncaughtException()) { |
| 292 |
– |
displayJsException(engine,engineResult); |
| 293 |
– |
} |
| 294 |
– |
|
| 295 |
– |
if(!currXmlFile.open(QFile::WriteOnly | QFile::Text | QIODevice::Truncate)){ |
| 296 |
– |
UtilXmlTools::displayErrorMessage("@CUSTOM_CODE","Error loading '" + filesToProcess[i] + "' file for @CUSTOM_CODE write operation."); |
| 297 |
– |
} |
| 298 |
– |
|
| 299 |
– |
engineResult=engine.globalObject().property("$xmlData"); |
| 300 |
– |
|
| 301 |
– |
if (engine.hasUncaughtException()) { |
| 302 |
– |
displayJsException(engine,engineResult); |
| 303 |
– |
} |
| 304 |
– |
|
| 305 |
– |
QTextStream(&currXmlFile) << engineResult.toString(); // retreive the modified xml by javascript and save it to the file |
| 306 |
– |
} |
| 224 |
|
|
| 225 |
|
UtilXmlTools::displaySuccessMessage(filesToProcess.size(), "@CUSTOM_CODE"); |
| 226 |
|
} |
| 431 |
|
|
| 432 |
|
return line.mid(startValueIdx,endValueIdx-startValueIdx); // return the value of the parameter (is in the middle of the mandatory quotes) |
| 433 |
|
} |
| 517 |
– |
|
| 518 |
– |
void XmlPatch::displayJsException(QScriptEngine &engine, QScriptValue &engineResult){ |
| 519 |
– |
if (engine.hasUncaughtException()) { |
| 520 |
– |
UtilXmlTools::displayErrorMessage("@CUSTOM_CODE","Uncaught js exception (user code) at line " +QString::number(engine.uncaughtExceptionLineNumber()) + ":\n" + engineResult.toString()); |
| 521 |
– |
} |
| 522 |
– |
} |