/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /** * The controller for editing or creating sharing profiles. */ angular.module('manage').controller('manageSharingProfileController', ['$scope', '$injector', function manageSharingProfileController($scope, $injector) { // Required types var ManagementPermissions = $injector.get('ManagementPermissions'); var SharingProfile = $injector.get('SharingProfile'); var PermissionSet = $injector.get('PermissionSet'); var Protocol = $injector.get('Protocol'); // Required services var $location = $injector.get('$location'); var $q = $injector.get('$q'); var $routeParams = $injector.get('$routeParams'); var authenticationService = $injector.get('authenticationService'); var connectionService = $injector.get('connectionService'); var permissionService = $injector.get('permissionService'); var requestService = $injector.get('requestService'); var schemaService = $injector.get('schemaService'); var sharingProfileService = $injector.get('sharingProfileService'); /** * The unique identifier of the data source containing the sharing profile * being edited. * * @type String */ $scope.selectedDataSource = $routeParams.dataSource; /** * The identifier of the original sharing profile from which this sharing * profile is being cloned. Only valid if this is a new sharing profile. * * @type String */ var cloneSourceIdentifier = $location.search().clone; /** * The identifier of the sharing profile being edited. If a new sharing * profile is being created, this will not be defined. * * @type String */ var identifier = $routeParams.id; /** * Map of protocol name to corresponding Protocol object. * * @type Object. */ $scope.protocols = null; /** * The sharing profile being modified. * * @type SharingProfile */ $scope.sharingProfile = null; /** * The parameter name/value pairs associated with the sharing profile being * modified. * * @type Object. */ $scope.parameters = null; /** * The management-related actions that the current user may perform on the * sharing profile currently being created/modified, or null if the current * user's permissions have not yet been loaded. * * @type ManagementPermissions */ $scope.managementPermissions = null; /** * All available sharing profile attributes. This is only the set of * attribute definitions, organized as logical groupings of attributes, not * attribute values. * * @type Form[] */ $scope.attributes = null; /** * Returns whether critical data has completed being loaded. * * @returns {Boolean} * true if enough data has been loaded for the user interface to be * useful, false otherwise. */ $scope.isLoaded = function isLoaded() { return $scope.protocols !== null && $scope.sharingProfile !== null && $scope.primaryConnection !== null && $scope.parameters !== null && $scope.managementPermissions !== null && $scope.attributes !== null; }; /** * Loads the data associated with the sharing profile having the given * identifier, preparing the interface for making modifications to that * existing sharing profile. * * @param {String} dataSource * The unique identifier of the data source containing the sharing * profile to load. * * @param {String} identifier * The identifier of the sharing profile to load. * * @returns {Promise} * A promise which is resolved when the interface has been prepared for * editing the given sharing profile. */ var loadExistingSharingProfile = function loadExistingSharingProfile(dataSource, identifier) { return $q.all({ sharingProfile : sharingProfileService.getSharingProfile(dataSource, identifier), parameters : sharingProfileService.getSharingProfileParameters(dataSource, identifier) }) .then(function sharingProfileDataRetrieved(values) { $scope.sharingProfile = values.sharingProfile; $scope.parameters = values.parameters; // Load connection object for associated primary connection return connectionService.getConnection( dataSource, values.sharingProfile.primaryConnectionIdentifier ) .then(function connectionRetrieved(connection) { $scope.primaryConnection = connection; }); }); }; /** * Loads the data associated with the sharing profile having the given * identifier, preparing the interface for cloning that existing * sharing profile. * * @param {String} dataSource * The unique identifier of the data source containing the sharing * profile to be cloned. * * @param {String} identifier * The identifier of the sharing profile being cloned. * * @returns {Promise} * A promise which is resolved when the interface has been prepared for * cloning the given sharing profile. */ var loadClonedSharingProfile = function loadClonedSharingProfile(dataSource, identifier) { return $q.all({ sharingProfile : sharingProfileService.getSharingProfile(dataSource, identifier), parameters : sharingProfileService.getSharingProfileParameters(dataSource, identifier) }) .then(function sharingProfileDataRetrieved(values) { $scope.sharingProfile = values.sharingProfile; $scope.parameters = values.parameters; // Clear the identifier field because this sharing profile is new delete $scope.sharingProfile.identifier; // Load connection object for associated primary connection return connectionService.getConnection( dataSource, values.sharingProfile.primaryConnectionIdentifier ) .then(function connectionRetrieved(connection) { $scope.primaryConnection = connection; }); }); }; /** * Loads skeleton sharing profile data, preparing the interface for * creating a new sharing profile. * * @returns {Promise} * A promise which is resolved when the interface has been prepared for * creating a new sharing profile. */ var loadSkeletonSharingProfile = function loadSkeletonSharingProfile() { // Use skeleton sharing profile object with no associated parameters $scope.sharingProfile = new SharingProfile({ primaryConnectionIdentifier : $location.search().parent }); $scope.parameters = {}; return $q.resolve(); }; /** * Loads the data required for performing the management task requested * through the route parameters given at load time, automatically preparing * the interface for editing an existing sharing profile, cloning an * existing sharing profile, or creating an entirely new sharing profile. * * @returns {Promise} * A promise which is resolved when the interface has been prepared * for performing the requested management task. */ var loadRequestedSharingProfile = function loadRequestedSharingProfile() { // If we are editing an existing sharing profile, pull its data if (identifier) return loadExistingSharingProfile($scope.selectedDataSource, identifier); // If we are cloning an existing sharing profile, pull its data instead if (cloneSourceIdentifier) return loadClonedSharingProfile($scope.selectedDataSource, cloneSourceIdentifier); // If we are creating a new sharing profile, populate skeleton sharing // profile data return loadSkeletonSharingProfile(); }; // Query the user's permissions for the current sharing profile $q.all({ sharingProfileData : loadRequestedSharingProfile(), attributes : schemaService.getSharingProfileAttributes($scope.selectedDataSource), protocols : schemaService.getProtocols($scope.selectedDataSource), permissions : permissionService.getEffectivePermissions($scope.selectedDataSource, authenticationService.getCurrentUsername()) }) .then(function sharingProfileDataRetrieved(values) { $scope.attributes = values.attributes; $scope.protocols = values.protocols; $scope.managementPermissions = ManagementPermissions.fromPermissionSet( values.permissions, PermissionSet.SystemPermissionType.CREATE_CONNECTION, PermissionSet.hasConnectionPermission, identifier); }, requestService.WARN); /** * @borrows Protocol.getNamespace */ $scope.getNamespace = Protocol.getNamespace; /** * Cancels all pending edits, returning to the main list of connections * within the selected data source. */ $scope.returnToConnectionList = function returnToConnectionList() { $location.url('/settings/' + encodeURIComponent($scope.selectedDataSource) + '/connections'); }; /** * Cancels all pending edits, opening an edit page for a new sharing profile * which is prepopulated with the data from the sharing profile currently * being edited. */ $scope.cloneSharingProfile = function cloneSharingProfile() { $location.path('/manage/' + encodeURIComponent($scope.selectedDataSource) + '/sharingProfiles').search('clone', identifier); }; /** * Saves the current sharing profile, creating a new sharing profile or * updating the existing sharing profile, returning a promise which is * resolved if the save operation succeeds and rejected if the save * operation fails. * * @returns {Promise} * A promise which is resolved if the save operation succeeds and is * rejected with an {@link Error} if the save operation fails. */ $scope.saveSharingProfile = function saveSharingProfile() { $scope.sharingProfile.parameters = $scope.parameters; // Save the sharing profile return sharingProfileService.saveSharingProfile($scope.selectedDataSource, $scope.sharingProfile); }; /** * Deletes the current sharing profile, returning a promise which is * resolved if the delete operation succeeds and rejected if the delete * operation fails. * * @returns {Promise} * A promise which is resolved if the delete operation succeeds and is * rejected with an {@link Error} if the delete operation fails. */ $scope.deleteSharingProfile = function deleteSharingProfile() { return sharingProfileService.deleteSharingProfile($scope.selectedDataSource, $scope.sharingProfile); }; }]);