Ejemplo n.º 1
0
 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");
 }
Ejemplo n.º 2
0
 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>');
 }