Passed
Push — master ( 4a52d9...223a91 )
by Morris
11:47 queued 10s
created
lib/private/DB/MDB2SchemaWriter.php 3 patches
Indentation   +140 added lines, -140 removed lines patch added patch discarded remove patch
@@ -31,153 +31,153 @@
 block discarded – undo
31 31
 
32 32
 class MDB2SchemaWriter {
33 33
 
34
-	/**
35
-	 * @param string $file
36
-	 * @param \OC\DB\Connection $conn
37
-	 * @return bool
38
-	 */
39
-	static public function saveSchemaToFile($file, \OC\DB\Connection $conn) {
40
-		$config = \OC::$server->getConfig();
34
+    /**
35
+     * @param string $file
36
+     * @param \OC\DB\Connection $conn
37
+     * @return bool
38
+     */
39
+    static public function saveSchemaToFile($file, \OC\DB\Connection $conn) {
40
+        $config = \OC::$server->getConfig();
41 41
 
42
-		$xml = new \SimpleXMLElement('<database/>');
43
-		$xml->addChild('name', $config->getSystemValue('dbname', 'owncloud'));
44
-		$xml->addChild('create', 'true');
45
-		$xml->addChild('overwrite', 'false');
46
-		if($config->getSystemValue('dbtype', 'sqlite') === 'mysql' && $config->getSystemValue('mysql.utf8mb4', false)) {
47
-			$xml->addChild('charset', 'utf8mb4');
48
-		} else {
49
-			$xml->addChild('charset', 'utf8');
50
-		}
42
+        $xml = new \SimpleXMLElement('<database/>');
43
+        $xml->addChild('name', $config->getSystemValue('dbname', 'owncloud'));
44
+        $xml->addChild('create', 'true');
45
+        $xml->addChild('overwrite', 'false');
46
+        if($config->getSystemValue('dbtype', 'sqlite') === 'mysql' && $config->getSystemValue('mysql.utf8mb4', false)) {
47
+            $xml->addChild('charset', 'utf8mb4');
48
+        } else {
49
+            $xml->addChild('charset', 'utf8');
50
+        }
51 51
 
52
-		// FIX ME: bloody work around
53
-		if ($config->getSystemValue('dbtype', 'sqlite') === 'oci') {
54
-			$filterExpression = '/^"' . preg_quote($conn->getPrefix()) . '/';
55
-		} else {
56
-			$filterExpression = '/^' . preg_quote($conn->getPrefix()) . '/';
57
-		}
58
-		$conn->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
52
+        // FIX ME: bloody work around
53
+        if ($config->getSystemValue('dbtype', 'sqlite') === 'oci') {
54
+            $filterExpression = '/^"' . preg_quote($conn->getPrefix()) . '/';
55
+        } else {
56
+            $filterExpression = '/^' . preg_quote($conn->getPrefix()) . '/';
57
+        }
58
+        $conn->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
59 59
 
60
-		foreach ($conn->getSchemaManager()->listTables() as $table) {
61
-			self::saveTable($table, $xml->addChild('table'));
62
-		}
63
-		file_put_contents($file, $xml->asXML());
64
-		return true;
65
-	}
60
+        foreach ($conn->getSchemaManager()->listTables() as $table) {
61
+            self::saveTable($table, $xml->addChild('table'));
62
+        }
63
+        file_put_contents($file, $xml->asXML());
64
+        return true;
65
+    }
66 66
 
67
-	/**
68
-	 * @param \Doctrine\DBAL\Schema\Table $table
69
-	 * @param \SimpleXMLElement $xml
70
-	 */
71
-	private static function saveTable($table, $xml) {
72
-		$xml->addChild('name', $table->getName());
73
-		$declaration = $xml->addChild('declaration');
74
-		foreach($table->getColumns() as $column) {
75
-			self::saveColumn($column, $declaration->addChild('field'));
76
-		}
77
-		foreach($table->getIndexes() as $index) {
78
-			if ($index->getName() == 'PRIMARY') {
79
-				$autoincrement = false;
80
-				foreach($index->getColumns() as $column) {
81
-					if ($table->getColumn($column)->getAutoincrement()) {
82
-						$autoincrement = true;
83
-					}
84
-				}
85
-				if ($autoincrement) {
86
-					continue;
87
-				}
88
-			}
89
-			self::saveIndex($index, $declaration->addChild('index'));
90
-		}
91
-	}
67
+    /**
68
+     * @param \Doctrine\DBAL\Schema\Table $table
69
+     * @param \SimpleXMLElement $xml
70
+     */
71
+    private static function saveTable($table, $xml) {
72
+        $xml->addChild('name', $table->getName());
73
+        $declaration = $xml->addChild('declaration');
74
+        foreach($table->getColumns() as $column) {
75
+            self::saveColumn($column, $declaration->addChild('field'));
76
+        }
77
+        foreach($table->getIndexes() as $index) {
78
+            if ($index->getName() == 'PRIMARY') {
79
+                $autoincrement = false;
80
+                foreach($index->getColumns() as $column) {
81
+                    if ($table->getColumn($column)->getAutoincrement()) {
82
+                        $autoincrement = true;
83
+                    }
84
+                }
85
+                if ($autoincrement) {
86
+                    continue;
87
+                }
88
+            }
89
+            self::saveIndex($index, $declaration->addChild('index'));
90
+        }
91
+    }
92 92
 
93
-	/**
94
-	 * @param Column $column
95
-	 * @param \SimpleXMLElement $xml
96
-	 */
97
-	private static function saveColumn($column, $xml) {
98
-		$xml->addChild('name', $column->getName());
99
-		switch($column->getType()) {
100
-			case 'SmallInt':
101
-			case 'Integer':
102
-			case 'BigInt':
103
-				$xml->addChild('type', 'integer');
104
-				$default = $column->getDefault();
105
-				if (is_null($default) && $column->getAutoincrement()) {
106
-					$default = '0';
107
-				}
108
-				$xml->addChild('default', $default);
109
-				$xml->addChild('notnull', self::toBool($column->getNotnull()));
110
-				if ($column->getAutoincrement()) {
111
-					$xml->addChild('autoincrement', '1');
112
-				}
113
-				if ($column->getUnsigned()) {
114
-					$xml->addChild('unsigned', 'true');
115
-				}
116
-				$length = '4';
117
-				if ($column->getType() == 'SmallInt') {
118
-					$length = '2';
119
-				}
120
-				elseif ($column->getType() == 'BigInt') {
121
-					$length = '8';
122
-				}
123
-				$xml->addChild('length', $length);
124
-				break;
125
-			case 'String':
126
-				$xml->addChild('type', 'text');
127
-				$default = trim($column->getDefault());
128
-				if ($default === '') {
129
-					$default = false;
130
-				}
131
-				$xml->addChild('default', $default);
132
-				$xml->addChild('notnull', self::toBool($column->getNotnull()));
133
-				$xml->addChild('length', $column->getLength());
134
-				break;
135
-			case 'Text':
136
-				$xml->addChild('type', 'clob');
137
-				$xml->addChild('notnull', self::toBool($column->getNotnull()));
138
-				break;
139
-			case 'Decimal':
140
-				$xml->addChild('type', 'decimal');
141
-				$xml->addChild('default', $column->getDefault());
142
-				$xml->addChild('notnull', self::toBool($column->getNotnull()));
143
-				$xml->addChild('length', '15');
144
-				break;
145
-			case 'Boolean':
146
-				$xml->addChild('type', 'integer');
147
-				$xml->addChild('default', $column->getDefault());
148
-				$xml->addChild('notnull', self::toBool($column->getNotnull()));
149
-				$xml->addChild('length', '1');
150
-				break;
151
-			case 'DateTime':
152
-				$xml->addChild('type', 'timestamp');
153
-				$xml->addChild('default', $column->getDefault());
154
-				$xml->addChild('notnull', self::toBool($column->getNotnull()));
155
-				break;
93
+    /**
94
+     * @param Column $column
95
+     * @param \SimpleXMLElement $xml
96
+     */
97
+    private static function saveColumn($column, $xml) {
98
+        $xml->addChild('name', $column->getName());
99
+        switch($column->getType()) {
100
+            case 'SmallInt':
101
+            case 'Integer':
102
+            case 'BigInt':
103
+                $xml->addChild('type', 'integer');
104
+                $default = $column->getDefault();
105
+                if (is_null($default) && $column->getAutoincrement()) {
106
+                    $default = '0';
107
+                }
108
+                $xml->addChild('default', $default);
109
+                $xml->addChild('notnull', self::toBool($column->getNotnull()));
110
+                if ($column->getAutoincrement()) {
111
+                    $xml->addChild('autoincrement', '1');
112
+                }
113
+                if ($column->getUnsigned()) {
114
+                    $xml->addChild('unsigned', 'true');
115
+                }
116
+                $length = '4';
117
+                if ($column->getType() == 'SmallInt') {
118
+                    $length = '2';
119
+                }
120
+                elseif ($column->getType() == 'BigInt') {
121
+                    $length = '8';
122
+                }
123
+                $xml->addChild('length', $length);
124
+                break;
125
+            case 'String':
126
+                $xml->addChild('type', 'text');
127
+                $default = trim($column->getDefault());
128
+                if ($default === '') {
129
+                    $default = false;
130
+                }
131
+                $xml->addChild('default', $default);
132
+                $xml->addChild('notnull', self::toBool($column->getNotnull()));
133
+                $xml->addChild('length', $column->getLength());
134
+                break;
135
+            case 'Text':
136
+                $xml->addChild('type', 'clob');
137
+                $xml->addChild('notnull', self::toBool($column->getNotnull()));
138
+                break;
139
+            case 'Decimal':
140
+                $xml->addChild('type', 'decimal');
141
+                $xml->addChild('default', $column->getDefault());
142
+                $xml->addChild('notnull', self::toBool($column->getNotnull()));
143
+                $xml->addChild('length', '15');
144
+                break;
145
+            case 'Boolean':
146
+                $xml->addChild('type', 'integer');
147
+                $xml->addChild('default', $column->getDefault());
148
+                $xml->addChild('notnull', self::toBool($column->getNotnull()));
149
+                $xml->addChild('length', '1');
150
+                break;
151
+            case 'DateTime':
152
+                $xml->addChild('type', 'timestamp');
153
+                $xml->addChild('default', $column->getDefault());
154
+                $xml->addChild('notnull', self::toBool($column->getNotnull()));
155
+                break;
156 156
 
157
-		}
158
-	}
157
+        }
158
+    }
159 159
 
160
-	/**
161
-	 * @param Index $index
162
-	 * @param \SimpleXMLElement $xml
163
-	 */
164
-	private static function saveIndex($index, $xml) {
165
-		$xml->addChild('name', $index->getName());
166
-		if ($index->isPrimary()) {
167
-			$xml->addChild('primary', 'true');
168
-		}
169
-		elseif ($index->isUnique()) {
170
-			$xml->addChild('unique', 'true');
171
-		}
172
-		foreach($index->getColumns() as $column) {
173
-			$field = $xml->addChild('field');
174
-			$field->addChild('name', $column);
175
-			$field->addChild('sorting', 'ascending');
160
+    /**
161
+     * @param Index $index
162
+     * @param \SimpleXMLElement $xml
163
+     */
164
+    private static function saveIndex($index, $xml) {
165
+        $xml->addChild('name', $index->getName());
166
+        if ($index->isPrimary()) {
167
+            $xml->addChild('primary', 'true');
168
+        }
169
+        elseif ($index->isUnique()) {
170
+            $xml->addChild('unique', 'true');
171
+        }
172
+        foreach($index->getColumns() as $column) {
173
+            $field = $xml->addChild('field');
174
+            $field->addChild('name', $column);
175
+            $field->addChild('sorting', 'ascending');
176 176
 			
177
-		}
178
-	}
177
+        }
178
+    }
179 179
 
180
-	private static function toBool($bool) {
181
-		return $bool ? 'true' : 'false';
182
-	}
180
+    private static function toBool($bool) {
181
+        return $bool ? 'true' : 'false';
182
+    }
183 183
 }
Please login to merge, or discard this patch.
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -43,7 +43,7 @@  discard block
 block discarded – undo
43 43
 		$xml->addChild('name', $config->getSystemValue('dbname', 'owncloud'));
44 44
 		$xml->addChild('create', 'true');
45 45
 		$xml->addChild('overwrite', 'false');
