public static function run($allRules = false) { $database = Database::singleton(); $logger = Logger::getLogger('EXECENGINE'); $logger->info("ExecEngine run started"); // Load the execEngine functions (security hazard :P) $files = getDirectoryList(__DIR__ . '/functions'); foreach ($files as $file) { if (substr($file, -3) !== 'php') { continue; } require_once $path = __DIR__ . '/functions/' . $file; $logger->debug("Included file: {$path}"); } self::$roleName = Config::get('execEngineRoleName', 'execEngine'); try { $role = Role::getRoleByName(self::$roleName); } catch (Exception $e) { $logger->warning("ExecEngine extension included but role '" . self::$roleName . "' not used/defined in &-script."); self::$doRun = false; // prevent exec engine execution } $maxRunCount = Config::get('maxRunCount', 'execEngine'); self::$runCount = 0; self::$autoRerun = Config::get('autoRerun', 'execEngine'); // Get all rules that are maintained by the ExecEngine $rulesThatHaveViolations = array(); while (self::$doRun) { self::$doRun = false; self::$runCount++; // Prevent infinite loop in ExecEngine reruns if (self::$runCount > $maxRunCount) { Logger::getUserLogger()->error('Maximum reruns exceeded for ExecEngine (rules with violations:' . implode(', ', $rulesThatHaveViolations) . ')'); break; } $logger->notice("ExecEngine run #" . self::$runCount . " (auto rerun: " . var_export(self::$autoRerun, true) . ") for role '{$role->label}'"); // Determine affected rules that must be checked by the exec engine $affectedConjuncts = RuleEngine::getAffectedConjuncts($database->getAffectedConcepts(), $database->getAffectedRelations(), 'sig'); $affectedRules = array(); foreach ($affectedConjuncts as $conjunct) { $affectedRules = array_merge($affectedRules, $conjunct->sigRuleNames); } // Check rules $rulesThatHaveViolations = array(); foreach ($role->maintains() as $ruleName) { if (!in_array($ruleName, $affectedRules) && !$allRules) { continue; } // skip this rule $rule = Rule::getRule($ruleName); $violations = $rule->getViolations(false); if (count($violations)) { $rulesThatHaveViolations[] = $rule->id; // Fix violations for every rule $logger->notice("ExecEngine fixing " . count($violations) . " violations for rule '{$rule->id}'"); self::fixViolations($violations); // Conjunct violations are not cached, because they are fixed by the ExecEngine $logger->debug("Fixed " . count($violations) . " violations for rule '{$rule->__toString()}'"); // If $autoRerun, set $doRun to true because violations have been fixed (this may fire other execEngine rules) if (self::$autoRerun) { self::$doRun = true; } } } } $logger->info("ExecEngine run completed"); }
public function buildHtml() { $this->addHtmlLine("<!doctype html>"); $this->addHtmlLine('<html ng-app="AmpersandApp">'); $this->addHtmlLine('<head>'); $this->addHtmlLine('<title>' . Config::get('contextName') . '</title>'); // Meta tags $this->addHtmlLine('<meta name="viewport" content="width=device-width, initial-scale=1.0"/>'); $this->addHtmlLine('<meta charset="UTF-8">'); $this->addHtmlLine('<meta http-equiv="Expires" content="0"/>'); $this->addHtmlLine('<meta http-equiv="Cache-Control" content="no-store"/>'); // initSessionId $this->addHtmlLine('<script type="text/javascript">var initSessionId = \'' . session_id() . '\';</script>'); // JQuery $this->addHtmlLine('<script src="app/lib/jquery/jquery-1.11.0.min.js"></script>'); $this->addHtmlLine('<script src="app/lib/jquery/jquery-migrate-1.2.1.js"></script>'); $this->addHtmlLine('<script src="app/lib/jquery/jquery-ui-1.10.4.custom.js"></script>'); // Bootstrap (requires Jquery, loaded above) $this->addHtmlLine('<link href="app/lib/bootstrap-3.3.5-dist/css/bootstrap.min.css" rel="stylesheet" media="screen">'); // load boostrap.css before app specific css files that overwrite bootstrap.css $this->addHtmlLine('<script src="app/lib/bootstrap-3.3.5-dist/js/bootstrap.min.js"></script>'); /* ********** Angular ********************************* * */ $this->addHtmlLine('<script src="app/lib/angular/angular.min.js"></script>'); $this->addHtmlLine('<script src="app/lib/angular/angular-resource.min.js"></script>'); $this->addHtmlLine('<script src="app/lib/angular/angular-route.min.js"></script>'); $this->addHtmlLine('<script src="app/lib/angular/angular-sanitize.min.js"></script>'); /* Third party directives/libraries for angular */ // angular-ui-switch $this->addHtmlLine('<script src="app/lib/angular/angular-ui-switch/angular-ui-switch-adapted.js"></script>'); $this->addHtmlLine('<link href="app/lib/angular/angular-ui-switch/angular-ui-switch.css" rel="stylesheet" media="screen" type="text/css">'); // angular-busy $this->addHtmlLine('<script src="app/lib/angular/angular-busy/angular-busy.min.js"></script>'); $this->addHtmlLine('<link href="app/lib/angular/angular-busy/angular-busy.min.css" rel="stylesheet" media="screen" type="text/css">'); // si-table $this->addHtmlLine('<script src="app/lib/angular/si-table/si-table.js"></script>'); // angular-code-mirror $this->addHtmlLine('<script src="app/lib/angular/angular-code-mirror/angular-code-mirror.min.js"></script>'); $this->addHtmlLine('<link href="app/lib/angular/angular-code-mirror/angular-code-mirror.css" rel="stylesheet" media="screen" type="text/css">'); // ng-storage $this->addHtmlLine('<script src="app/lib/angular/angular-ng-storage/ngStorage.min.js"></script>'); // angular-file-upload $this->addHtmlLine('<script src="app/lib/angular/angular-file-upload/angular-file-upload.min.js"></script>'); // angular-grid $this->addHtmlLine('<script src="app/lib/angular/angular-grid/ag-grid.min.js"></script>'); $this->addHtmlLine('<link href="app/lib/angular/angular-grid/ag-grid.min.css" rel="stylesheet" media="screen" type="text/css">'); $this->addHtmlLine('<link href="app/lib/angular/angular-grid/theme-dark.min.css" rel="stylesheet" media="screen" type="text/css">'); $this->addHtmlLine('<link href="app/lib/angular/angular-grid/theme-fresh.min.css" rel="stylesheet" media="screen" type="text/css">'); // Restangular (with depency for lodash) $this->addHtmlLine('<script src="app/lib/restangular/restangular.min.js"></script>'); $this->addHtmlLine('<script src="app/lib/restangular/lodash.min.js"></script>'); // jquery UI & bootstrap in native AngularJS $this->addHtmlLine('<script src="app/lib/ui-bootstrap/ui-bootstrap-tpls-0.14.3.min.js"></script>'); // datetimepicker $this->addHtmlLine('<script src="app/lib/ui-bootstrap/datetimepicker/datetimepicker.js"></script>'); $this->addHtmlLine('<link href="app/lib/ui-bootstrap/datetimepicker/datetimepicker.css" rel="stylesheet" media="screen" type="text/css">'); // markdown support $this->addHtmlLine('<script src="app/lib/marked/lib/marked.js"></script>'); $this->addHtmlLine('<script src="app/lib/angular-marked/dist/angular-marked.js"></script>'); /* ********** CSS ********************************* * */ // CSS files from app directory $files = getDirectoryList(Config::get('pathToAppFolder') . 'css'); $cssFiles = array(); foreach ((array) $files as $file) { if (substr($file, -3) !== 'css') { continue; } if ($file == 'ampersand.css') { array_unshift($cssFiles, 'app/css/' . $file); } else { $cssFiles[] = 'app/css/' . $file; } } // Add css files to html output foreach ($cssFiles as $file) { $this->addHtmlLine('<link href="' . $file . '" rel="stylesheet" media="screen" type="text/css">'); } // Other css files (from extensions) foreach (AngularApp::$cssFiles as $file) { $this->addHtmlLine('<link href="' . $file . '" rel="stylesheet" media="screen" type="text/css">'); } /* ********** App specific javascript *************** * */ // AmpersandApp $this->addHtmlLine('<script src="app/AmpersandApp.js"></script>'); $this->addHtmlLine('<script src="app/RouteProvider.js"></script>'); // AngularApp controler files (both static and generated) $files = getDirectoryList(Config::get('pathToAppFolder') . 'controllers'); foreach ((array) $files as $file) { if (substr($file, -2) !== 'js') { continue; } $this->addHtmlLine('<script src="app/controllers/' . $file . '"></script>'); } // Javascript files $files = getDirectoryList(Config::get('pathToAppFolder') . 'js'); foreach ((array) $files as $file) { if (substr($file, -2) !== 'js') { continue; } $this->addHtmlLine('<script src="app/js/' . $file . '"></script>'); } // Add js files to html output foreach (AngularApp::$jsFiles as $file) { $this->addHtmlLine('<script src="' . $file . '"></script>'); } $this->addHtmlLine('</head>'); $this->addHtmlLine('<body>'); $this->addHtmlLine(file_get_contents(Config::get('pathToAppFolder') . 'AmpersandApp.html')); $this->addHtmlLine('</body>'); $this->addHtmlLine('</html>'); }