double Feature::eval( NumericExpression& expr, FilterContext const* context ) const { const NumericExpression::Variables& vars = expr.variables(); for( NumericExpression::Variables::const_iterator i = vars.begin(); i != vars.end(); ++i ) { double val = 0.0; AttributeTable::const_iterator ai = _attrs.find(toLower(i->first)); if (ai != _attrs.end()) { val = ai->second.getDouble(0.0); } else if (context) { //No attr found, look for script ScriptEngine* engine = context->getSession()->getScriptEngine(); if (engine) { ScriptResult result = engine->run(i->first, this, context); if (result.success()) val = result.asDouble(); else OE_WARN << LC << "Script error:" << result.message() << std::endl; } } expr.set( *i, val); //osgEarth::as<double>(getAttr(i->first),0.0) ); } return expr.eval(); }
const std::string& Feature::eval( StringExpression& expr, FilterContext const* context ) const { const StringExpression::Variables& vars = expr.variables(); for( StringExpression::Variables::const_iterator i = vars.begin(); i != vars.end(); ++i ) { std::string val = ""; AttributeTable::const_iterator ai = _attrs.find(toLower(i->first)); if (ai != _attrs.end()) { val = ai->second.getString(); } else if (context) { //No attr found, look for script ScriptEngine* engine = context->getSession()->getScriptEngine(); if (engine) { ScriptResult result = engine->run(i->first, this, context); if (result.success()) val = result.asString(); else OE_WARN << LC << "Feature Script error on '" << expr.expr() << "': " << result.message() << std::endl; } } expr.set( *i, val ); } return expr.eval(); }
JavascriptEngineV8::JavascriptEngineV8(const ScriptEngineOptions& options) : ScriptEngine(options) { _isolate = v8::Isolate::New(); v8::Locker locker(_isolate); v8::Isolate::Scope isolate_scope(_isolate); v8::HandleScope handle_scope(_isolate); _globalContext.Reset(_isolate, createGlobalContext()); if (options.script().isSet() && !options.script()->getCode().empty()) { // Create a nested handle scope v8::HandleScope local_handle_scope(_isolate); // Enter the global context v8::Local<v8::Context> globalContext = *reinterpret_cast<v8::Local<v8::Context>*>(&_globalContext); v8::Context::Scope context_scope(globalContext); // Compile and run the script ScriptResult result = executeScript(v8::String::New(options.script()->getCode().c_str(), options.script()->getCode().length())); if (!result.success()) OE_WARN << LC << "Error reading javascript: " << result.message() << std::endl; } }