From caacb6c261140cd8f86ba5e430d2d9af217eae45 Mon Sep 17 00:00:00 2001
From: Julius Haertl <jus@bitgrid.net>
Date: Thu, 17 Nov 2016 12:30:52 +0100
Subject: [PATCH] Expose getAppPath to public API

Signed-off-by: Julius Haertl <jus@bitgrid.net>
---
 lib/private/App/AppManager.php              | 16 +++++++++++
 lib/public/App/AppPathNotFoundException.php | 31 +++++++++++++++++++++
 lib/public/App/IAppManager.php              | 10 +++++++
 tests/lib/App/ManagerTest.php               | 10 +++++++
 4 files changed, 67 insertions(+)
 create mode 100644 lib/public/App/AppPathNotFoundException.php

diff --git a/lib/private/App/AppManager.php b/lib/private/App/AppManager.php
index 55fd575e129..fca5c9b87ac 100644
--- a/lib/private/App/AppManager.php
+++ b/lib/private/App/AppManager.php
@@ -31,6 +31,7 @@
 
 namespace OC\App;
 
+use OCP\App\AppPathNotFoundException;
 use OCP\App\IAppManager;
 use OCP\App\ManagerEvent;
 use OCP\IAppConfig;
@@ -265,6 +266,21 @@ class AppManager implements IAppManager {
 		$this->clearAppsCache();
 	}
 
+	/**
+	 * Get the directory for the given app.
+	 *
+	 * @param string $appId
+	 * @return string
+	 * @throws AppPathNotFoundException if app folder can't be found
+	 */
+	public function getAppPath($appId) {
+		$appPath = \OC_App::getAppPath($appId);
+		if($appPath === false) {
+			throw new AppPathNotFoundException('Could not find path for ' . $appId);
+		}
+		return $appPath;
+	}
+
 	/**
 	 * Clear the cached list of apps when enabling/disabling an app
 	 */
diff --git a/lib/public/App/AppPathNotFoundException.php b/lib/public/App/AppPathNotFoundException.php
new file mode 100644
index 00000000000..071eb2f8377
--- /dev/null
+++ b/lib/public/App/AppPathNotFoundException.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Julius HÃĪrtl <jus@bitgrid.net>
+ *
+ * @author Julius HÃĪrtl <jus@bitgrid.net>
+ *
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCP\App;
+
+/**
+ * Class AppPathNotFoundException
+ *
+ * @package OCP\App
+ * @since 11.0.0
+ */
+class AppPathNotFoundException extends \Exception {}
\ No newline at end of file
diff --git a/lib/public/App/IAppManager.php b/lib/public/App/IAppManager.php
index 44990b7c47c..057a964ce0a 100644
--- a/lib/public/App/IAppManager.php
+++ b/lib/public/App/IAppManager.php
@@ -78,6 +78,16 @@ interface IAppManager {
 	 */
 	public function disableApp($appId);
 
+	/**
+	 * Get the directory for the given app.
+	 *
+	 * @param string $appId
+	 * @return string
+	 * @since 11.0.0
+	 * @throws AppPathNotFoundException
+	 */
+	public function getAppPath($appId);
+
 	/**
 	 * List all apps enabled for a user
 	 *
diff --git a/tests/lib/App/ManagerTest.php b/tests/lib/App/ManagerTest.php
index e04f7c82375..3dbcb8a5609 100644
--- a/tests/lib/App/ManagerTest.php
+++ b/tests/lib/App/ManagerTest.php
@@ -11,6 +11,7 @@ namespace Test\App;
 
 use OC\Group\Group;
 use OC\User\User;
+use OCP\App\AppPathNotFoundException;
 use Test\TestCase;
 
 /**
@@ -260,6 +261,15 @@ class ManagerTest extends TestCase {
 		$this->assertFalse($this->manager->isEnabledForUser('test', $user));
 	}
 
+	public function testGetAppPath() {
+		$this->assertEquals(\OC::$SERVERROOT . '/apps/files', $this->manager->getAppPath('files'));
+	}
+
+	public function testGetAppPathFail() {
+		$this->expectException(AppPathNotFoundException::class);
+		$this->manager->getAppPath('testnotexisting');
+	}
+
 	public function testIsEnabledForUserEnabledForGroup() {
 		$user = $this->newUser('user1');
 		$this->groupManager->expects($this->once())
-- 
GitLab