46
-		if($config->getSystemValue('dbtype', 'sqlite') === 'mysql' && $config->getSystemValue('mysql.utf8mb4', false)) {
46
+		if ($config->getSystemValue('dbtype', 'sqlite') === 'mysql' && $config->getSystemValue('mysql.utf8mb4', false)) {
47 47
 			$xml->addChild('charset', 'utf8mb4');
48 48
 		} else {
49 49
 			$xml->addChild('charset', 'utf8');
@@ -51,9 +51,9 @@  discard block
 block discarded – undo
51 51
 
52 52
 		// FIX ME: bloody work around
53 53
 		if ($config->getSystemValue('dbtype', 'sqlite') === 'oci') {
54
-			$filterExpression = '/^"' . preg_quote($conn->getPrefix()) . '/';
54
+			$filterExpression = '/^"'.preg_quote($conn->getPrefix()).'/';
55 55
 		} else {
56
-			$filterExpression = '/^' . preg_quote($conn->getPrefix()) . '/';
56
+			$filterExpression = '/^'.preg_quote($conn->getPrefix()).'/';
57 57
 		}
58 58
 		$conn->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
59 59
 
@@ -71,13 +71,13 @@  discard block
 block discarded – undo
71 71
 	private static function saveTable($table, $xml) {
72 72
 		$xml->addChild('name', $table->getName());
73 73
 		$declaration = $xml->addChild('declaration');
74
-		foreach($table->getColumns() as $column) {
74
+		foreach ($table->getColumns() as $column) {
75 75
 			self::saveColumn($column, $declaration->addChild('field'));
76 76
 		}
77
-		foreach($table->getIndexes() as $index) {
77
+		foreach ($table->getIndexes() as $index) {
78 78
 			if ($index->getName() == 'PRIMARY') {
79 79
 				$autoincrement = false;
80
-				foreach($index->getColumns() as $column) {
80
+				foreach ($index->getColumns() as $column) {
81 81
 					if ($table->getColumn($column)->getAutoincrement()) {
82 82
 						$autoincrement = true;
83 83
 					}
@@ -96,7 +96,7 @@  discard block
 block discarded – undo
96 96
 	 */
97 97
 	private static function saveColumn($column, $xml) {
98 98
 		$xml->addChild('name', $column->getName());
99
-		switch($column->getType()) {
99
+		switch ($column->getType()) {
100 100
 			case 'SmallInt':
101 101
 			case 'Integer':
102 102
 			case 'BigInt':
@@ -169,7 +169,7 @@  discard block
 block discarded – undo
169 169
 		elseif ($index->isUnique()) {
170 170
 			$xml->addChild('unique', 'true');
171 171
 		}
172
-		foreach($index->getColumns() as $column) {
172
+		foreach ($index->getColumns() as $column) {
173 173
 			$field = $xml->addChild('field');
174 174
 			$field->addChild('name', $column);
175 175
 			$field->addChild('sorting', 'ascending');
Please login to merge, or discard this patch.
Braces   +2 added lines, -4 removed lines patch added patch discarded remove patch
@@ -116,8 +116,7 @@  discard block
 block discarded – undo
116 116
 				$length = '4';
117 117
 				if ($column->getType() == 'SmallInt') {
118 118
 					$length = '2';
119
-				}
120
-				elseif ($column->getType() == 'BigInt') {
119
+				} elseif ($column->getType() == 'BigInt') {
121 120
 					$length = '8';
122 121
 				}
123 122
 				$xml->addChild('length', $length);
@@ -165,8 +164,7 @@  discard block
 block discarded – undo
165 164
 		$xml->addChild('name', $index->getName());
166 165
 		if ($index->isPrimary()) {
167 166
 			$xml->addChild('primary', 'true');
168
-		}
169
-		elseif ($index->isUnique()) {
167
+		} elseif ($index->isUnique()) {
170 168
 			$xml->addChild('unique', 'true');
171 169
 		}
172 170
 		foreach($index->getColumns() as $column) {
Please login to merge, or discard this patch.
lib/private/DB/Migrator.php 2 patches
Spacing   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -137,7 +137,7 @@  discard block
 block discarded – undo
137 137
 	 * @return string
138 138
 	 */
139 139
 	protected function generateTemporaryTableName($name) {
140
-		return $this->config->getSystemValue('dbtableprefix', 'oc_') . $name . '_' . $this->random->generate(13, ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_DIGITS);
140
+		return $this->config->getSystemValue('dbtableprefix', 'oc_').$name.'_'.$this->random->generate(13, ISecureRandom::CHAR_LOWER.ISecureRandom::CHAR_DIGITS);
141 141
 	}
142 142
 
143 143
 	/**
@@ -188,7 +188,7 @@  discard block
 block discarded – undo
188 188
 				$indexName = $index->getName();
189 189
 			} else {
190 190
 				// avoid conflicts in index names
191
-				$indexName = $this->config->getSystemValue('dbtableprefix', 'oc_') . $this->random->generate(13, ISecureRandom::CHAR_LOWER);
191
+				$indexName = $this->config->getSystemValue('dbtableprefix', 'oc_').$this->random->generate(13, ISecureRandom::CHAR_LOWER);
192 192
 			}
193 193
 			$newIndexes[] = new Index($indexName, $index->getColumns(), $index->isUnique(), $index->isPrimary());
194 194
 		}
@@ -268,15 +268,15 @@  discard block
 block discarded – undo
268 268
 		$quotedSource = $this->connection->quoteIdentifier($sourceName);
269 269
 		$quotedTarget = $this->connection->quoteIdentifier($targetName);
270 270
 
271
-		$this->connection->exec('CREATE TABLE ' . $quotedTarget . ' (LIKE ' . $quotedSource . ')');
272
-		$this->connection->exec('INSERT INTO ' . $quotedTarget . ' SELECT * FROM ' . $quotedSource);
271
+		$this->connection->exec('CREATE TABLE '.$quotedTarget.' (LIKE '.$quotedSource.')');
272
+		$this->connection->exec('INSERT INTO '.$quotedTarget.' SELECT * FROM '.$quotedSource);
273 273
 	}
274 274
 
275 275
 	/**
276 276
 	 * @param string $name
277 277
 	 */
278 278
 	protected function dropTable($name) {
279
-		$this->connection->exec('DROP TABLE ' . $this->connection->quoteIdentifier($name));
279
+		$this->connection->exec('DROP TABLE '.$this->connection->quoteIdentifier($name));
280 280
 	}
281 281
 
282 282
 	/**
@@ -284,30 +284,30 @@  discard block
 block discarded – undo
284 284
 	 * @return string
285 285
 	 */
286 286
 	protected function convertStatementToScript($statement) {
287
-		$script = $statement . ';';
287
+		$script = $statement.';';
288 288
 		$script .= PHP_EOL;
289 289
 		$script .= PHP_EOL;
290 290
 		return $script;
291 291
 	}
292 292
 
293 293
 	protected function getFilterExpression() {
294
-		return '/^' . preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')) . '/';
294
+		return '/^'.preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')).'/';
295 295
 	}
296 296
 
297 297
 	protected function emit($sql, $step, $max) {
298 298
 		if ($this->noEmit) {
299 299
 			return;
300 300
 		}
301
-		if(is_null($this->dispatcher)) {
301
+		if (is_null($this->dispatcher)) {
302 302
 			return;
303 303
 		}
304
-		$this->dispatcher->dispatch('\OC\DB\Migrator::executeSql', new GenericEvent($sql, [$step+1, $max]));
304
+		$this->dispatcher->dispatch('\OC\DB\Migrator::executeSql', new GenericEvent($sql, [$step + 1, $max]));
305 305
 	}
306 306
 
307 307
 	private function emitCheckStep($tableName, $step, $max) {
308
-		if(is_null($this->dispatcher)) {
308
+		if (is_null($this->dispatcher)) {
309 309
 			return;
310 310
 		}
311
-		$this->dispatcher->dispatch('\OC\DB\Migrator::checkTable', new GenericEvent($tableName, [$step+1, $max]));
311
+		$this->dispatcher->dispatch('\OC\DB\Migrator::checkTable', new GenericEvent($tableName, [$step + 1, $max]));
312 312
 	}
313 313
 }
Please login to merge, or discard this patch.
Indentation   +268 added lines, -268 removed lines patch added patch discarded remove patch
@@ -44,272 +44,272 @@
 block discarded – undo
44 44
 
45 45
 class Migrator {
46 46
 
47
-	/** @var \Doctrine\DBAL\Connection */
48
-	protected $connection;
49
-
50
-	/** @var ISecureRandom */
51
-	private $random;
52
-
53
-	/** @var IConfig */
54
-	protected $config;
55
-
56
-	/** @var EventDispatcherInterface  */
57
-	private $dispatcher;
58
-
59
-	/** @var bool */
60
-	private $noEmit = false;
61
-
62
-	/**
63
-	 * @param \Doctrine\DBAL\Connection|Connection $connection
64
-	 * @param ISecureRandom $random
65
-	 * @param IConfig $config
66
-	 * @param EventDispatcherInterface $dispatcher
67
-	 */
68
-	public function __construct(\Doctrine\DBAL\Connection $connection,
69
-								ISecureRandom $random,
70
-								IConfig $config,
71
-								EventDispatcherInterface $dispatcher = null) {
72
-		$this->connection = $connection;
73
-		$this->random = $random;
74
-		$this->config = $config;
75
-		$this->dispatcher = $dispatcher;
76
-	}
77
-
78
-	/**
79
-	 * @param \Doctrine\DBAL\Schema\Schema $targetSchema
80
-	 */
81
-	public function migrate(Schema $targetSchema) {
82
-		$this->noEmit = true;
83
-		$this->applySchema($targetSchema);
84
-	}
85
-
86
-	/**
87
-	 * @param \Doctrine\DBAL\Schema\Schema $targetSchema
88
-	 * @return string
89
-	 */
90
-	public function generateChangeScript(Schema $targetSchema) {
91
-		$schemaDiff = $this->getDiff($targetSchema, $this->connection);
92
-
93
-		$script = '';
94
-		$sqls = $schemaDiff->toSql($this->connection->getDatabasePlatform());
95
-		foreach ($sqls as $sql) {
96
-			$script .= $this->convertStatementToScript($sql);
97
-		}
98
-
99
-		return $script;
100
-	}
101
-
102
-	/**
103
-	 * @param Schema $targetSchema
104
-	 * @throws \OC\DB\MigrationException
105
-	 */
106
-	public function checkMigrate(Schema $targetSchema) {
107
-		$this->noEmit = true;
108
-		/**@var \Doctrine\DBAL\Schema\Table[] $tables */
109
-		$tables = $targetSchema->getTables();
110
-		$filterExpression = $this->getFilterExpression();
111
-		$this->connection->getConfiguration()->
112
-			setFilterSchemaAssetsExpression($filterExpression);
113
-		$existingTables = $this->connection->getSchemaManager()->listTableNames();
114
-
115
-		$step = 0;
116
-		foreach ($tables as $table) {
117
-			if (strpos($table->getName(), '.')) {
118
-				list(, $tableName) = explode('.', $table->getName());
119
-			} else {
120
-				$tableName = $table->getName();
121
-			}
122
-			$this->emitCheckStep($tableName, $step++, count($tables));
123
-			// don't need to check for new tables
124
-			if (array_search($tableName, $existingTables) !== false) {
125
-				$this->checkTableMigrate($table);
126
-			}
127
-		}
128
-	}
129
-
130
-	/**
131
-	 * Create a unique name for the temporary table
132
-	 *
133
-	 * @param string $name
134
-	 * @return string
135
-	 */
136
-	protected function generateTemporaryTableName($name) {
137
-		return $this->config->getSystemValue('dbtableprefix', 'oc_') . $name . '_' . $this->random->generate(13, ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_DIGITS);
138
-	}
139
-
140
-	/**
141
-	 * Check the migration of a table on a copy so we can detect errors before messing with the real table
142
-	 *
143
-	 * @param \Doctrine\DBAL\Schema\Table $table
144
-	 * @throws \OC\DB\MigrationException
145
-	 */
146
-	protected function checkTableMigrate(Table $table) {
147
-		$name = $table->getName();
148
-		$tmpName = $this->generateTemporaryTableName($name);
149
-
150
-		$this->copyTable($name, $tmpName);
151
-
152
-		//create the migration schema for the temporary table
153
-		$tmpTable = $this->renameTableSchema($table, $tmpName);
154
-		$schemaConfig = new SchemaConfig();
155
-		$schemaConfig->setName($this->connection->getDatabase());
156
-		$schema = new Schema(array($tmpTable), array(), $schemaConfig);
157
-
158
-		try {
159
-			$this->applySchema($schema);
160
-			$this->dropTable($tmpName);
161
-		} catch (DBALException $e) {
162
-			// pgsql needs to commit it's failed transaction before doing anything else
163
-			if ($this->connection->isTransactionActive()) {
164
-				$this->connection->commit();
165
-			}
166
-			$this->dropTable($tmpName);
167
-			throw new MigrationException($table->getName(), $e->getMessage());
168
-		}
169
-	}
170
-
171
-	/**
172
-	 * @param \Doctrine\DBAL\Schema\Table $table
173
-	 * @param string $newName
174
-	 * @return \Doctrine\DBAL\Schema\Table
175
-	 */
176
-	protected function renameTableSchema(Table $table, $newName) {
177
-		/**
178
-		 * @var \Doctrine\DBAL\Schema\Index[] $indexes
179
-		 */
180
-		$indexes = $table->getIndexes();
181
-		$newIndexes = array();
182
-		foreach ($indexes as $index) {
183
-			if ($index->isPrimary()) {
184
-				// do not rename primary key
185
-				$indexName = $index->getName();
186
-			} else {
187
-				// avoid conflicts in index names
188
-				$indexName = $this->config->getSystemValue('dbtableprefix', 'oc_') . $this->random->generate(13, ISecureRandom::CHAR_LOWER);
189
-			}
190
-			$newIndexes[] = new Index($indexName, $index->getColumns(), $index->isUnique(), $index->isPrimary());
191
-		}
192
-
193
-		// foreign keys are not supported so we just set it to an empty array
194
-		return new Table($newName, $table->getColumns(), $newIndexes, array(), 0, $table->getOptions());
195
-	}
196
-
197
-	public function createSchema() {
198
-		$filterExpression = $this->getFilterExpression();
199
-		$this->connection->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
200
-		return $this->connection->getSchemaManager()->createSchema();
201
-	}
202
-
203
-	/**
204
-	 * @param Schema $targetSchema
205
-	 * @param \Doctrine\DBAL\Connection $connection
206
-	 * @return \Doctrine\DBAL\Schema\SchemaDiff
207
-	 * @throws DBALException
208
-	 */
209
-	protected function getDiff(Schema $targetSchema, \Doctrine\DBAL\Connection $connection) {
210
-		// adjust varchar columns with a length higher then getVarcharMaxLength to clob
211
-		foreach ($targetSchema->getTables() as $table) {
212
-			foreach ($table->getColumns() as $column) {
213
-				if ($column->getType() instanceof StringType) {
214
-					if ($column->getLength() > $connection->getDatabasePlatform()->getVarcharMaxLength()) {
215
-						$column->setType(Type::getType('text'));
216
-						$column->setLength(null);
217
-					}
218
-				}
219
-			}
220
-		}
221
-
222
-		$filterExpression = $this->getFilterExpression();
223
-		$this->connection->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
224
-		$sourceSchema = $connection->getSchemaManager()->createSchema();
225
-
226
-		// remove tables we don't know about
227
-		/** @var $table \Doctrine\DBAL\Schema\Table */
228
-		foreach ($sourceSchema->getTables() as $table) {
229
-			if (!$targetSchema->hasTable($table->getName())) {
230
-				$sourceSchema->dropTable($table->getName());
231
-			}
232
-		}
233
-		// remove sequences we don't know about
234
-		foreach ($sourceSchema->getSequences() as $table) {
235
-			if (!$targetSchema->hasSequence($table->getName())) {
236
-				$sourceSchema->dropSequence($table->getName());
237
-			}
238
-		}
239
-
240
-		$comparator = new Comparator();
241
-		return $comparator->compare($sourceSchema, $targetSchema);
242
-	}
243
-
244
-	/**
245
-	 * @param \Doctrine\DBAL\Schema\Schema $targetSchema
246
-	 * @param \Doctrine\DBAL\Connection $connection
247
-	 */
248
-	protected function applySchema(Schema $targetSchema, \Doctrine\DBAL\Connection $connection = null) {
249
-		if (is_null($connection)) {
250
-			$connection = $this->connection;
251
-		}
252
-
253
-		$schemaDiff = $this->getDiff($targetSchema, $connection);
254
-
255
-		$connection->beginTransaction();
256
-		$sqls = $schemaDiff->toSql($connection->getDatabasePlatform());
257
-		$step = 0;
258
-		foreach ($sqls as $sql) {
259
-			$this->emit($sql, $step++, count($sqls));
260
-			$connection->query($sql);
261
-		}
262
-		$connection->commit();
263
-	}
264
-
265
-	/**
266
-	 * @param string $sourceName
267
-	 * @param string $targetName
268
-	 */
269
-	protected function copyTable($sourceName, $targetName) {
270
-		$quotedSource = $this->connection->quoteIdentifier($sourceName);
271
-		$quotedTarget = $this->connection->quoteIdentifier($targetName);
272
-
273
-		$this->connection->exec('CREATE TABLE ' . $quotedTarget . ' (LIKE ' . $quotedSource . ')');
274
-		$this->connection->exec('INSERT INTO ' . $quotedTarget . ' SELECT * FROM ' . $quotedSource);
275
-	}
276
-
277
-	/**
278
-	 * @param string $name
279
-	 */
280
-	protected function dropTable($name) {
281
-		$this->connection->exec('DROP TABLE ' . $this->connection->quoteIdentifier($name));
282
-	}
283
-
284
-	/**
285
-	 * @param $statement
286
-	 * @return string
287
-	 */
288
-	protected function convertStatementToScript($statement) {
289
-		$script = $statement . ';';
290
-		$script .= PHP_EOL;
291
-		$script .= PHP_EOL;
292
-		return $script;
293
-	}
294
-
295
-	protected function getFilterExpression() {
296
-		return '/^' . preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')) . '/';
297
-	}
298
-
299
-	protected function emit($sql, $step, $max) {
300
-		if ($this->noEmit) {
301
-			return;
302
-		}
303
-		if(is_null($this->dispatcher)) {
304
-			return;
305
-		}
306
-		$this->dispatcher->dispatch('\OC\DB\Migrator::executeSql', new GenericEvent($sql, [$step+1, $max]));
307
-	}
308
-
309
-	private function emitCheckStep($tableName, $step, $max) {
310
-		if(is_null($this->dispatcher)) {
311
-			return;
312
-		}
313
-		$this->dispatcher->dispatch('\OC\DB\Migrator::checkTable', new GenericEvent($tableName, [$step+1, $max]));
314
-	}
47
+    /** @var \Doctrine\DBAL\Connection */
48
+    protected $connection;
49
+
50
+    /** @var ISecureRandom */
51
+    private $random;
52
+
53
+    /** @var IConfig */
54
+    protected $config;
55
+
56
+    /** @var EventDispatcherInterface  */
57
+    private $dispatcher;
58
+
59
+    /** @var bool */
60
+    private $noEmit = false;
61
+
62
+    /**
63
+     * @param \Doctrine\DBAL\Connection|Connection $connection
64
+     * @param ISecureRandom $random
65
+     * @param IConfig $config
66
+     * @param EventDispatcherInterface $dispatcher
67
+     */
68
+    public function __construct(\Doctrine\DBAL\Connection $connection,
69
+                                ISecureRandom $random,
70
+                                IConfig $config,
71
+                                EventDispatcherInterface $dispatcher = null) {
72
+        $this->connection = $connection;
73
+        $this->random = $random;
74
+        $this->config = $config;
75
+        $this->dispatcher = $dispatcher;
76
+    }
77
+
78
+    /**
79
+     * @param \Doctrine\DBAL\Schema\Schema $targetSchema
80
+     */
81
+    public function migrate(Schema $targetSchema) {
82
+        $this->noEmit = true;
83
+        $this->applySchema($targetSchema);
84
+    }
85
+
86
+    /**
87
+     * @param \Doctrine\DBAL\Schema\Schema $targetSchema
88
+     * @return string
89
+     */
90
+    public function generateChangeScript(Schema $targetSchema) {
91
+        $schemaDiff = $this->getDiff($targetSchema, $this->connection);
92
+
93
+        $script = '';
94
+        $sqls = $schemaDiff->toSql($this->connection->getDatabasePlatform());
95
+        foreach ($sqls as $sql) {
96
+            $script .= $this->convertStatementToScript($sql);
97
+        }
98
+
99
+        return $script;
100
+    }
101
+
102
+    /**
103
+     * @param Schema $targetSchema
104
+     * @throws \OC\DB\MigrationException
105
+     */
106
+    public function checkMigrate(Schema $targetSchema) {
107
+        $this->noEmit = true;
108
+        /**@var \Doctrine\DBAL\Schema\Table[] $tables */
109
+        $tables = $targetSchema->getTables();
110
+        $filterExpression = $this->getFilterExpression();
111
+        $this->connection->getConfiguration()->
112
+            setFilterSchemaAssetsExpression($filterExpression);
113
+        $existingTables = $this->connection->getSchemaManager()->listTableNames();
114
+
115
+        $step = 0;
116
+        foreach ($tables as $table) {
117
+            if (strpos($table->getName(), '.')) {
118
+                list(, $tableName) = explode('.', $table->getName());
119
+            } else {
120
+                $tableName = $table->getName();
121
+            }
122
+            $this->emitCheckStep($tableName, $step++, count($tables));
123
+            // don't need to check for new tables
124
+            if (array_search($tableName, $existingTables) !== false) {
125
+                $this->checkTableMigrate($table);
126
+            }
127
+        }
128
+    }
129
+
130
+    /**
131
+     * Create a unique name for the temporary table
132
+     *
133
+     * @param string $name
134
+     * @return string
135
+     */
136
+    protected function generateTemporaryTableName($name) {
137
+        return $this->config->getSystemValue('dbtableprefix', 'oc_') . $name . '_' . $this->random->generate(13, ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_DIGITS);
138
+    }
139
+
140
+    /**
141
+     * Check the migration of a table on a copy so we can detect errors before messing with the real table
142
+     *
143
+     * @param \Doctrine\DBAL\Schema\Table $table
144
+     * @throws \OC\DB\MigrationException
145
+     */
146
+    protected function checkTableMigrate(Table $table) {
147
+        $name = $table->getName();
148
+        $tmpName = $this->generateTemporaryTableName($name);
149
+
150
+        $this->copyTable($name, $tmpName);
151
+
152
+        //create the migration schema for the temporary table
153
+        $tmpTable = $this->renameTableSchema($table, $tmpName);
154
+        $schemaConfig = new SchemaConfig();
155
+        $schemaConfig->setName($this->connection->getDatabase());
156
+        $schema = new Schema(array($tmpTable), array(), $schemaConfig);
157
+
158
+        try {
159
+            $this->applySchema($schema);
160
+            $this->dropTable($tmpName);
161
+        } catch (DBALException $e) {
162
+            // pgsql needs to commit it's failed transaction before doing anything else
163
+            if ($this->connection->isTransactionActive()) {
164
+                $this->connection->commit();
165
+            }
166
+            $this->dropTable($tmpName);
167
+            throw new MigrationException($table->getName(), $e->getMessage());
168
+        }
169
+    }
170
+
171
+    /**
172
+     * @param \Doctrine\DBAL\Schema\Table $table
173
+     * @param string $newName
174
+     * @return \Doctrine\DBAL\Schema\Table
175
+     */
176
+    protected function renameTableSchema(Table $table, $newName) {
177
+        /**
178
+         * @var \Doctrine\DBAL\Schema\Index[] $indexes
179
+         */
180
+        $indexes = $table->getIndexes();
181
+        $newIndexes = array();
182
+        foreach ($indexes as $index) {
183
+            if ($index->isPrimary()) {
184
+                // do not rename primary key
185
+                $indexName = $index->getName();
186
+            } else {
187
+                // avoid conflicts in index names
188
+                $indexName = $this->config->getSystemValue('dbtableprefix', 'oc_') . $this->random->generate(13, ISecureRandom::CHAR_LOWER);
189
+            }
190
+            $newIndexes[] = new Index($indexName, $index->getColumns(), $index->isUnique(), $index->isPrimary());
191
+        }
192
+
193
+        // foreign keys are not supported so we just set it to an empty array
194
+        return new Table($newName, $table->getColumns(), $newIndexes, array(), 0, $table->getOptions());
195
+    }
196
+
197
+    public function createSchema() {
198
+        $filterExpression = $this->getFilterExpression();
199
+        $this->connection->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
200
+        return $this->connection->getSchemaManager()->createSchema();
201
+    }
202
+
203
+    /**
204
+     * @param Schema $targetSchema
205
+     * @param \Doctrine\DBAL\Connection $connection
206
+     * @return \Doctrine\DBAL\Schema\SchemaDiff
207
+     * @throws DBALException
208
+     */
209
+    protected function getDiff(Schema $targetSchema, \Doctrine\DBAL\Connection $connection) {
210
+        // adjust varchar columns with a length higher then getVarcharMaxLength to clob
211
+        foreach ($targetSchema->getTables() as $table) {
212
+            foreach ($table->getColumns() as $column) {
213
+                if ($column->getType() instanceof StringType) {
214
+                    if ($column->getLength() > $connection->getDatabasePlatform()->getVarcharMaxLength()) {
215
+                        $column->setType(Type::getType('text'));
216
+                        $column->setLength(null);
217
+                    }
218
+                }
219
+            }
220
+        }
221
+
222
+        $filterExpression = $this->getFilterExpression();
223
+        $this->connection->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
224
+        $sourceSchema = $connection->getSchemaManager()->createSchema();
225
+
226
+        // remove tables we don't know about
227
+        /** @var $table \Doctrine\DBAL\Schema\Table */
228
+        foreach ($sourceSchema->getTables() as $table) {
229
+            if (!$targetSchema->hasTable($table->getName())) {
230
+                $sourceSchema->dropTable($table->getName());
231
+            }
232
+        }
233
+        // remove sequences we don't know about
234
+        foreach ($sourceSchema->getSequences() as $table) {
235
+            if (!$targetSchema->hasSequence($table->getName())) {
236
+                $sourceSchema->dropSequence($table->getName());
237
+            }
238
+        }
239
+
240
+        $comparator = new Comparator();
241
+        return $comparator->compare($sourceSchema, $targetSchema);
242
+    }
243
+
244
+    /**
245
+     * @param \Doctrine\DBAL\Schema\Schema $targetSchema
246
+     * @param \Doctrine\DBAL\Connection $connection
247
+     */
248
+    protected function applySchema(Schema $targetSchema, \Doctrine\DBAL\Connection $connection = null) {
249
+        if (is_null($connection)) {
250
+            $connection = $this->connection;
251
+        }
252
+
253
+        $schemaDiff = $this->getDiff($targetSchema, $connection);
254
+
255
+        $connection->beginTransaction();
256
+        $sqls = $schemaDiff->toSql($connection->getDatabasePlatform());
257
+        $step = 0;
258
+        foreach ($sqls as $sql) {
259
+            $this->emit($sql, $step++, count($sqls));
260
+            $connection->query($sql);
261
+        }
262
+        $connection->commit();
263
+    }
264
+
265
+    /**
266
+     * @param string $sourceName
267
+     * @param string $targetName
268
+     */
269
+    protected function copyTable($sourceName, $targetName) {
270
+        $quotedSource = $this->connection->quoteIdentifier($sourceName);
271
+        $quotedTarget = $this->connection->quoteIdentifier($targetName);
272
+
273
+        $this->connection->exec('CREATE TABLE ' . $quotedTarget . ' (LIKE ' . $quotedSource . ')');
274
+        $this->connection->exec('INSERT INTO ' . $quotedTarget . ' SELECT * FROM ' . $quotedSource);
275
+    }
276
+
277
+    /**
278
+     * @param string $name
279
+     */
280
+    protected function dropTable($name) {
281
+        $this->connection->exec('DROP TABLE ' . $this->connection->quoteIdentifier($name));
282
+    }
283
+
284
+    /**
285
+     * @param $statement
286
+     * @return string
287
+     */
288
+    protected function convertStatementToScript($statement) {
289
+        $script = $statement . ';';
290
+        $script .= PHP_EOL;
291
+        $script .= PHP_EOL;
292
+        return $script;
293
+    }
294
+
295
+    protected function getFilterExpression() {
296
+        return '/^' . preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')) . '/';
297
+    }
298
+
299
+    protected function emit($sql, $step, $max) {
300
+        if ($this->noEmit) {
301
+            return;
302
+        }
303
+        if(is_null($this->dispatcher)) {
304
+            return;
305
+        }
306
+        $this->dispatcher->dispatch('\OC\DB\Migrator::executeSql', new GenericEvent($sql, [$step+1, $max]));
307
+    }
308
+
309
+    private function emitCheckStep($tableName, $step, $max) {
310
+        if(is_null($this->dispatcher)) {
311
+            return;
312
+        }
313
+        $this->dispatcher->dispatch('\OC\DB\Migrator::checkTable', new GenericEvent($tableName, [$step+1, $max]));
314
+    }
315 315
 }
Please login to merge, or discard this patch.
lib/private/DB/SQLiteMigrator.php 2 patches
Indentation   +53 added lines, -53 removed lines patch added patch discarded remove patch
@@ -32,62 +32,62 @@
 block discarded – undo
32 32
 
33 33
 class SQLiteMigrator extends Migrator {
34 34
 
35
-	/**
36
-	 * @param \Doctrine\DBAL\Schema\Schema $targetSchema
37
-	 * @throws \OC\DB\MigrationException
38
-	 *
39
-	 * For sqlite we simple make a copy of the entire database, and test the migration on that
40
-	 */
41
-	public function checkMigrate(\Doctrine\DBAL\Schema\Schema $targetSchema) {
42
-		$dbFile = $this->connection->getDatabase();
43
-		$tmpFile = $this->buildTempDatabase();
44
-		copy($dbFile, $tmpFile);
35
+    /**
36
+     * @param \Doctrine\DBAL\Schema\Schema $targetSchema
37
+     * @throws \OC\DB\MigrationException
38
+     *
39
+     * For sqlite we simple make a copy of the entire database, and test the migration on that
40
+     */
41
+    public function checkMigrate(\Doctrine\DBAL\Schema\Schema $targetSchema) {
42
+        $dbFile = $this->connection->getDatabase();
43
+        $tmpFile = $this->buildTempDatabase();
44
+        copy($dbFile, $tmpFile);
45 45
 
46
-		$connectionParams = array(
47
-			'path' => $tmpFile,
48
-			'driver' => 'pdo_sqlite',
49
-		);
50
-		$conn = \Doctrine\DBAL\DriverManager::getConnection($connectionParams);
51
-		try {
52
-			$this->applySchema($targetSchema, $conn);
53
-			$conn->close();
54
-			unlink($tmpFile);
55
-		} catch (DBALException $e) {
56
-			$conn->close();
57
-			unlink($tmpFile);
58
-			throw new MigrationException('', $e->getMessage());
59
-		}
60
-	}
46
+        $connectionParams = array(
47
+            'path' => $tmpFile,
48
+            'driver' => 'pdo_sqlite',
49
+        );
50
+        $conn = \Doctrine\DBAL\DriverManager::getConnection($connectionParams);
51
+        try {
52
+            $this->applySchema($targetSchema, $conn);
53
+            $conn->close();
54
+            unlink($tmpFile);
55
+        } catch (DBALException $e) {
56
+            $conn->close();
57
+            unlink($tmpFile);
58
+            throw new MigrationException('', $e->getMessage());
59
+        }
60
+    }
61 61
 
62
-	/**
63
-	 * @return string
64
-	 */
65
-	private function buildTempDatabase() {
66
-		$dataDir = $this->config->getSystemValue("datadirectory", \OC::$SERVERROOT . '/data');
67
-		$tmpFile = uniqid("oc_");
68
-		return "$dataDir/$tmpFile.db";
69
-	}
62
+    /**
63
+     * @return string
64
+     */
65
+    private function buildTempDatabase() {
66
+        $dataDir = $this->config->getSystemValue("datadirectory", \OC::$SERVERROOT . '/data');
67
+        $tmpFile = uniqid("oc_");
68
+        return "$dataDir/$tmpFile.db";
69
+    }
70 70
 
71
-	/**
72
-	 * @param Schema $targetSchema
73
-	 * @param \Doctrine\DBAL\Connection $connection
74
-	 * @return \Doctrine\DBAL\Schema\SchemaDiff
75
-	 */
76
-	protected function getDiff(Schema $targetSchema, \Doctrine\DBAL\Connection $connection) {
77
-		$platform = $connection->getDatabasePlatform();
78
-		$platform->registerDoctrineTypeMapping('tinyint unsigned', 'integer');
79
-		$platform->registerDoctrineTypeMapping('smallint unsigned', 'integer');
80
-		$platform->registerDoctrineTypeMapping('varchar ', 'string');
71
+    /**
72
+     * @param Schema $targetSchema
73
+     * @param \Doctrine\DBAL\Connection $connection
74
+     * @return \Doctrine\DBAL\Schema\SchemaDiff
75
+     */
76
+    protected function getDiff(Schema $targetSchema, \Doctrine\DBAL\Connection $connection) {
77
+        $platform = $connection->getDatabasePlatform();
78
+        $platform->registerDoctrineTypeMapping('tinyint unsigned', 'integer');
79
+        $platform->registerDoctrineTypeMapping('smallint unsigned', 'integer');
80
+        $platform->registerDoctrineTypeMapping('varchar ', 'string');
81 81
 
82
-		// with sqlite autoincrement columns is of type integer
83
-		foreach ($targetSchema->getTables() as $table) {
84
-			foreach ($table->getColumns() as $column) {
85
-				if ($column->getType() instanceof BigIntType && $column->getAutoincrement()) {
86
-					$column->setType(Type::getType('integer'));
87
-				}
88
-			}
89
-		}
82
+        // with sqlite autoincrement columns is of type integer
83
+        foreach ($targetSchema->getTables() as $table) {
84
+            foreach ($table->getColumns() as $column) {
85
+                if ($column->getType() instanceof BigIntType && $column->getAutoincrement()) {
86
+                    $column->setType(Type::getType('integer'));
87
+                }
88
+            }
89
+        }
90 90
 
91
-		return parent::getDiff($targetSchema, $connection);
92
-	}
91
+        return parent::getDiff($targetSchema, $connection);
92
+    }
93 93
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -63,7 +63,7 @@
 block discarded – undo
63 63
 	 * @return string
64 64
 	 */
65 65
 	private function buildTempDatabase() {
66
-		$dataDir = $this->config->getSystemValue("datadirectory", \OC::$SERVERROOT . '/data');
66
+		$dataDir = $this->config->getSystemValue("datadirectory", \OC::$SERVERROOT.'/data');
67 67
 		$tmpFile = uniqid("oc_");
68 68
 		return "$dataDir/$tmpFile.db";
69 69
 	}
Please login to merge, or discard this patch.
lib/private/App/AppStore/Version/Version.php 1 patch
Indentation   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -22,31 +22,31 @@
 block discarded – undo
22 22
 namespace OC\App\AppStore\Version;
23 23
 
24 24
 class Version {
25
-	/** @var string */
26
-	private $minVersion;
27
-	/** @var string */
28
-	private $maxVersion;
25
+    /** @var string */
26
+    private $minVersion;
27
+    /** @var string */
28
+    private $maxVersion;
29 29
 
30
-	/**
31
-	 * @param string $minVersion
32
-	 * @param string $maxVersion
33
-	 */
34
-	public function __construct($minVersion, $maxVersion) {
35
-		$this->minVersion = $minVersion;
36
-		$this->maxVersion = $maxVersion;
37
-	}
30
+    /**
31
+     * @param string $minVersion
32
+     * @param string $maxVersion
33
+     */
34
+    public function __construct($minVersion, $maxVersion) {
35
+        $this->minVersion = $minVersion;
36
+        $this->maxVersion = $maxVersion;
37
+    }
38 38
 
39
-	/**
40
-	 * @return string
41
-	 */
42
-	public function getMinimumVersion() {
43
-		return $this->minVersion;
44
-	}
39
+    /**
40
+     * @return string
41
+     */
42
+    public function getMinimumVersion() {
43
+        return $this->minVersion;
44
+    }
45 45
 
46
-	/**
47
-	 * @return string
48
-	 */
49
-	public function getMaximumVersion() {
50
-		return $this->maxVersion;
51
-	}
46
+    /**
47
+     * @return string
48
+     */
49
+    public function getMaximumVersion() {
50
+        return $this->maxVersion;
51
+    }
52 52
 }
Please login to merge, or discard this patch.
lib/private/App/CodeChecker/NodeVisitor.php 2 patches
Spacing   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -102,7 +102,7 @@  discard block
 block discarded – undo
102 102
 
103 103
 	public function enterNode(Node $node) {
104 104
 		if ($this->checkEqualOperatorUsage && $node instanceof Node\Expr\BinaryOp\Equal) {
105
-			$this->errors[]= [
105
+			$this->errors[] = [
106 106
 				'disallowedToken' => '==',
107 107
 				'errorCode' => CodeChecker::OP_OPERATOR_USAGE_DISCOURAGED,
108 108
 				'line' => $node->getLine(),
@@ -110,7 +110,7 @@  discard block
 block discarded – undo
110 110
 			];
111 111
 		}
112 112
 		if ($this->checkEqualOperatorUsage && $node instanceof Node\Expr\BinaryOp\NotEqual) {
113
-			$this->errors[]= [
113
+			$this->errors[] = [
114 114
 				'disallowedToken' => '!=',
115 115
 				'errorCode' => CodeChecker::OP_OPERATOR_USAGE_DISCOURAGED,
116 116
 				'line' => $node->getLine(),
@@ -214,28 +214,28 @@  discard block
 block discarded – undo
214 214
 		$alias = strtolower($alias);
215 215
 
216 216
 		foreach ($this->blackListedClassNames as $blackListedAlias => $blackListedClassName) {
217
-			if (strpos($blackListedClassName, $name . '\\') === 0) {
217
+			if (strpos($blackListedClassName, $name.'\\') === 0) {
218 218
 				$aliasedClassName = str_replace($name, $alias, $blackListedClassName);
219 219
 				$this->blackListedClassNames[$aliasedClassName] = $blackListedClassName;
220 220
 			}
221 221
 		}
222 222
 
223 223
 		foreach ($this->blackListedConstants as $blackListedAlias => $blackListedConstant) {
224
-			if (strpos($blackListedConstant, $name . '\\') === 0 || strpos($blackListedConstant, $name . '::') === 0) {
224
+			if (strpos($blackListedConstant, $name.'\\') === 0 || strpos($blackListedConstant, $name.'::') === 0) {
225 225
 				$aliasedConstantName = str_replace($name, $alias, $blackListedConstant);
226 226
 				$this->blackListedConstants[$aliasedConstantName] = $blackListedConstant;
227 227
 			}
228 228
 		}
229 229
 
230 230
 		foreach ($this->blackListedFunctions as $blackListedAlias => $blackListedFunction) {
231
-			if (strpos($blackListedFunction, $name . '\\') === 0 || strpos($blackListedFunction, $name . '::') === 0) {
231
+			if (strpos($blackListedFunction, $name.'\\') === 0 || strpos($blackListedFunction, $name.'::') === 0) {
232 232
 				$aliasedFunctionName = str_replace($name, $alias, $blackListedFunction);
233 233
 				$this->blackListedFunctions[$aliasedFunctionName] = $blackListedFunction;
234 234
 			}
235 235
 		}
236 236
 
237 237
 		foreach ($this->blackListedMethods as $blackListedAlias => $blackListedMethod) {
238
-			if (strpos($blackListedMethod, $name . '\\') === 0 || strpos($blackListedMethod, $name . '::') === 0) {
238
+			if (strpos($blackListedMethod, $name.'\\') === 0 || strpos($blackListedMethod, $name.'::') === 0) {
239 239
 				$aliasedMethodName = str_replace($name, $alias, $blackListedMethod);
240 240
 				$this->blackListedMethods[$aliasedMethodName] = $blackListedMethod;
241 241
 			}
@@ -246,7 +246,7 @@  discard block
 block discarded – undo
246 246
 		$lowerName = strtolower($name);
247 247
 
248 248
 		if (isset($this->blackListedClassNames[$lowerName])) {
249
-			$this->errors[]= [
249
+			$this->errors[] = [
250 250
 				'disallowedToken' => $name,
251 251
 				'errorCode' => $errorCode,
252 252
 				'line' => $node->getLine(),
@@ -256,11 +256,11 @@  discard block
 block discarded – undo
256 256
 	}
257 257
 
258 258
 	private function checkBlackListConstant($class, $constantName, Node $node) {
259
-		$name = $class . '::' . $constantName;
259
+		$name = $class.'::'.$constantName;
260 260
 		$lowerName = strtolower($name);
261 261
 
262 262
 		if (isset($this->blackListedConstants[$lowerName])) {
263
-			$this->errors[]= [
263
+			$this->errors[] = [
264 264
 				'disallowedToken' => $name,
265 265
 				'errorCode' => CodeChecker::CLASS_CONST_FETCH_NOT_ALLOWED,
266 266
 				'line' => $node->getLine(),
@@ -270,11 +270,11 @@  discard block
 block discarded – undo
270 270
 	}
271 271
 
272 272
 	private function checkBlackListFunction($class, $functionName, Node $node) {
273
-		$name = $class . '::' . $functionName;
273
+		$name = $class.'::'.$functionName;
274 274
 		$lowerName = strtolower($name);
275 275
 
276 276
 		if (isset($this->blackListedFunctions[$lowerName])) {
277
-			$this->errors[]= [
277
+			$this->errors[] = [
278 278
 				'disallowedToken' => $name,
279 279
 				'errorCode' => CodeChecker::STATIC_CALL_NOT_ALLOWED,
280 280
 				'line' => $node->getLine(),
@@ -284,11 +284,11 @@  discard block
 block discarded – undo
284 284
 	}
285 285
 
286 286
 	private function checkBlackListMethod($class, $functionName, Node $node) {
287
-		$name = $class . '::' . $functionName;
287
+		$name = $class.'::'.$functionName;
288 288
 		$lowerName = strtolower($name);
289 289
 
290 290
 		if (isset($this->blackListedMethods[$lowerName])) {
291
-			$this->errors[]= [
291
+			$this->errors[] = [
292 292
 				'disallowedToken' => $name,
293 293
 				'errorCode' => CodeChecker::CLASS_METHOD_CALL_NOT_ALLOWED,
294 294
 				'line' => $node->getLine(),
Please login to merge, or discard this patch.
Indentation   +276 added lines, -276 removed lines patch added patch discarded remove patch
@@ -29,280 +29,280 @@
 block discarded – undo
29 29
 use PhpParser\NodeVisitorAbstract;
30 30
 
31 31
 class NodeVisitor extends NodeVisitorAbstract {
32
-	/** @var ICheck */
33
-	protected $list;
34
-
35
-	/** @var string */
36
-	protected $blackListDescription;
37
-	/** @var string[] */
38
-	protected $blackListedClassNames;
39
-	/** @var string[] */
40
-	protected $blackListedConstants;
41
-	/** @var string[] */
42
-	protected $blackListedFunctions;
43
-	/** @var string[] */
44
-	protected $blackListedMethods;
45
-	/** @var bool */
46
-	protected $checkEqualOperatorUsage;
47
-	/** @var string[] */
48
-	protected $errorMessages;
49
-
50
-	/**
51
-	 * @param ICheck $list
52
-	 */
53
-	public function __construct(ICheck $list) {
54
-		$this->list = $list;
55
-
56
-		$this->blackListedClassNames = [];
57
-		foreach ($list->getClasses() as $class => $blackListInfo) {
58
-			if (is_numeric($class) && is_string($blackListInfo)) {
59
-				$class = $blackListInfo;
60
-				$blackListInfo = null;
61
-			}
62
-
63
-			$class = strtolower($class);
64
-			$this->blackListedClassNames[$class] = $class;
65
-		}
66
-
67
-		$this->blackListedConstants = [];
68
-		foreach ($list->getConstants() as $constantName => $blackListInfo) {
69
-			$constantName = strtolower($constantName);
70
-			$this->blackListedConstants[$constantName] = $constantName;
71
-		}
72
-
73
-		$this->blackListedFunctions = [];
74
-		foreach ($list->getFunctions() as $functionName => $blackListInfo) {
75
-			$functionName = strtolower($functionName);
76
-			$this->blackListedFunctions[$functionName] = $functionName;
77
-		}
78
-
79
-		$this->blackListedMethods = [];
80
-		foreach ($list->getMethods() as $functionName => $blackListInfo) {
81
-			$functionName = strtolower($functionName);
82
-			$this->blackListedMethods[$functionName] = $functionName;
83
-		}
84
-
85
-		$this->checkEqualOperatorUsage = $list->checkStrongComparisons();
86
-
87
-		$this->errorMessages = [
88
-			CodeChecker::CLASS_EXTENDS_NOT_ALLOWED => "%s class must not be extended",
89
-			CodeChecker::CLASS_IMPLEMENTS_NOT_ALLOWED => "%s interface must not be implemented",
90
-			CodeChecker::STATIC_CALL_NOT_ALLOWED => "Static method of %s class must not be called",
91
-			CodeChecker::CLASS_CONST_FETCH_NOT_ALLOWED => "Constant of %s class must not not be fetched",
92
-			CodeChecker::CLASS_NEW_NOT_ALLOWED => "%s class must not be instantiated",
93
-			CodeChecker::CLASS_USE_NOT_ALLOWED => "%s class must not be imported with a use statement",
94
-			CodeChecker::CLASS_METHOD_CALL_NOT_ALLOWED => "Method of %s class must not be called",
95
-
96
-			CodeChecker::OP_OPERATOR_USAGE_DISCOURAGED => "is discouraged",
97
-		];
98
-	}
99
-
100
-	/** @var array */
101
-	public $errors = [];
102
-
103
-	public function enterNode(Node $node) {
104
-		if ($this->checkEqualOperatorUsage && $node instanceof Node\Expr\BinaryOp\Equal) {
105
-			$this->errors[]= [
106
-				'disallowedToken' => '==',
107
-				'errorCode' => CodeChecker::OP_OPERATOR_USAGE_DISCOURAGED,
108
-				'line' => $node->getLine(),
109
-				'reason' => $this->buildReason('==', CodeChecker::OP_OPERATOR_USAGE_DISCOURAGED)
110
-			];
111
-		}
112
-		if ($this->checkEqualOperatorUsage && $node instanceof Node\Expr\BinaryOp\NotEqual) {
113
-			$this->errors[]= [
114
-				'disallowedToken' => '!=',
115
-				'errorCode' => CodeChecker::OP_OPERATOR_USAGE_DISCOURAGED,
116
-				'line' => $node->getLine(),
117
-				'reason' => $this->buildReason('!=', CodeChecker::OP_OPERATOR_USAGE_DISCOURAGED)
118
-			];
119
-		}
120
-		if ($node instanceof Node\Stmt\Class_) {
121
-			if (!is_null($node->extends)) {
122
-				$this->checkBlackList($node->extends->toString(), CodeChecker::CLASS_EXTENDS_NOT_ALLOWED, $node);
123
-			}
124
-			foreach ($node->implements as $implements) {
125
-				$this->checkBlackList($implements->toString(), CodeChecker::CLASS_IMPLEMENTS_NOT_ALLOWED, $node);
126
-			}
127
-		}
128
-		if ($node instanceof Node\Expr\StaticCall) {
129
-			if (!is_null($node->class)) {
130
-				if ($node->class instanceof Name) {
131
-					$this->checkBlackList($node->class->toString(), CodeChecker::STATIC_CALL_NOT_ALLOWED, $node);
132
-
133
-					$this->checkBlackListFunction($node->class->toString(), $node->name, $node);
134
-					$this->checkBlackListMethod($node->class->toString(), $node->name, $node);
135
-				}
136
-
137
-				if ($node->class instanceof Node\Expr\Variable) {
138
-					/**
139
-					 * TODO: find a way to detect something like this:
140
-					 *       $c = "OC_API";
141
-					 *       $n = $c::call();
142
-					 */
143
-					// $this->checkBlackListMethod($node->class->..., $node->name, $node);
144
-				}
145
-			}
146
-		}
147
-		if ($node instanceof Node\Expr\MethodCall) {
148
-			if (!is_null($node->var)) {
149
-				if ($node->var instanceof Node\Expr\Variable) {
150
-					/**
151
-					 * TODO: find a way to detect something like this:
152
-					 *       $c = new OC_API();
153
-					 *       $n = $c::call();
154
-					 *       $n = $c->call();
155
-					 */
156
-					// $this->checkBlackListMethod($node->var->..., $node->name, $node);
157
-				}
158
-			}
159
-		}
160
-		if ($node instanceof Node\Expr\ClassConstFetch) {
161
-			if (!is_null($node->class)) {
162
-				if ($node->class instanceof Name) {
163
-					$this->checkBlackList($node->class->toString(), CodeChecker::CLASS_CONST_FETCH_NOT_ALLOWED, $node);
164
-				}
165
-				if ($node->class instanceof Node\Expr\Variable || $node->class instanceof Node\Expr\PropertyFetch) {
166
-					/**
167
-					 * TODO: find a way to detect something like this:
168
-					 *       $c = "OC_API";
169
-					 *       $n = $i::ADMIN_AUTH;
170
-					 */
171
-				} else {
172
-					$this->checkBlackListConstant($node->class->toString(), $node->name, $node);
173
-				}
174
-			}
175
-		}
176
-		if ($node instanceof Node\Expr\New_) {
177
-			if (!is_null($node->class)) {
178
-				if ($node->class instanceof Name) {
179
-					$this->checkBlackList($node->class->toString(), CodeChecker::CLASS_NEW_NOT_ALLOWED, $node);
180
-				}
181
-				if ($node->class instanceof Node\Expr\Variable) {
182
-					/**
183
-					 * TODO: find a way to detect something like this:
184
-					 *       $c = "OC_API";
185
-					 *       $n = new $i;
186
-					 */
187
-				}
188
-			}
189
-		}
190
-		if ($node instanceof Node\Stmt\UseUse) {
191
-			$this->checkBlackList($node->name->toString(), CodeChecker::CLASS_USE_NOT_ALLOWED, $node);
192
-			if ($node->alias) {
193
-				$this->addUseNameToBlackList($node->name->toString(), $node->alias);
194
-			} else {
195
-				$this->addUseNameToBlackList($node->name->toString(), $node->name->getLast());
196
-			}
197
-		}
198
-	}
199
-
200
-	/**
201
-	 * Check whether an alias was introduced for a namespace of a blacklisted class
202
-	 *
203
-	 * Example:
204
-	 * - Blacklist entry:      OCP\AppFramework\IApi
205
-	 * - Name:                 OCP\AppFramework
206
-	 * - Alias:                OAF
207
-	 * =>  new blacklist entry:  OAF\IApi
208
-	 *
209
-	 * @param string $name
210
-	 * @param string $alias
211
-	 */
212
-	private function addUseNameToBlackList($name, $alias) {
213
-		$name = strtolower($name);
214
-		$alias = strtolower($alias);
215
-
216
-		foreach ($this->blackListedClassNames as $blackListedAlias => $blackListedClassName) {
217
-			if (strpos($blackListedClassName, $name . '\\') === 0) {
218
-				$aliasedClassName = str_replace($name, $alias, $blackListedClassName);
219
-				$this->blackListedClassNames[$aliasedClassName] = $blackListedClassName;
220
-			}
221
-		}
222
-
223
-		foreach ($this->blackListedConstants as $blackListedAlias => $blackListedConstant) {
224
-			if (strpos($blackListedConstant, $name . '\\') === 0 || strpos($blackListedConstant, $name . '::') === 0) {
225
-				$aliasedConstantName = str_replace($name, $alias, $blackListedConstant);
226
-				$this->blackListedConstants[$aliasedConstantName] = $blackListedConstant;
227
-			}
228
-		}
229
-
230
-		foreach ($this->blackListedFunctions as $blackListedAlias => $blackListedFunction) {
231
-			if (strpos($blackListedFunction, $name . '\\') === 0 || strpos($blackListedFunction, $name . '::') === 0) {
232
-				$aliasedFunctionName = str_replace($name, $alias, $blackListedFunction);
233
-				$this->blackListedFunctions[$aliasedFunctionName] = $blackListedFunction;
234
-			}
235
-		}
236
-
237
-		foreach ($this->blackListedMethods as $blackListedAlias => $blackListedMethod) {
238
-			if (strpos($blackListedMethod, $name . '\\') === 0 || strpos($blackListedMethod, $name . '::') === 0) {
239
-				$aliasedMethodName = str_replace($name, $alias, $blackListedMethod);
240
-				$this->blackListedMethods[$aliasedMethodName] = $blackListedMethod;
241
-			}
242
-		}
243
-	}
244
-
245
-	private function checkBlackList($name, $errorCode, Node $node) {
246
-		$lowerName = strtolower($name);
247
-
248
-		if (isset($this->blackListedClassNames[$lowerName])) {
249
-			$this->errors[]= [
250
-				'disallowedToken' => $name,
251
-				'errorCode' => $errorCode,
252
-				'line' => $node->getLine(),
253
-				'reason' => $this->buildReason($this->blackListedClassNames[$lowerName], $errorCode)
254
-			];
255
-		}
256
-	}
257
-
258
-	private function checkBlackListConstant($class, $constantName, Node $node) {
259
-		$name = $class . '::' . $constantName;
260
-		$lowerName = strtolower($name);
261
-
262
-		if (isset($this->blackListedConstants[$lowerName])) {
263
-			$this->errors[]= [
264
-				'disallowedToken' => $name,
265
-				'errorCode' => CodeChecker::CLASS_CONST_FETCH_NOT_ALLOWED,
266
-				'line' => $node->getLine(),
267
-				'reason' => $this->buildReason($this->blackListedConstants[$lowerName], CodeChecker::CLASS_CONST_FETCH_NOT_ALLOWED)
268
-			];
269
-		}
270
-	}
271
-
272
-	private function checkBlackListFunction($class, $functionName, Node $node) {
273
-		$name = $class . '::' . $functionName;
274
-		$lowerName = strtolower($name);
275
-
276
-		if (isset($this->blackListedFunctions[$lowerName])) {
277
-			$this->errors[]= [
278
-				'disallowedToken' => $name,
279
-				'errorCode' => CodeChecker::STATIC_CALL_NOT_ALLOWED,
280
-				'line' => $node->getLine(),
281
-				'reason' => $this->buildReason($this->blackListedFunctions[$lowerName], CodeChecker::STATIC_CALL_NOT_ALLOWED)
282
-			];
283
-		}
284
-	}
285
-
286
-	private function checkBlackListMethod($class, $functionName, Node $node) {
287
-		$name = $class . '::' . $functionName;
288
-		$lowerName = strtolower($name);
289
-
290
-		if (isset($this->blackListedMethods[$lowerName])) {
291
-			$this->errors[]= [
292
-				'disallowedToken' => $name,
293
-				'errorCode' => CodeChecker::CLASS_METHOD_CALL_NOT_ALLOWED,
294
-				'line' => $node->getLine(),
295
-				'reason' => $this->buildReason($this->blackListedMethods[$lowerName], CodeChecker::CLASS_METHOD_CALL_NOT_ALLOWED)
296
-			];
297
-		}
298
-	}
299
-
300
-	private function buildReason($name, $errorCode) {
301
-		if (isset($this->errorMessages[$errorCode])) {
302
-			$desc = $this->list->getDescription($errorCode, $name);
303
-			return sprintf($this->errorMessages[$errorCode], $desc);
304
-		}
305
-
306
-		return "$name usage not allowed - error: $errorCode";
307
-	}
32
+    /** @var ICheck */
33
+    protected $list;
34
+
35
+    /** @var string */
36
+    protected $blackListDescription;
37
+    /** @var string[] */
38
+    protected $blackListedClassNames;
39
+    /** @var string[] */
40
+    protected $blackListedConstants;
41
+    /** @var string[] */
42
+    protected $blackListedFunctions;
43
+    /** @var string[] */
44
+    protected $blackListedMethods;
45
+    /** @var bool */
46
+    protected $checkEqualOperatorUsage;
47
+    /** @var string[] */
48
+    protected $errorMessages;
49
+
50
+    /**
51
+     * @param ICheck $list
52
+     */
53
+    public function __construct(ICheck $list) {
54
+        $this->list = $list;
55
+
56
+        $this->blackListedClassNames = [];
57
+        foreach ($list->getClasses() as $class => $blackListInfo) {
58
+            if (is_numeric($class) && is_string($blackListInfo)) {
59
+                $class = $blackListInfo;
60
+                $blackListInfo = null;
61
+            }
62
+
63
+            $class = strtolower($class);
64
+            $this->blackListedClassNames[$class] = $class;
65
+        }
66
+
67
+        $this->blackListedConstants = [];
68
+        foreach ($list->getConstants() as $constantName => $blackListInfo) {
69
+            $constantName = strtolower($constantName);
70
+            $this->blackListedConstants[$constantName] = $constantName;
71
+        }
72
+
73
+        $this->blackListedFunctions = [];
74
+        foreach ($list->getFunctions() as $functionName => $blackListInfo) {
75
+            $functionName = strtolower($functionName);
76
+            $this->blackListedFunctions[$functionName] = $functionName;
77
+        }
78
+
79
+        $this->blackListedMethods = [];
80
+        foreach ($list->getMethods() as $functionName => $blackListInfo) {
81
+            $functionName = strtolower($functionName);
82
+            $this->blackListedMethods[$functionName] = $functionName;
83
+        }
84
+
85
+        $this->checkEqualOperatorUsage = $list->checkStrongComparisons();
86
+
87
+        $this->errorMessages = [
88
+            CodeChecker::CLASS_EXTENDS_NOT_ALLOWED => "%s class must not be extended",
89
+            CodeChecker::CLASS_IMPLEMENTS_NOT_ALLOWED => "%s interface must not be implemented",
90
+            CodeChecker::STATIC_CALL_NOT_ALLOWED => "Static method of %s class must not be called",
91
+            CodeChecker::CLASS_CONST_FETCH_NOT_ALLOWED => "Constant of %s class must not not be fetched",
92
+            CodeChecker::CLASS_NEW_NOT_ALLOWED => "%s class must not be instantiated",
93
+            CodeChecker::CLASS_USE_NOT_ALLOWED => "%s class must not be imported with a use statement",
94
+            CodeChecker::CLASS_METHOD_CALL_NOT_ALLOWED => "Method of %s class must not be called",
95
+
96
+            CodeChecker::OP_OPERATOR_USAGE_DISCOURAGED => "is discouraged",
97
+        ];
98
+    }
99
+
100
+    /** @var array */
101
+    public $errors = [];
102
+
103
+    public function enterNode(Node $node) {
104
+        if ($this->checkEqualOperatorUsage && $node instanceof Node\Expr\BinaryOp\Equal) {
105
+            $this->errors[]= [
106
+                'disallowedToken' => '==',
107
+                'errorCode' => CodeChecker::OP_OPERATOR_USAGE_DISCOURAGED,
108
+                'line' => $node->getLine(),
109
+                'reason' => $this->buildReason('==', CodeChecker::OP_OPERATOR_USAGE_DISCOURAGED)
110
+            ];
111
+        }
112
+        if ($this->checkEqualOperatorUsage && $node instanceof Node\Expr\BinaryOp\NotEqual) {
113
+            $this->errors[]= [
114
+                'disallowedToken' => '!=',
115
+                'errorCode' => CodeChecker::OP_OPERATOR_USAGE_DISCOURAGED,
116
+                'line' => $node->getLine(),
117
+                'reason' => $this->buildReason('!=', CodeChecker::OP_OPERATOR_USAGE_DISCOURAGED)
118
+            ];
119
+        }
120
+        if ($node instanceof Node\Stmt\Class_) {
121
+            if (!is_null($node->extends)) {
122
+                $this->checkBlackList($node->extends->toString(), CodeChecker::CLASS_EXTENDS_NOT_ALLOWED, $node);
123
+            }
124
+            foreach ($node->implements as $implements) {
125
+                $this->checkBlackList($implements->toString(), CodeChecker::CLASS_IMPLEMENTS_NOT_ALLOWED, $node);
126
+            }
127
+        }
128
+        if ($node instanceof Node\Expr\StaticCall) {
129
+            if (!is_null($node->class)) {
130
+                if ($node->class instanceof Name) {
131
+                    $this->checkBlackList($node->class->toString(), CodeChecker::STATIC_CALL_NOT_ALLOWED, $node);
132
+
133
+                    $this->checkBlackListFunction($node->class->toString(), $node->name, $node);
134
+                    $this->checkBlackListMethod($node->class->toString(), $node->name, $node);
135
+                }
136
+
137
+                if ($node->class instanceof Node\Expr\Variable) {
138
+                    /**
139
+                     * TODO: find a way to detect something like this:
140
+                     *       $c = "OC_API";
141
+                     *       $n = $c::call();
142
+                     */
143
+                    // $this->checkBlackListMethod($node->class->..., $node->name, $node);
144
+                }
145
+            }
146
+        }
147
+        if ($node instanceof Node\Expr\MethodCall) {
148
+            if (!is_null($node->var)) {
149
+                if ($node->var instanceof Node\Expr\Variable) {
150
+                    /**
151
+                     * TODO: find a way to detect something like this:
152
+                     *       $c = new OC_API();
153
+                     *       $n = $c::call();
154
+                     *       $n = $c->call();
155
+                     */
156
+                    // $this->checkBlackListMethod($node->var->..., $node->name, $node);
157
+                }
158
+            }
159
+        }
160
+        if ($node instanceof Node\Expr\ClassConstFetch) {
161
+            if (!is_null($node->class)) {
162
+                if ($node->class instanceof Name) {
163
+                    $this->checkBlackList($node->class->toString(), CodeChecker::CLASS_CONST_FETCH_NOT_ALLOWED, $node);
164
+                }
165
+                if ($node->class instanceof Node\Expr\Variable || $node->class instanceof Node\Expr\PropertyFetch) {
166
+                    /**
167
+                     * TODO: find a way to detect something like this:
168
+                     *       $c = "OC_API";
169
+                     *       $n = $i::ADMIN_AUTH;
170
+                     */
171
+                } else {
172
+                    $this->checkBlackListConstant($node->class->toString(), $node->name, $node);
173
+                }
174
+            }
175
+        }
176
+        if ($node instanceof Node\Expr\New_) {
177
+            if (!is_null($node->class)) {
178
+                if ($node->class instanceof Name) {
179
+                    $this->checkBlackList($node->class->toString(), CodeChecker::CLASS_NEW_NOT_ALLOWED, $node);
180
+                }
181
+                if ($node->class instanceof Node\Expr\Variable) {
182
+                    /**
183
+                     * TODO: find a way to detect something like this:
184
+                     *       $c = "OC_API";
185
+                     *       $n = new $i;
186
+                     */
187
+                }
188
+            }
189
+        }
190
+        if ($node instanceof Node\Stmt\UseUse) {
191
+            $this->checkBlackList($node->name->toString(), CodeChecker::CLASS_USE_NOT_ALLOWED, $node);
192
+            if ($node->alias) {
193
+                $this->addUseNameToBlackList($node->name->toString(), $node->alias);
194
+            } else {
195
+                $this->addUseNameToBlackList($node->name->toString(), $node->name->getLast());
196
+            }
197
+        }
198
+    }
199
+
200
+    /**
201
+     * Check whether an alias was introduced for a namespace of a blacklisted class
202
+     *
203
+     * Example:
204
+     * - Blacklist entry:      OCP\AppFramework\IApi
205
+     * - Name:                 OCP\AppFramework
206
+     * - Alias:                OAF
207
+     * =>  new blacklist entry:  OAF\IApi
208
+     *
209
+     * @param string $name
210
+     * @param string $alias
211
+     */
212
+    private function addUseNameToBlackList($name, $alias) {
213
+        $name = strtolower($name);
214
+        $alias = strtolower($alias);
215
+
216
+        foreach ($this->blackListedClassNames as $blackListedAlias => $blackListedClassName) {
217
+            if (strpos($blackListedClassName, $name . '\\') === 0) {
218
+                $aliasedClassName = str_replace($name, $alias, $blackListedClassName);
219
+                $this->blackListedClassNames[$aliasedClassName] = $blackListedClassName;
220
+            }
221
+        }
222
+
223
+        foreach ($this->blackListedConstants as $blackListedAlias => $blackListedConstant) {
224
+            if (strpos($blackListedConstant, $name . '\\') === 0 || strpos($blackListedConstant, $name . '::') === 0) {
225
+                $aliasedConstantName = str_replace($name, $alias, $blackListedConstant);
226
+                $this->blackListedConstants[$aliasedConstantName] = $blackListedConstant;
227
+            }
228
+        }
229
+
230
+        foreach ($this->blackListedFunctions as $blackListedAlias => $blackListedFunction) {
231
+            if (strpos($blackListedFunction, $name . '\\') === 0 || strpos($blackListedFunction, $name . '::') === 0) {
232
+                $aliasedFunctionName = str_replace($name, $alias, $blackListedFunction);
233
+                $this->blackListedFunctions[$aliasedFunctionName] = $blackListedFunction;
234
+            }
235
+        }
236
+
237
+        foreach ($this->blackListedMethods as $blackListedAlias => $blackListedMethod) {
238
+            if (strpos($blackListedMethod, $name . '\\') === 0 || strpos($blackListedMethod, $name . '::') === 0) {
239
+                $aliasedMethodName = str_replace($name, $alias, $blackListedMethod);
240
+                $this->blackListedMethods[$aliasedMethodName] = $blackListedMethod;
241
+            }
242
+        }
243
+    }
244
+
245
+    private function checkBlackList($name, $errorCode, Node $node) {
246
+        $lowerName = strtolower($name);
247
+
248
+        if (isset($this->blackListedClassNames[$lowerName])) {
249
+            $this->errors[]= [
250
+                'disallowedToken' => $name,
251
+                'errorCode' => $errorCode,
252
+                'line' => $node->getLine(),
253
+                'reason' => $this->buildReason($this->blackListedClassNames[$lowerName], $errorCode)
254
+            ];
255
+        }
256
+    }
257
+
258
+    private function checkBlackListConstant($class, $constantName, Node $node) {
259
+        $name = $class . '::' . $constantName;
260
+        $lowerName = strtolower($name);
261
+
262
+        if (isset($this->blackListedConstants[$lowerName])) {
263
+            $this->errors[]= [
264
+                'disallowedToken' => $name,
265
+                'errorCode' => CodeChecker::CLASS_CONST_FETCH_NOT_ALLOWED,
266
+                'line' => $node->getLine(),
267
+                'reason' => $this->buildReason($this->blackListedConstants[$lowerName], CodeChecker::CLASS_CONST_FETCH_NOT_ALLOWED)
268
+            ];
269
+        }
270
+    }
271
+
272
+    private function checkBlackListFunction($class, $functionName, Node $node) {
273
+        $name = $class . '::' . $functionName;
274
+        $lowerName = strtolower($name);
275
+
276
+        if (isset($this->blackListedFunctions[$lowerName])) {
277
+            $this->errors[]= [
278
+                'disallowedToken' => $name,
279
+                'errorCode' => CodeChecker::STATIC_CALL_NOT_ALLOWED,
280
+                'line' => $node->getLine(),
281
+                'reason' => $this->buildReason($this->blackListedFunctions[$lowerName], CodeChecker::STATIC_CALL_NOT_ALLOWED)
282
+            ];
283
+        }
284
+    }
285
+
286
+    private function checkBlackListMethod($class, $functionName, Node $node) {
287
+        $name = $class . '::' . $functionName;
288
+        $lowerName = strtolower($name);
289
+
290
+        if (isset($this->blackListedMethods[$lowerName])) {
291
+            $this->errors[]= [
292
+                'disallowedToken' => $name,
293
+                'errorCode' => CodeChecker::CLASS_METHOD_CALL_NOT_ALLOWED,
294
+                'line' => $node->getLine(),
295
+                'reason' => $this->buildReason($this->blackListedMethods[$lowerName], CodeChecker::CLASS_METHOD_CALL_NOT_ALLOWED)
296
+            ];
297
+        }
298
+    }
299
+
300
+    private function buildReason($name, $errorCode) {
301
+        if (isset($this->errorMessages[$errorCode])) {
302
+            $desc = $this->list->getDescription($errorCode, $name);
303
+            return sprintf($this->errorMessages[$errorCode], $desc);
304
+        }
305
+
306
+        return "$name usage not allowed - error: $errorCode";
307
+    }
308 308
 }
Please login to merge, or discard this patch.
lib/private/App/CodeChecker/AbstractCheck.php 1 patch
Indentation   +114 added lines, -114 removed lines patch added patch discarded remove patch
@@ -23,118 +23,118 @@
 block discarded – undo
23 23
 namespace OC\App\CodeChecker;
24 24
 
25 25
 abstract class AbstractCheck implements ICheck {
26
-	/** @var ICheck */
27
-	protected $check;
28
-
29
-	/**
30
-	 * @param ICheck $check
31
-	 */
32
-	public function __construct(ICheck $check) {
33
-		$this->check = $check;
34
-	}
35
-
36
-	/**
37
-	 * @param int $errorCode
38
-	 * @param string $errorObject
39
-	 * @return string
40
-	 */
41
-	public function getDescription($errorCode, $errorObject) {
42
-		switch ($errorCode) {
43
-			case CodeChecker::STATIC_CALL_NOT_ALLOWED:
44
-				$functions = $this->getLocalFunctions();
45
-				$functions = array_change_key_case($functions, CASE_LOWER);
46
-				if (isset($functions[$errorObject])) {
47
-					return $this->getLocalDescription();
48
-				}
49
-			// no break;
50
-			case CodeChecker::CLASS_EXTENDS_NOT_ALLOWED:
51
-			case CodeChecker::CLASS_IMPLEMENTS_NOT_ALLOWED:
52
-			case CodeChecker::CLASS_NEW_NOT_ALLOWED:
53
-			case CodeChecker::CLASS_USE_NOT_ALLOWED:
54
-				$classes = $this->getLocalClasses();
55
-				$classes = array_change_key_case($classes, CASE_LOWER);
56
-				if (isset($classes[$errorObject])) {
57
-					return $this->getLocalDescription();
58
-				}
59
-			break;
60
-
61
-			case CodeChecker::CLASS_CONST_FETCH_NOT_ALLOWED:
62
-				$constants = $this->getLocalConstants();
63
-				$constants = array_change_key_case($constants, CASE_LOWER);
64
-				if (isset($constants[$errorObject])) {
65
-					return $this->getLocalDescription();
66
-				}
67
-			break;
68
-
69
-			case CodeChecker::CLASS_METHOD_CALL_NOT_ALLOWED:
70
-				$methods = $this->getLocalMethods();
71
-				$methods = array_change_key_case($methods, CASE_LOWER);
72
-				if (isset($methods[$errorObject])) {
73
-					return $this->getLocalDescription();
74
-				}
75
-			break;
76
-		}
77
-
78
-		return $this->check->getDescription($errorCode, $errorObject);
79
-	}
80
-
81
-	/**
82
-	 * @return string
83
-	 */
84
-	abstract protected function getLocalDescription();
85
-
86
-	/**
87
-	 * @return array
88
-	 */
89
-	abstract protected function getLocalClasses();
90
-
91
-	/**
92
-	 * @return array
93
-	 */
94
-	abstract protected function getLocalConstants();
95
-
96
-	/**
97
-	 * @return array
98
-	 */
99
-	abstract protected function getLocalFunctions();
100
-
101
-	/**
102
-	 * @return array
103
-	 */
104
-	abstract protected function getLocalMethods();
105
-
106
-	/**
107
-	 * @return array E.g.: `'ClassName' => 'oc version',`
108
-	 */
109
-	public function getClasses() {
110
-		return array_merge($this->getLocalClasses(), $this->check->getClasses());
111
-	}
112
-
113
-	/**
114
-	 * @return array E.g.: `'ClassName::CONSTANT_NAME' => 'oc version',`
115
-	 */
116
-	public function getConstants() {
117
-		return array_merge($this->getLocalConstants(), $this->check->getConstants());
118
-	}
119
-
120
-	/**
121
-	 * @return array E.g.: `'functionName' => 'oc version',`
122
-	 */
123
-	public function getFunctions() {
124
-		return array_merge($this->getLocalFunctions(), $this->check->getFunctions());
125
-	}
126
-
127
-	/**
128
-	 * @return array E.g.: `'ClassName::methodName' => 'oc version',`
129
-	 */
130
-	public function getMethods() {
131
-		return array_merge($this->getLocalMethods(), $this->check->getMethods());
132
-	}
133
-
134
-	/**
135
-	 * @return bool
136
-	 */
137
-	public function checkStrongComparisons() {
138
-		return $this->check->checkStrongComparisons();
139
-	}
26
+    /** @var ICheck */
27
+    protected $check;
28
+
29
+    /**
30
+     * @param ICheck $check
31
+     */
32
+    public function __construct(ICheck $check) {
33
+        $this->check = $check;
34
+    }
35
+
36
+    /**
37
+     * @param int $errorCode
38
+     * @param string $errorObject
39
+     * @return string
40
+     */
41
+    public function getDescription($errorCode, $errorObject) {
42
+        switch ($errorCode) {
43
+            case CodeChecker::STATIC_CALL_NOT_ALLOWED:
44
+                $functions = $this->getLocalFunctions();
45
+                $functions = array_change_key_case($functions, CASE_LOWER);
46
+                if (isset($functions[$errorObject])) {
47
+                    return $this->getLocalDescription();
48
+                }
49
+            // no break;
50
+            case CodeChecker::CLASS_EXTENDS_NOT_ALLOWED:
51
+            case CodeChecker::CLASS_IMPLEMENTS_NOT_ALLOWED:
52
+            case CodeChecker::CLASS_NEW_NOT_ALLOWED:
53
+            case CodeChecker::CLASS_USE_NOT_ALLOWED:
54
+                $classes = $this->getLocalClasses();
55
+                $classes = array_change_key_case($classes, CASE_LOWER);
56
+                if (isset($classes[$errorObject])) {
57
+                    return $this->getLocalDescription();
58
+                }
59
+            break;
60
+
61
+            case CodeChecker::CLASS_CONST_FETCH_NOT_ALLOWED:
62
+                $constants = $this->getLocalConstants();
63
+                $constants = array_change_key_case($constants, CASE_LOWER);
64
+                if (isset($constants[$errorObject])) {
65
+                    return $this->getLocalDescription();
66
+                }
67
+            break;
68
+
69
+            case CodeChecker::CLASS_METHOD_CALL_NOT_ALLOWED:
70
+                $methods = $this->getLocalMethods();
71
+                $methods = array_change_key_case($methods, CASE_LOWER);
72
+                if (isset($methods[$errorObject])) {
73
+                    return $this->getLocalDescription();
74
+                }
75
+            break;
76
+        }
77
+
78
+        return $this->check->getDescription($errorCode, $errorObject);
79
+    }
80
+
81
+    /**
82
+     * @return string
83
+     */
84
+    abstract protected function getLocalDescription();
85
+
86
+    /**
87
+     * @return array
88
+     */
89
+    abstract protected function getLocalClasses();
90
+
91
+    /**
92
+     * @return array
93
+     */
94
+    abstract protected function getLocalConstants();
95
+
96
+    /**
97
+     * @return array
98
+     */
99
+    abstract protected function getLocalFunctions();
100
+
101
+    /**
102
+     * @return array
103
+     */
104
+    abstract protected function getLocalMethods();
105
+
106
+    /**
107
+     * @return array E.g.: `'ClassName' => 'oc version',`
108
+     */
109
+    public function getClasses() {
110
+        return array_merge($this->getLocalClasses(), $this->check->getClasses());
111
+    }
112
+
113
+    /**
114
+     * @return array E.g.: `'ClassName::CONSTANT_NAME' => 'oc version',`
115
+     */
116
+    public function getConstants() {
117
+        return array_merge($this->getLocalConstants(), $this->check->getConstants());
118
+    }
119
+
120
+    /**
121
+     * @return array E.g.: `'functionName' => 'oc version',`
122
+     */
123
+    public function getFunctions() {
124
+        return array_merge($this->getLocalFunctions(), $this->check->getFunctions());
125
+    }
126
+
127
+    /**
128
+     * @return array E.g.: `'ClassName::methodName' => 'oc version',`
129
+     */
130
+    public function getMethods() {
131
+        return array_merge($this->getLocalMethods(), $this->check->getMethods());
132
+    }
133
+
134
+    /**
135
+     * @return bool
136
+     */
137
+    public function checkStrongComparisons() {
138
+        return $this->check->checkStrongComparisons();
139
+    }
140 140
 }
Please login to merge, or discard this patch.
lib/private/App/CodeChecker/EmptyCheck.php 1 patch
Indentation   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -22,47 +22,47 @@
 block discarded – undo
22 22
 namespace OC\App\CodeChecker;
23 23
 
24 24
 class EmptyCheck implements ICheck {
25
-	/**
26
-	 * @param int $errorCode
27
-	 * @param string $errorObject
28
-	 * @return string
29
-	 */
30
-	public function getDescription($errorCode, $errorObject) {
31
-		return '';
32
-	}
25
+    /**
26
+     * @param int $errorCode
27
+     * @param string $errorObject
28
+     * @return string
29
+     */
30
+    public function getDescription($errorCode, $errorObject) {
31
+        return '';
32
+    }
33 33
 
34
-	/**
35
-	 * @return array E.g.: `'ClassName' => 'oc version',`
36
-	 */
37
-	public function getClasses() {
38
-		return [];
39
-	}
34
+    /**
35
+     * @return array E.g.: `'ClassName' => 'oc version',`
36
+     */
37
+    public function getClasses() {
38
+        return [];
39
+    }
40 40
 
41
-	/**
42
-	 * @return array E.g.: `'ClassName::CONSTANT_NAME' => 'oc version',`
43
-	 */
44
-	public function getConstants() {
45
-		return [];
46
-	}
41
+    /**
42
+     * @return array E.g.: `'ClassName::CONSTANT_NAME' => 'oc version',`
43
+     */
44
+    public function getConstants() {
45
+        return [];
46
+    }
47 47
 
48
-	/**
49
-	 * @return array E.g.: `'functionName' => 'oc version',`
50
-	 */
51
-	public function getFunctions() {
52
-		return [];
53
-	}
48
+    /**
49
+     * @return array E.g.: `'functionName' => 'oc version',`
50
+     */
51
+    public function getFunctions() {
52
+        return [];
53
+    }
54 54
 
55
-	/**
56
-	 * @return array E.g.: `'ClassName::methodName' => 'oc version',`
57
-	 */
58
-	public function getMethods() {
59
-		return [];
60
-	}
55
+    /**
56
+     * @return array E.g.: `'ClassName::methodName' => 'oc version',`
57
+     */
58
+    public function getMethods() {
59
+        return [];
60
+    }
61 61
 
62
-	/**
63
-	 * @return bool
64
-	 */
65
-	public function checkStrongComparisons() {
66
-		return false;
67
-	}
62
+    /**
63
+     * @return bool
64
+     */
65
+    public function checkStrongComparisons() {
66
+        return false;
67
+    }
68 68
 }
Please login to merge, or discard this patch.
lib/private/App/CodeChecker/StrongComparisonCheck.php 1 patch
Indentation   +46 added lines, -46 removed lines patch added patch discarded remove patch
@@ -23,57 +23,57 @@
 block discarded – undo
23 23
 namespace OC\App\CodeChecker;
24 24
 
25 25
 class StrongComparisonCheck implements ICheck {
26
-	/** @var ICheck */
27
-	protected $check;
26
+    /** @var ICheck */
27
+    protected $check;
28 28
 
29
-	/**
30
-	 * @param ICheck $check
31
-	 */
32
-	public function __construct(ICheck $check) {
33
-		$this->check = $check;
34
-	}
29
+    /**
30
+     * @param ICheck $check
31
+     */
32
+    public function __construct(ICheck $check) {
33
+        $this->check = $check;
34
+    }
35 35
 
36
-	/**
37
-	 * @param int $errorCode
38
-	 * @param string $errorObject
39
-	 * @return string
40
-	 */
41
-	public function getDescription($errorCode, $errorObject) {
42
-		return $this->check->getDescription($errorCode, $errorObject);
43
-	}
36
+    /**
37
+     * @param int $errorCode
38
+     * @param string $errorObject
39
+     * @return string
40
+     */
41
+    public function getDescription($errorCode, $errorObject) {
42
+        return $this->check->getDescription($errorCode, $errorObject);
43
+    }
44 44
 
45
-	/**
46
-	 * @return array
47
-	 */
48
-	public function getClasses() {
49
-		return $this->check->getClasses();
50
-	}
45
+    /**
46
+     * @return array
47
+     */
48
+    public function getClasses() {
49
+        return $this->check->getClasses();
50
+    }
51 51
 
52
-	/**
53
-	 * @return array
54
-	 */
55
-	public function getConstants() {
56
-		return $this->check->getConstants();
57
-	}
52
+    /**
53
+     * @return array
54
+     */
55
+    public function getConstants() {
56
+        return $this->check->getConstants();
57
+    }
58 58
 
59
-	/**
60
-	 * @return array
61
-	 */
62
-	public function getFunctions() {
63
-		return $this->check->getFunctions();
64
-	}
59
+    /**
60
+     * @return array
61
+     */
62
+    public function getFunctions() {
63
+        return $this->check->getFunctions();
64
+    }
65 65
 
66
-	/**
67
-	 * @return array
68
-	 */
69
-	public function getMethods() {
70
-		return $this->check->getMethods();
71
-	}
66
+    /**
67
+     * @return array
68
+     */
69
+    public function getMethods() {
70
+        return $this->check->getMethods();
71
+    }
72 72
 
73
-	/**
74
-	 * @return bool
75
-	 */
76
-	public function checkStrongComparisons() {
77
-		return true;
78
-	}
73
+    /**
74
+     * @return bool
75
+     */
76
+    public function checkStrongComparisons() {
77
+        return true;
78
+    }
79 79
 }
Please login to merge, or discard this patch.
lib/private/App/CodeChecker/CodeChecker.php 2 patches
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -42,10 +42,10 @@  discard block
 block discarded – undo
42 42
 	const CLASS_IMPLEMENTS_NOT_ALLOWED = 1001;
43 43
 	const STATIC_CALL_NOT_ALLOWED = 1002;
44 44
 	const CLASS_CONST_FETCH_NOT_ALLOWED = 1003;
45
-	const CLASS_NEW_NOT_ALLOWED =  1004;
46
-	const OP_OPERATOR_USAGE_DISCOURAGED =  1005;
47
-	const CLASS_USE_NOT_ALLOWED =  1006;
48
-	const CLASS_METHOD_CALL_NOT_ALLOWED =  1007;
45
+	const CLASS_NEW_NOT_ALLOWED = 1004;
46
+	const OP_OPERATOR_USAGE_DISCOURAGED = 1005;
47
+	const CLASS_USE_NOT_ALLOWED = 1006;
48
+	const CLASS_METHOD_CALL_NOT_ALLOWED = 1007;
49 49
 
50 50
 	/** @var Parser */
51 51
 	private $parser;
@@ -85,13 +85,13 @@  discard block
 block discarded – undo
85 85
 		}
86 86
 
87 87
 		$excludes = array_map(function($item) use ($folder) {
88
-			return $folder . '/' . $item;
88
+			return $folder.'/'.$item;
89 89
 		}, $excludedDirectories);
90 90
 
91 91
 		$iterator = new RecursiveDirectoryIterator($folder, RecursiveDirectoryIterator::SKIP_DOTS);
92 92
 		$iterator = new RecursiveCallbackFilterIterator($iterator, function($item) use ($folder, $excludes){
93 93
 			/** @var SplFileInfo $item */
94
-			foreach($excludes as $exclude) {
94
+			foreach ($excludes as $exclude) {
95 95
 				if (substr($item->getPath(), 0, strlen($exclude)) === $exclude) {
96 96
 					return false;
97 97
 				}
Please login to merge, or discard this patch.
Indentation   +101 added lines, -101 removed lines patch added patch discarded remove patch
@@ -36,105 +36,105 @@
 block discarded – undo
36 36
 
37 37
 class CodeChecker extends BasicEmitter {
38 38
 
39
-	const CLASS_EXTENDS_NOT_ALLOWED = 1000;
40
-	const CLASS_IMPLEMENTS_NOT_ALLOWED = 1001;
41
-	const STATIC_CALL_NOT_ALLOWED = 1002;
42
-	const CLASS_CONST_FETCH_NOT_ALLOWED = 1003;
43
-	const CLASS_NEW_NOT_ALLOWED =  1004;
44
-	const OP_OPERATOR_USAGE_DISCOURAGED =  1005;
45
-	const CLASS_USE_NOT_ALLOWED =  1006;
46
-	const CLASS_METHOD_CALL_NOT_ALLOWED =  1007;
47
-
48
-	/** @var Parser */
49
-	private $parser;
50
-
51
-	/** @var ICheck */
52
-	protected $checkList;
53
-
54
-	/** @var bool */
55
-	protected $checkMigrationSchema;
56
-
57
-	public function __construct(ICheck $checkList, $checkMigrationSchema) {
58
-		$this->checkList = $checkList;
59
-		$this->checkMigrationSchema = $checkMigrationSchema;
60
-		$this->parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
61
-	}
62
-
63
-	/**
64
-	 * @param string $appId
65
-	 * @return array
66
-	 * @throws \RuntimeException if app with $appId is unknown
67
-	 */
68
-	public function analyse(string $appId): array {
69
-		$appPath = \OC_App::getAppPath($appId);
70
-		if ($appPath === false) {
71
-			throw new \RuntimeException("No app with given id <$appId> known.");
72
-		}
73
-
74
-		return $this->analyseFolder($appId, $appPath);
75
-	}
76
-
77
-	/**
78
-	 * @param string $appId
79
-	 * @param string $folder
80
-	 * @return array
81
-	 */
82
-	public function analyseFolder(string $appId, string $folder): array {
83
-		$errors = [];
84
-
85
-		$excludedDirectories = ['vendor', '3rdparty', '.git', 'l10n', 'tests', 'test', 'build'];
86
-		if ($appId === 'password_policy') {
87
-			$excludedDirectories[] = 'lists';
88
-		}
89
-
90
-		$excludes = array_map(function($item) use ($folder) {
91
-			return $folder . '/' . $item;
92
-		}, $excludedDirectories);
93
-
94
-		$iterator = new RecursiveDirectoryIterator($folder, RecursiveDirectoryIterator::SKIP_DOTS);
95
-		$iterator = new RecursiveCallbackFilterIterator($iterator, function($item) use ($folder, $excludes){
96
-			/** @var SplFileInfo $item */
97
-			foreach($excludes as $exclude) {
98
-				if (substr($item->getPath(), 0, strlen($exclude)) === $exclude) {
99
-					return false;
100
-				}
101
-			}
102
-			return true;
103
-		});
104
-		$iterator = new RecursiveIteratorIterator($iterator);
105
-		$iterator = new RegexIterator($iterator, '/^.+\.php$/i');
106
-
107
-		foreach ($iterator as $file) {
108
-			/** @var SplFileInfo $file */
109
-			$this->emit('CodeChecker', 'analyseFileBegin', [$file->getPathname()]);
110
-			$fileErrors = $this->analyseFile($file->__toString());
111
-			$this->emit('CodeChecker', 'analyseFileFinished', [$file->getPathname(), $fileErrors]);
112
-			$errors = array_merge($fileErrors, $errors);
113
-		}
114
-
115
-		return $errors;
116
-	}
117
-
118
-
119
-	/**
120
-	 * @param string $file
121
-	 * @return array
122
-	 */
123
-	public function analyseFile(string $file): array {
124
-		$code = file_get_contents($file);
125
-		$statements = $this->parser->parse($code);
126
-
127
-		$visitor = new NodeVisitor($this->checkList);
128
-		$migrationVisitor = new MigrationSchemaChecker();
129
-		$traverser = new NodeTraverser;
130
-		$traverser->addVisitor($visitor);
131
-
132
-		if ($this->checkMigrationSchema && preg_match('#^.+\\/Migration\\/Version[^\\/]{1,255}\\.php$#i', $file)) {
133
-			$traverser->addVisitor($migrationVisitor);
134
-		}
135
-
136
-		$traverser->traverse($statements);
137
-
138
-		return array_merge($visitor->errors, $migrationVisitor->errors);
139
-	}
39
+    const CLASS_EXTENDS_NOT_ALLOWED = 1000;
40
+    const CLASS_IMPLEMENTS_NOT_ALLOWED = 1001;
41
+    const STATIC_CALL_NOT_ALLOWED = 1002;
42
+    const CLASS_CONST_FETCH_NOT_ALLOWED = 1003;
43
+    const CLASS_NEW_NOT_ALLOWED =  1004;
44
+    const OP_OPERATOR_USAGE_DISCOURAGED =  1005;
45
+    const CLASS_USE_NOT_ALLOWED =  1006;
46
+    const CLASS_METHOD_CALL_NOT_ALLOWED =  1007;
47
+
48
+    /** @var Parser */
49
+    private $parser;
50
+
51
+    /** @var ICheck */
52
+    protected $checkList;
53
+
54
+    /** @var bool */
55
+    protected $checkMigrationSchema;
56
+
57
+    public function __construct(ICheck $checkList, $checkMigrationSchema) {
58
+        $this->checkList = $checkList;
59
+        $this->checkMigrationSchema = $checkMigrationSchema;
60
+        $this->parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
61
+    }
62
+
63
+    /**
64
+     * @param string $appId
65
+     * @return array
66
+     * @throws \RuntimeException if app with $appId is unknown
67
+     */
68
+    public function analyse(string $appId): array {
69
+        $appPath = \OC_App::getAppPath($appId);
70
+        if ($appPath === false) {
71
+            throw new \RuntimeException("No app with given id <$appId> known.");
72
+        }
73
+
74
+        return $this->analyseFolder($appId, $appPath);
75
+    }
76
+
77
+    /**
78
+     * @param string $appId
79
+     * @param string $folder
80
+     * @return array
81
+     */
82
+    public function analyseFolder(string $appId, string $folder): array {
83
+        $errors = [];
84
+
85
+        $excludedDirectories = ['vendor', '3rdparty', '.git', 'l10n', 'tests', 'test', 'build'];
86
+        if ($appId === 'password_policy') {
87
+            $excludedDirectories[] = 'lists';
88
+        }
89
+
90
+        $excludes = array_map(function($item) use ($folder) {
91
+            return $folder . '/' . $item;
92
+        }, $excludedDirectories);
93
+
94
+        $iterator = new RecursiveDirectoryIterator($folder, RecursiveDirectoryIterator::SKIP_DOTS);
95
+        $iterator = new RecursiveCallbackFilterIterator($iterator, function($item) use ($folder, $excludes){
96
+            /** @var SplFileInfo $item */
97
+            foreach($excludes as $exclude) {
98
+                if (substr($item->getPath(), 0, strlen($exclude)) === $exclude) {
99
+                    return false;
100
+                }
101
+            }
102
+            return true;
103
+        });
104
+        $iterator = new RecursiveIteratorIterator($iterator);
105
+        $iterator = new RegexIterator($iterator, '/^.+\.php$/i');
106
+
107
+        foreach ($iterator as $file) {
108
+            /** @var SplFileInfo $file */
109
+            $this->emit('CodeChecker', 'analyseFileBegin', [$file->getPathname()]);
110
+            $fileErrors = $this->analyseFile($file->__toString());
111
+            $this->emit('CodeChecker', 'analyseFileFinished', [$file->getPathname(), $fileErrors]);
112
+            $errors = array_merge($fileErrors, $errors);
113
+        }
114
+
115
+        return $errors;
116
+    }
117
+
118
+
119
+    /**
120
+     * @param string $file
121
+     * @return array
122
+     */
123
+    public function analyseFile(string $file): array {
124
+        $code = file_get_contents($file);
125
+        $statements = $this->parser->parse($code);
126
+
127
+        $visitor = new NodeVisitor($this->checkList);
128
+        $migrationVisitor = new MigrationSchemaChecker();
129
+        $traverser = new NodeTraverser;
130
+        $traverser->addVisitor($visitor);
131
+
132
+        if ($this->checkMigrationSchema && preg_match('#^.+\\/Migration\\/Version[^\\/]{1,255}\\.php$#i', $file)) {
133
+            $traverser->addVisitor($migrationVisitor);
134
+        }
135
+
136
+        $traverser->traverse($statements);
137
+
138
+        return array_merge($visitor->errors, $migrationVisitor->errors);
139
+    }
140 140
 }
Please login to merge, or discard this patch.