From d26d354ff9a0d86188f9bc25e3e485fee8d60039 Mon Sep 17 00:00:00 2001
From: James Muehlner
Date: Wed, 25 Mar 2015 22:38:01 -0700
Subject: [PATCH] GUAC-1138 Migrate to FilterPattern class.
---
.../controllers/manageSessionsController.js | 46 ++------
.../app/manage/templates/manageSessions.html | 3 +-
.../webapp/app/manage/types/FilterPattern.js | 106 ++++++++++++++++++
3 files changed, 120 insertions(+), 35 deletions(-)
create mode 100644 guacamole/src/main/webapp/app/manage/types/FilterPattern.js
diff --git a/guacamole/src/main/webapp/app/manage/controllers/manageSessionsController.js b/guacamole/src/main/webapp/app/manage/controllers/manageSessionsController.js
index 892c6d244..aa81a16ff 100644
--- a/guacamole/src/main/webapp/app/manage/controllers/manageSessionsController.js
+++ b/guacamole/src/main/webapp/app/manage/controllers/manageSessionsController.js
@@ -29,6 +29,7 @@ angular.module('manage').controller('manageSessionsController', ['$scope', '$inj
// Required types
var ActiveConnectionWrapper = $injector.get('ActiveConnectionWrapper');
var ConnectionGroup = $injector.get('ConnectionGroup');
+ var FilterPattern = $injector.get('FilterPattern');
var StableSort = $injector.get('StableSort');
// Required services
@@ -61,6 +62,13 @@ angular.module('manage').controller('manageSessionsController', ['$scope', '$inj
*/
$scope.filterSearchString = null;
+ /**
+ * The pattern object to use when filtering active sessions.
+ *
+ * @type FilterPattern
+ */
+ $scope.filterPattern = new FilterPattern();
+
/**
* StableSort instance which maintains the sort order of the visible
* connection wrappers.
@@ -353,39 +361,9 @@ angular.module('manage').controller('manageSessionsController', ['$scope', '$inj
};
- /**
- * A predicate to be used for filtering the active sessions based on a plain
- * text search string. A wrapper will be considered a match iff the search string
- * appears (case insensitive) in the connection name, username, or remote host.
- *
- * @param {ActiveConnectionWrapper} wrapper
- * The wrapper to match against the search string..
- *
- * @returns {Boolean}
- * true if the wrapper matches the specified search string, false otherwise.
- */
- $scope.globalFilterPredicate = function globalFilterPredicate(wrapper) {
-
- // If no search term is provided, always consider it a match
- if (!$scope.filterSearchString)
- return true;
-
- // Convert to lower case for case insensitive matching
- var searchString = $scope.filterSearchString.toLowerCase();
-
- // Check to see if the search string matches the connection name
- if (wrapper.name.toLowerCase().indexOf(searchString) !== -1)
- return true;
-
- // Check to see if the search string matches the username
- if (wrapper.activeConnection.username.toLowerCase().indexOf(searchString) !== -1)
- return true;
-
- // Check to see if the search string matches the remote host
- if (wrapper.activeConnection.remoteHost.toLowerCase().indexOf(searchString) !== -1)
- return true;
-
- return false;
- };
+ // Recompile the filter pattern when changed
+ $scope.$watch('filterSearchString', function recompilePredicate(searchString) {
+ $scope.filterPattern.compile(searchString);
+ });
}]);
diff --git a/guacamole/src/main/webapp/app/manage/templates/manageSessions.html b/guacamole/src/main/webapp/app/manage/templates/manageSessions.html
index f925d6e00..26fc52b6c 100644
--- a/guacamole/src/main/webapp/app/manage/templates/manageSessions.html
+++ b/guacamole/src/main/webapp/app/manage/templates/manageSessions.html
@@ -82,7 +82,8 @@ THE SOFTWARE.
-
+
\ No newline at end of file
diff --git a/guacamole/src/main/webapp/app/manage/types/FilterPattern.js b/guacamole/src/main/webapp/app/manage/types/FilterPattern.js
new file mode 100644
index 000000000..2aaeddc2e
--- /dev/null
+++ b/guacamole/src/main/webapp/app/manage/types/FilterPattern.js
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2015 Glyptodon LLC
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * A service for defining the FilterPattern class.
+ */
+angular.module('manage').factory('FilterPattern', [
+ function defineFilterPattern() {
+
+ /**
+ * Object which handles compilation of filtering predicates as used by
+ * the Angular "filter" filter. Predicates are compiled from a user-
+ * specified search string.
+ *
+ * @constructor
+ */
+ var FilterPattern = function FilterPattern() {
+
+ /**
+ * Reference to this instance.
+ *
+ * @type FilterPattern
+ */
+ var filterPattern = this;
+
+ /**
+ * Filter predicate which simply matches everything. This function
+ * always returns true.
+ *
+ * @returns {Boolean}
+ * true.
+ */
+ var nullPredicate = function nullPredicate() {
+ return true;
+ };
+
+ /**
+ * The current filtering predicate.
+ *
+ * @type Function
+ */
+ this.predicate = nullPredicate;
+
+ /**
+ * Compiles the given pattern string, assigning the resulting filter
+ * predicate. The resulting predicate will accept only objects that
+ * match the given pattern.
+ *
+ * @param {String} pattern
+ * The pattern to compile.
+ */
+ this.compile = function compile(pattern) {
+
+ // If no pattern provided, everything matches
+ if (!pattern) {
+ filterPattern.predicate = nullPredicate;
+ return;
+ }
+
+ // Convert to lower case for case insensitive matching
+ pattern = pattern.toLowerCase();
+
+ // TODONT: Return predicate specific to a type of object this class should know nothing about
+ filterPattern.predicate = function oddlySpecificPredicate(wrapper) {
+
+ // Check to see if the search string matches the connection name
+ if (wrapper.name.toLowerCase().indexOf(pattern) !== -1)
+ return true;
+
+ // Check to see if the search string matches the username
+ if (wrapper.activeConnection.username.toLowerCase().indexOf(pattern) !== -1)
+ return true;
+
+ // Check to see if the search string matches the remote host
+ if (wrapper.activeConnection.remoteHost.toLowerCase().indexOf(pattern) !== -1)
+ return true;
+
+ return false;
+ };
+
+ };
+
+ };
+
+ return FilterPattern;
+
+}]);
\ No newline at end of file