http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/1bb1e2b6/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.spec.js
new file mode 100644
index 0000000..e27da78
--- /dev/null
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.spec.js
@@ -0,0 +1,766 @@
+/*
+ * 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.
+ */
+
+var NfRegistryRoutes = require('nifi-registry/nf-registry.routes.js');
+var ngCoreTesting = require('@angular/core/testing');
+var ngCommon = require('@angular/common');
+var ngRouter = require('@angular/router');
+var NfRegistry = require('nifi-registry/nf-registry.js');
+var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js');
+var NfRegistryService = 
require('nifi-registry/services/nf-registry.service.js');
+var NfPageNotFoundComponent = 
require('nifi-registry/components/page-not-found/nf-registry-page-not-found.js');
+var NfRegistryExplorer = 
require('nifi-registry/components/explorer/nf-registry-explorer.js');
+var NfRegistryAdministration = 
require('nifi-registry/components/administration/nf-registry-administration.js');
+var NfRegistryUsersAdministration = 
require('nifi-registry/components/administration/users/nf-registry-users-administration.js');
+var NfRegistryAddUser = 
require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js');
+var NfRegistryCreateNewGroup = 
require('nifi-registry/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.js');
+var NfRegistryEditBucketPolicy = 
require('nifi-registry/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js');
+var NfRegistryAddPolicyToBucket = 
require('nifi-registry/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.js');
+var NfRegistryAddUserToGroups = 
require('nifi-registry/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.js');
+var NfRegistryAddUsersToGroup = 
require('nifi-registry/components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group.js');
+var NfRegistryManageUser = 
require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js');
+var NfRegistryManageGroup = 
require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js');
+var NfRegistryManageBucket = 
require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js');
+var NfRegistryWorkflowAdministration = 
require('nifi-registry/components/administration/workflow/nf-registry-workflow-administration.js');
+var NfRegistryCreateBucket = 
require('nifi-registry/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.js');
+var NfRegistryGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js');
+var NfRegistryBucketGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js');
+var NfRegistryDropletGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js');
+var fdsCore = require('@fluid-design-system/core');
+var ngMoment = require('angular2-moment');
+var rxjs = require('rxjs/Rx');
+var ngCommonHttp = require('@angular/common/http');
+var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
+var NfStorage = require('nifi-registry/services/nf-storage.service.js');
+var NfLoginComponent = 
require('nifi-registry/components/login/nf-registry-login.js');
+var NfUserLoginComponent = 
require('nifi-registry/components/login/dialogs/nf-registry-user-login.js');
+
+describe('NfRegistryManageBucket Component', function () {
+    var comp;
+    var fixture;
+    var nfRegistryService;
+    var nfRegistryApi;
+
+    beforeEach(function () {
+        ngCoreTesting.TestBed.configureTestingModule({
+            imports: [
+                ngMoment.MomentModule,
+                ngCommonHttp.HttpClientModule,
+                fdsCore,
+                NfRegistryRoutes
+            ],
+            declarations: [
+                NfRegistry,
+                NfRegistryExplorer,
+                NfRegistryAdministration,
+                NfRegistryUsersAdministration,
+                NfRegistryManageUser,
+                NfRegistryManageGroup,
+                NfRegistryManageBucket,
+                NfRegistryWorkflowAdministration,
+                NfRegistryAddUser,
+                NfRegistryCreateBucket,
+                NfRegistryCreateNewGroup,
+                NfRegistryAddUserToGroups,
+                NfRegistryAddUsersToGroup,
+                NfRegistryAddPolicyToBucket,
+                NfRegistryEditBucketPolicy,
+                NfRegistryGridListViewer,
+                NfRegistryBucketGridListViewer,
+                NfRegistryDropletGridListViewer,
+                NfPageNotFoundComponent,
+                NfLoginComponent,
+                NfUserLoginComponent
+            ],
+            entryComponents: [
+                NfRegistryAddUser,
+                NfRegistryCreateBucket,
+                NfRegistryCreateNewGroup,
+                NfRegistryAddUserToGroups,
+                NfRegistryAddUsersToGroup,
+                NfRegistryAddPolicyToBucket,
+                NfRegistryEditBucketPolicy,
+                NfUserLoginComponent
+            ],
+            providers: [
+                NfRegistryService,
+                NfRegistryApi,
+                NfStorage,
+                {
+                    provide: ngCommonHttp.HTTP_INTERCEPTORS,
+                    useClass: NfRegistryTokenInterceptor,
+                    multi: true
+                },
+                {
+                    provide: ngCommon.APP_BASE_HREF,
+                    useValue: '/'
+                },
+                {
+                    provide: ngRouter.ActivatedRoute,
+                    useValue: {
+                        params: rxjs.Observable.of({bucketId: '123'})
+                    }
+                }
+            ]
+        });
+        fixture = 
ngCoreTesting.TestBed.createComponent(NfRegistryManageBucket);
+
+        // test instance
+        comp = fixture.componentInstance;
+
+        // from the root injector
+        nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
+        nfRegistryApi = ngCoreTesting.TestBed.get(NfRegistryApi);
+
+        // because the NfRegistryManageBucket component is a nested route 
component we need to set up the nfRegistryService service manually
+        nfRegistryService.sidenav = {
+            open: function () {
+            },
+            close: function () {
+            }
+        };
+        nfRegistryService.bucket = {
+            identifier: 999,
+            name: 'Bucket #1'
+        };
+        nfRegistryService.buckets = [nfRegistryService.bucket];
+
+        //Spy
+        spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({}));
+        spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({}));
+        spyOn(nfRegistryService, 'filterDroplets');
+    });
+
+    it('should have a defined component', ngCoreTesting.fakeAsync(function () {
+        spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            name: 'Bucket #1'
+        }));
+        spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of([
+            {
+                identifier: 'string',
+                resource: '/buckets/123',
+                action: 'READ',
+                configurable: true,
+                users: [{
+                    identity: 'User #1'
+                }],
+                userGroups: [{
+                    identity: 'Group #1'
+                }]
+            }
+        ]));
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getBucket and getPolicies 
calls
+        fixture.detectChanges();
+
+        //assertions
+        expect(comp).toBeDefined();
+        expect(nfRegistryService.bucket.name).toEqual('Bucket #1');
+        expect(nfRegistryApi.getPolicies).toHaveBeenCalled();
+
+        var getBucketCall = nfRegistryApi.getBucket.calls.first()
+        expect(getBucketCall.args[0]).toBe('123');
+    }));
+
+    it('should FAIL to get bucket by id and redirect to workflow perspective', 
ngCoreTesting.fakeAsync(function () {
+        spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 404
+        }));
+        spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 404
+        }));
+        spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
+        });
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getBucket and getPolicies 
calls
+        fixture.detectChanges();
+
+        //assertions
+        var routerCall = comp.router.navigateByUrl.calls.first();
+        
expect(routerCall.args[0]).toBe('/nifi-registry/administration/workflow');
+        expect(comp.router.navigateByUrl.calls.count()).toBe(1);
+    }));
+
+    it('should redirect to workflow perspective', 
ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            name: 'Bucket #1'
+        }));
+        spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of([
+            {
+                identifier: 'string',
+                resource: '/buckets/123',
+                action: 'READ',
+                configurable: true,
+                users: [{
+                    identity: 'User #1'
+                }],
+                userGroups: [{
+                    identity: 'Group #1'
+                }]
+            }
+        ]));
+        spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
+        });
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getBucket and getPolicies 
calls
+        fixture.detectChanges();
+
+        // the function to test
+        comp.closeSideNav();
+
+        //assertions
+        var routerCall = comp.router.navigateByUrl.calls.first();
+        
expect(routerCall.args[0]).toBe('/nifi-registry/administration/workflow');
+        expect(comp.router.navigateByUrl.calls.count()).toBe(1);
+    }));
+
+    it('should open a modal dialog UX enabling the creation of a user policy 
for a specific bucket', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(comp, 'filterPolicies').and.callFake(function () {
+        });
+        spyOn(comp.dialog, 'open').and.callFake(function () {
+            return {
+                afterClosed: function () {
+                    return rxjs.Observable.of({
+                        userOrGroup: {
+                            type: 'user'
+                        }
+                    });
+                }
+            }
+        });
+        spyOn(comp.snackBarService, 'openCoaster');
+        spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            name: 'Bucket #1'
+        }));
+        spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of([
+            {
+                identifier: '123',
+                resource: '/buckets/123',
+                action: 'READ',
+                configurable: true,
+                users: [{
+                    identity: 'User #1'
+                }],
+                userGroups: [{
+                    identity: 'Group #1'
+                }]
+            }
+        ]));
+        spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
+        });
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getBucket and getPolicies 
calls
+        fixture.detectChanges();
+
+        //assertions
+        var getBucketCall = nfRegistryApi.getBucket.calls.first();
+        expect(getBucketCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getBucket.calls.count()).toBe(1);
+
+        // the function to test
+        comp.addPolicy();
+
+        //assertions
+        expect(nfRegistryApi.getBucket.calls.count()).toBe(2);
+        expect(comp.snackBarService.openCoaster).toHaveBeenCalled();
+        expect(comp.filterPolicies).toHaveBeenCalled();
+    }));
+
+    it('should open a modal dialog UX enabling the creation of a user group 
policy for a specific bucket', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(comp, 'filterPolicies').and.callFake(function () {
+        });
+        spyOn(comp.dialog, 'open').and.callFake(function () {
+            return {
+                afterClosed: function () {
+                    return rxjs.Observable.of({
+                        userOrGroup: {
+                            type: 'group'
+                        }
+                    });
+                }
+            }
+        });
+        spyOn(comp.snackBarService, 'openCoaster');
+        spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            name: 'Bucket #1'
+        }));
+        spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of([
+            {
+                identifier: '123',
+                resource: '/buckets/123',
+                action: 'READ',
+                configurable: true,
+                users: [{
+                    identity: 'User #1'
+                }],
+                userGroups: [{
+                    identity: 'Group #1'
+                }]
+            }
+        ]));
+        spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
+        });
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getBucket and getPolicies 
calls
+        fixture.detectChanges();
+
+        //assertions
+        var getBucketCall = nfRegistryApi.getBucket.calls.first();
+        expect(getBucketCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getBucket.calls.count()).toBe(1);
+
+        // the function to test
+        comp.addPolicy();
+
+        //assertions
+        expect(nfRegistryApi.getBucket.calls.count()).toBe(2);
+        expect(comp.snackBarService.openCoaster).toHaveBeenCalled();
+        expect(comp.filterPolicies).toHaveBeenCalled();
+    }));
+
+    it('should open a modal dialog UX enabling the edit of a user policy for a 
specific bucket', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(comp, 'filterPolicies').and.callFake(function () {
+        });
+        spyOn(comp.dialog, 'open').and.callFake(function () {
+            return {
+                afterClosed: function () {
+                    return rxjs.Observable.of({
+                        userOrGroup: {
+                            type: 'user'
+                        }
+                    });
+                }
+            }
+        });
+        spyOn(comp.snackBarService, 'openCoaster');
+        spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            name: 'Bucket #1'
+        }));
+        spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of([
+            {
+                identifier: '123',
+                resource: '/buckets/123',
+                action: 'READ',
+                configurable: true,
+                users: [{
+                    identity: 'User #1'
+                }],
+                userGroups: [{
+                    identity: 'Group #1'
+                }]
+            }
+        ]));
+        spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
+        });
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getBucket and getPolicies 
calls
+        fixture.detectChanges();
+
+        //assertions
+        var getBucketCall = nfRegistryApi.getBucket.calls.first();
+        expect(getBucketCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getBucket.calls.count()).toBe(1);
+
+        // the function to test
+        comp.editPolicy();
+
+        //assertions
+        expect(nfRegistryApi.getBucket.calls.count()).toBe(2);
+        expect(comp.snackBarService.openCoaster).toHaveBeenCalled();
+        expect(comp.filterPolicies).toHaveBeenCalled();
+    }));
+
+    it('should open a modal dialog UX enabling the edit of a user group policy 
for a specific bucket', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(comp, 'filterPolicies').and.callFake(function () {
+        });
+        spyOn(comp.dialog, 'open').and.callFake(function () {
+            return {
+                afterClosed: function () {
+                    return rxjs.Observable.of({
+                        userOrGroup: {
+                            type: 'group'
+                        }
+                    });
+                }
+            }
+        });
+        spyOn(comp.snackBarService, 'openCoaster');
+        spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            name: 'Bucket #1'
+        }));
+        spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of([
+            {
+                identifier: '123',
+                resource: '/buckets/123',
+                action: 'READ',
+                configurable: true,
+                users: [{
+                    identity: 'User #1'
+                }],
+                userGroups: [{
+                    identity: 'Group #1'
+                }]
+            }
+        ]));
+        spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
+        });
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getBucket and getPolicies 
calls
+        fixture.detectChanges();
+
+        //assertions
+        var getBucketCall = nfRegistryApi.getBucket.calls.first();
+        expect(getBucketCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getBucket.calls.count()).toBe(1);
+
+        // the function to test
+        comp.editPolicy();
+
+        //assertions
+        expect(nfRegistryApi.getBucket.calls.count()).toBe(2);
+        expect(comp.snackBarService.openCoaster).toHaveBeenCalled();
+        expect(comp.filterPolicies).toHaveBeenCalled();
+    }));
+
+    it('should remove policy from bucket', ngCoreTesting.fakeAsync(function () 
{
+        // Spy
+        spyOn(comp, 'filterPolicies').and.callFake(function () {
+        });
+        spyOn(comp.dialogService, 'openConfirm').and.callFake(function () {
+            return {
+                afterClosed: function () {
+                    return rxjs.Observable.of(true);
+                }
+            }
+        });
+        spyOn(comp.snackBarService, 'openCoaster');
+        spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            name: 'Bucket #1'
+        }));
+        spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of([
+            {
+                identifier: '456',
+                resource: '/buckets/123',
+                action: 'READ',
+                configurable: true,
+                users: [{
+                    identity: 'User #1'
+                }],
+                userGroups: [{
+                    identity: 'Group #1'
+                }]
+            }
+        ]));
+        spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function 
() {
+        }).and.returnValue(rxjs.Observable.of({
+            users: [{
+                identity: 'User #1'
+            }],
+            userGroups: [{
+                identity: 'Group #1'
+            }]
+        }));
+        spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function 
() {
+        }).and.returnValue(rxjs.Observable.of({}));
+        spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
+        });
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getBucket and getPolicies 
calls
+        fixture.detectChanges();
+
+        //assertions
+        var getBucketCall = nfRegistryApi.getBucket.calls.first();
+        expect(getBucketCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getBucket.calls.count()).toBe(1);
+
+        var userOrGroup = {
+            type: 'user',
+            identity: '123',
+            permissions: 'read, write, delete'
+        };
+
+        // the function to test
+        comp.removePolicyFromBucket(userOrGroup);
+
+        //assertions
+        expect(nfRegistryApi.getPolicyActionResource.calls.count()).toBe(3);
+        expect(nfRegistryApi.putPolicyActionResource.calls.count()).toBe(3);
+        expect(nfRegistryApi.getPolicies.calls.count()).toBe(4);
+        expect(comp.snackBarService.openCoaster.calls.count()).toBe(3);
+        expect(comp.filterPolicies).toHaveBeenCalled();
+    }));
+
+    it('should update bucket name', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(comp.dialogService, 'openConfirm').and.callFake(function () {
+            return {
+                afterClosed: function () {
+                    return rxjs.Observable.of(true);
+                }
+            }
+        });
+        spyOn(comp.snackBarService, 'openCoaster');
+        spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            name: 'Bucket #1'
+        }));
+        spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of([
+            {
+                identifier: '456',
+                resource: '/buckets/123',
+                action: 'READ',
+                configurable: true,
+                users: [{
+                    identity: 'User #1'
+                }],
+                userGroups: [{
+                    identity: 'Group #1'
+                }]
+            }
+        ]));
+        spyOn(nfRegistryApi, 'updateBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            name: 'test',
+            status: 200
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getBucket and getPolicies 
calls
+        fixture.detectChanges();
+
+        //assertions
+        var getBucketCall = nfRegistryApi.getBucket.calls.first();
+        expect(getBucketCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getBucket.calls.count()).toBe(1);
+
+        // the function to test
+        comp.updateBucketName('test');
+
+        //assertions
+        expect(comp.snackBarService.openCoaster.calls.count()).toBe(1);
+        expect(comp.nfRegistryService.bucket.name).toBe('test');
+    }));
+
+    it('should fail to update bucket name (409)', 
ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(comp.dialogService, 'openConfirm').and.callFake(function () {
+            return {
+                afterClosed: function () {
+                    return rxjs.Observable.of(true);
+                }
+            }
+        });
+        spyOn(comp.snackBarService, 'openCoaster');
+        spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            name: 'Bucket #1'
+        }));
+        spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of([
+            {
+                identifier: '456',
+                resource: '/buckets/123',
+                action: 'READ',
+                configurable: true,
+                users: [{
+                    identity: 'User #1'
+                }],
+                userGroups: [{
+                    identity: 'Group #1'
+                }]
+            }
+        ]));
+        spyOn(nfRegistryApi, 'updateBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            name: 'test',
+            status: 409
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getBucket and getPolicies 
calls
+        fixture.detectChanges();
+
+        //assertions
+        var getBucketCall = nfRegistryApi.getBucket.calls.first();
+        expect(getBucketCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getBucket.calls.count()).toBe(1);
+
+        // the function to test
+        comp.updateBucketName('test');
+
+        //assertions
+        expect(comp.dialogService.openConfirm.calls.count()).toBe(1);
+        expect(comp.nfRegistryService.bucket.name).toBe('Bucket #1');
+    }));
+
+    it('should fail to update bucket name (400)', 
ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(comp.dialogService, 'openConfirm').and.callFake(function () {
+            return {
+                afterClosed: function () {
+                    return rxjs.Observable.of(true);
+                }
+            }
+        });
+        spyOn(comp.snackBarService, 'openCoaster');
+        spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            name: 'Bucket #1'
+        }));
+        spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of([
+            {
+                identifier: '456',
+                resource: '/buckets/123',
+                action: 'READ',
+                configurable: true,
+                users: [{
+                    identity: 'User #1'
+                }],
+                userGroups: [{
+                    identity: 'Group #1'
+                }]
+            }
+        ]));
+        spyOn(nfRegistryApi, 'updateBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            name: 'test',
+            status: 400
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getBucket and getPolicies 
calls
+        fixture.detectChanges();
+
+        //assertions
+        var getBucketCall = nfRegistryApi.getBucket.calls.first();
+        expect(getBucketCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getBucket.calls.count()).toBe(1);
+
+        // the function to test
+        comp.updateBucketName('test');
+
+        //assertions
+        expect(comp.dialogService.openConfirm.calls.count()).toBe(1);
+        expect(comp.nfRegistryService.bucket.name).toBe('Bucket #1');
+    }));
+
+    it('should destroy the component', ngCoreTesting.fakeAsync(function () {
+        spyOn(nfRegistryService.sidenav, 'close');
+        spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            name: 'Bucket #1'
+        }));
+        spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of([
+            {
+                identifier: 'string',
+                resource: '/buckets/123',
+                action: 'READ',
+                configurable: true,
+                users: [],
+                userGroups: []
+            }
+        ]));
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getBucket and getPolicies 
calls
+        fixture.detectChanges();
+        spyOn(comp.$subscription, 'unsubscribe');
+
+        // The function to test
+        comp.ngOnDestroy();
+
+        //assertions
+        expect(nfRegistryService.sidenav.close).toHaveBeenCalled();
+        expect(nfRegistryService.bucket.name).toBe('Bucket #1');
+        expect(comp.$subscription.unsubscribe).toHaveBeenCalled();
+    }));
+});

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/1bb1e2b6/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
index 7f4ae24..1772297 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
@@ -29,10 +29,12 @@ var nfRegistryAnimations = 
require('nifi-registry/nf-registry.animations.js');
  * @param nfStorage             A wrapper for the browser's local storage.
  * @param nfRegistryService     The nf-registry.service module.
  * @param ActivatedRoute        The angular activated route module.
+ * @param router                The angular router module.
  * @constructor
  */
-function NfRegistryBucketGridListViewer(nfRegistryApi, nfStorage, 
nfRegistryService, ActivatedRoute) {
+function NfRegistryBucketGridListViewer(nfRegistryApi, nfStorage, 
nfRegistryService, ActivatedRoute, router) {
     this.route = ActivatedRoute;
+    this.router = router;
     this.nfStorage = nfStorage;
     this.nfRegistryService = nfRegistryService;
     this.nfRegistryApi = nfRegistryApi;
@@ -62,12 +64,29 @@ NfRegistryBucketGridListViewer.prototype = {
                 );
             })
             .subscribe(function (response) {
-                var buckets = response[0];
-                var droplets = response[1];
-                var bucket = response[2];
-                self.nfRegistryService.bucket = bucket;
-                self.nfRegistryService.buckets = buckets;
-                self.nfRegistryService.droplets = droplets;
+                if (!response[0].status || response[0].status === 200) {
+                    var buckets = response[0];
+                    self.nfRegistryService.buckets = buckets;
+                } else if (response[0].status === 404) {
+                    
self.router.navigateByUrl('/nifi-registry/explorer/grid-list');
+                }
+                if (!response[2].status || response[2].status === 200) {
+                    var bucket = response[2];
+                    self.nfRegistryService.bucket = bucket;
+                } else if (response[2].status === 404) {
+                    
self.router.navigateByUrl('/nifi-registry/explorer/grid-list');
+                }
+                if (!response[1].status || response[1].status === 200) {
+                    var droplets = response[1];
+                    self.nfRegistryService.droplets = droplets;
+                } else if (response[1].status === 404) {
+                    if (!response[2].status || response[2].status === 200) {
+                        var bucket = response[2];
+                        
self.router.navigateByUrl('/nifi-registry/explorer/grid-list/buckets/' + 
bucket);
+                    } else {
+                        
self.router.navigateByUrl('/nifi-registry/explorer/grid-list');
+                    }
+                }
                 self.nfRegistryService.filterDroplets();
                 self.nfRegistryService.setBreadcrumbState('in');
                 self.nfRegistryService.inProgress = false;
@@ -97,7 +116,8 @@ NfRegistryBucketGridListViewer.parameters = [
     NfRegistryApi,
     NfStorage,
     NfRegistryService,
-    ngRouter.ActivatedRoute
+    ngRouter.ActivatedRoute,
+    ngRouter.Router
 ];
 
 module.exports = NfRegistryBucketGridListViewer;

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/1bb1e2b6/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
index c1140c5..700ed49 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
@@ -39,7 +39,6 @@ var ngMoment = require('angular2-moment');
 var rxjs = require('rxjs/Rx');
 var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
-var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
 var NfLoginComponent = 
require('nifi-registry/components/login/nf-registry-login.js');
 var NfUserLoginComponent = 
require('nifi-registry/components/login/dialogs/nf-registry-user-login.js');
@@ -77,7 +76,6 @@ describe('NfRegistryBucketGridListViewer Component', function 
() {
             ],
             providers: [
                 NfRegistryService,
-                NfRegistryAuthService,
                 NfRegistryApi,
                 NfStorage,
                 {
@@ -111,7 +109,11 @@ describe('NfRegistryBucketGridListViewer Component', 
function () {
 
         //Spy
         spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () 
{}).and.returnValue(rxjs.Observable.of({}));
-        spyOn(nfRegistryService, 'loadCurrentUser').and.callFake(function () 
{}).and.returnValue(rxjs.Observable.of({}));
+        spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () 
{}).and.returnValue(rxjs.Observable.of({}));
+        spyOn(nfRegistryService, 'filterDroplets');
+    });
+
+    it('should have a defined component', ngCoreTesting.fakeAsync(function () {
         spyOn(nfRegistryApi, 'getBuckets').and.callFake(function () {
         }).and.returnValue(rxjs.Observable.of([{
             identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
@@ -122,10 +124,6 @@ describe('NfRegistryBucketGridListViewer Component', 
function () {
             identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
             name: 'Bucket #1'
         }));
-        spyOn(nfRegistryService, 'filterDroplets');
-    });
-
-    it('should have a defined component', ngCoreTesting.fakeAsync(function () {
         spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
         }).and.returnValue(rxjs.Observable.of([{
             "identifier": "2e04b4fb-9513-47bb-aa74-1ae34616bfdc",
@@ -170,7 +168,45 @@ describe('NfRegistryBucketGridListViewer Component', 
function () {
         
expect(getBucketCall.args[0]).toBe('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc');
     }));
 
+    it('should FAIL to get buckets, get bucket, and get droplets and redirect 
to view all buckets', ngCoreTesting.fakeAsync(function () {
+        spyOn(nfRegistryApi, 'getBuckets').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 404
+        }));
+        spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 404
+        }));
+        spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 404
+        }));
+        spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
+        });
+        // 1st change detection triggers ngOnInit which makes getBuckets, 
getBucket, and getDroplets calls
+        fixture.detectChanges();
+        // wait for async getBuckets, getBucket, and getDroplets calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getBuckets, getBucket, and 
getDroplets calls
+        fixture.detectChanges();
+
+        //assertions
+        var routerCall = comp.router.navigateByUrl.calls.first();
+        expect(routerCall.args[0]).toBe('/nifi-registry/explorer/grid-list');
+        expect(comp.router.navigateByUrl.calls.count()).toBe(3);
+    }));
+
     it('should destroy the component', ngCoreTesting.fakeAsync(function () {
+        spyOn(nfRegistryApi, 'getBuckets').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of([{
+            identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
+            name: 'Bucket #1'
+        }]));
+        spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
+            name: 'Bucket #1'
+        }));
         spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
         }).and.returnValue(rxjs.Observable.of([{
             "identifier": "2e04b4fb-9513-47bb-aa74-1ae34616bfdc",

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/1bb1e2b6/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
index d85f68b..0705156 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
@@ -29,10 +29,12 @@ var nfRegistryAnimations = 
require('nifi-registry/nf-registry.animations.js');
  * @param nfStorage             A wrapper for the browser's local storage.
  * @param nfRegistryService     The nf-registry.service module.
  * @param activatedRoute        The angular activated route module.
+ * @param router                The angular router module.
  * @constructor
  */
-function NfRegistryDropletGridListViewer(nfRegistryApi, nfStorage, 
nfRegistryService, activatedRoute) {
+function NfRegistryDropletGridListViewer(nfRegistryApi, nfStorage, 
nfRegistryService, activatedRoute, router) {
     this.route = activatedRoute;
+    this.router = router;
     this.nfStorage = nfStorage;
     this.nfRegistryService = nfRegistryService;
     this.nfRegistryApi = nfRegistryApi;
@@ -60,14 +62,32 @@ NfRegistryDropletGridListViewer.prototype = {
                 );
             })
             .subscribe(function (response) {
-                var droplet = response[0];
-                var bucket = response[1];
-                var buckets = response[2];
-                var droplets = response[3];
-                self.nfRegistryService.bucket = bucket;
-                self.nfRegistryService.buckets = buckets;
-                self.nfRegistryService.droplet = droplet;
-                self.nfRegistryService.droplets = droplets;
+                if (!response[0].status || response[0].status === 200) {
+                    var droplet = response[0];
+                    self.nfRegistryService.droplet = droplet;
+                } else if (response[0].status === 404) {
+                    if (!response[1].status || response[1].status === 200) {
+                        var bucket = response[1];
+                        self.nfRegistryService.bucket = bucket;
+                        
self.router.navigateByUrl('/nifi-registry/explorer/grid-list/buckets/' + 
bucket.identifier);
+                    } else if (response[1].status === 404) {
+                        
self.router.navigateByUrl('/nifi-registry/explorer/grid-list');
+                    }
+                }
+                if (!response[1].status || response[1].status === 200) {
+                    var bucket = response[1];
+                    self.nfRegistryService.bucket = bucket;
+                } else if (response[1].status === 404) {
+                    
self.router.navigateByUrl('/nifi-registry/explorer/grid-list');
+                }
+                if (!response[2].status || response[2].status === 200) {
+                    var buckets = response[2];
+                    self.nfRegistryService.buckets = buckets;
+                }
+                if (!response[3].status || response[3].status === 200) {
+                    var droplets = response[3];
+                    self.nfRegistryService.droplets = droplets;
+                }
                 self.nfRegistryService.filterDroplets();
                 self.nfRegistryService.setBreadcrumbState('in');
                 self.nfRegistryService.inProgress = false;
@@ -96,7 +116,8 @@ NfRegistryDropletGridListViewer.parameters = [
     NfRegistryApi,
     NfStorage,
     NfRegistryService,
-    ngRouter.ActivatedRoute
+    ngRouter.ActivatedRoute,
+    ngRouter.Router
 ];
 
 module.exports = NfRegistryDropletGridListViewer;

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/1bb1e2b6/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
index b802a4d..77488a9 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
@@ -39,7 +39,6 @@ var ngMoment = require('angular2-moment');
 var rxjs = require('rxjs/Rx');
 var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
-var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
 var NfLoginComponent = 
require('nifi-registry/components/login/nf-registry-login.js');
 var NfUserLoginComponent = 
require('nifi-registry/components/login/dialogs/nf-registry-user-login.js');
@@ -77,7 +76,6 @@ describe('NfRegistryDropletGridListViewer Component', 
function () {
             ],
             providers: [
                 NfRegistryService,
-                NfRegistryAuthService,
                 NfRegistryApi,
                 NfStorage,
                 {
@@ -116,8 +114,11 @@ describe('NfRegistryDropletGridListViewer Component', 
function () {
 
         //Spy
         spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () 
{}).and.returnValue(rxjs.Observable.of({}));
-        spyOn(nfRegistryService, 'loadCurrentUser').and.callFake(function () 
{}).and.returnValue(rxjs.Observable.of({}));
-        // spyOn(ngHttpService, 'get').and.callThrough();
+        spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () 
{}).and.returnValue(rxjs.Observable.of({}));
+        spyOn(nfRegistryService, 'filterDroplets');
+    });
+
+    it('should have a defined component', ngCoreTesting.fakeAsync(function () {
         spyOn(nfRegistryApi, 'getDroplet').and.callFake(function () {
         }).and.returnValue(rxjs.Observable.of({
             "identifier": "2e04b4fb-9513-47bb-aa74-1ae34616bfdc",
@@ -145,10 +146,6 @@ describe('NfRegistryDropletGridListViewer Component', 
function () {
             identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
             name: 'Bucket #1'
         }));
-        spyOn(nfRegistryService, 'filterDroplets');
-    });
-
-    it('should have a defined component', ngCoreTesting.fakeAsync(function () {
         spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
         }).and.returnValue(rxjs.Observable.of([{
             "identifier": "2e04b4fb-9513-47bb-aa74-1ae34616bfdc",
@@ -199,7 +196,66 @@ describe('NfRegistryDropletGridListViewer Component', 
function () {
         
expect(getBucketCall.args[0]).toBe('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc');
     }));
 
+    it('should FAIL to get buckets, get bucket, get droplets, and get droplet 
and then redirect to view all buckets', ngCoreTesting.fakeAsync(function () {
+        spyOn(nfRegistryApi, 'getBuckets').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 404
+        }));
+        spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 404
+        }));
+        spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 404
+        }));
+        spyOn(nfRegistryApi, 'getDroplet').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 404
+        }));
+        spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
+        });
+        // 1st change detection triggers ngOnInit which makes getBuckets, 
getBucket, and getDroplets calls
+        fixture.detectChanges();
+        // wait for async getBuckets, getBucket, and getDroplets calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getBuckets, getBucket, and 
getDroplets calls
+        fixture.detectChanges();
+
+        //assertions
+        var routerCall = comp.router.navigateByUrl.calls.first();
+        expect(routerCall.args[0]).toBe('/nifi-registry/explorer/grid-list');
+        expect(comp.router.navigateByUrl.calls.count()).toBe(2);
+    }));
+
     it('should destroy the component', ngCoreTesting.fakeAsync(function () {
+        spyOn(nfRegistryApi, 'getDroplet').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            "identifier": "2e04b4fb-9513-47bb-aa74-1ae34616bfdc",
+            "name": "Flow #1",
+            "description": "This is flow #1",
+            "bucketIdentifier": "2f7f9e54-dc09-4ceb-aa58-9fe581319cdc",
+            "createdTimestamp": 1505931890999,
+            "modifiedTimestamp": 1505931890999,
+            "type": "FLOW",
+            "snapshotMetadata": null,
+            "link": {
+                "params": {
+                    "rel": "self"
+                },
+                "href": "flows/2e04b4fb-9513-47bb-aa74-1ae34616bfdc"
+            }
+        }));
+        spyOn(nfRegistryApi, 'getBuckets').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of([{
+            identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
+            name: 'Bucket #1'
+        }]));
+        spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
+            name: 'Bucket #1'
+        }));
         spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
         }).and.returnValue(rxjs.Observable.of([{
             "identifier": "2e04b4fb-9513-47bb-aa74-1ae34616bfdc",

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/1bb1e2b6/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
index d077016..8fbd6d4 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
@@ -74,15 +74,15 @@ limitations under the License.
                         <div fxFlex="25" class="pad-left-sm">
                             <div>
                                 <span class="uppercase">Bucket 
Identifier</span>
-                                <p class="ellipsis" 
title="{{droplet.bucketIdentifier}}" 
*ngIf="droplet.bucketIdentifier">{{droplet.bucketIdentifier}}</p>
+                                <p class="ellipsis" 
matTooltip="{{droplet.bucketIdentifier}}" 
*ngIf="droplet.bucketIdentifier">{{droplet.bucketIdentifier}}</p>
                             </div>
                             <div class="pad-top-md">
                                 <span class="uppercase">{{droplet.type}} 
Identifier</span>
-                                <p class="ellipsis" 
title="{{droplet.identifier}} 
"*ngIf="droplet.identifier">{{droplet.identifier}}</p>
+                                <p class="ellipsis" 
matTooltip="{{droplet.identifier}} 
"*ngIf="droplet.identifier">{{droplet.identifier}}</p>
                             </div>
                             <div class="pad-top-md">
                                 <span class="uppercase">Description</span>
-                                <p class="nf-registry-droplet-description" 
title="{{droplet.description}}" 
*ngIf="droplet.description">{{droplet.description}}</p>
+                                <p class="nf-registry-droplet-description" 
matTooltip="{{droplet.description}}" 
*ngIf="droplet.description">{{droplet.description}}</p>
                                 <p *ngIf="!droplet.description">No description 
specified</p>
                             </div>
                         </div>

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/1bb1e2b6/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
index 68d1988..47ddab5 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
@@ -39,7 +39,6 @@ var ngMoment = require('angular2-moment');
 var rxjs = require('rxjs/Rx');
 var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
-var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
 var NfLoginComponent = 
require('nifi-registry/components/login/nf-registry-login.js');
 var NfUserLoginComponent = 
require('nifi-registry/components/login/dialogs/nf-registry-user-login.js');
@@ -77,7 +76,6 @@ describe('NfRegistryGridListViewer Component', function () {
             ],
             providers: [
                 NfRegistryService,
-                NfRegistryAuthService,
                 NfRegistryApi,
                 NfStorage,
                 {
@@ -111,7 +109,7 @@ describe('NfRegistryGridListViewer Component', function () {
 
         // Spy
         spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () 
{}).and.returnValue(rxjs.Observable.of({}));
-        spyOn(nfRegistryService, 'loadCurrentUser').and.callFake(function () 
{}).and.returnValue(rxjs.Observable.of({}));
+        spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () 
{}).and.returnValue(rxjs.Observable.of({}));
         spyOn(nfRegistryApi, 'getBuckets').and.callFake(function () {
         }).and.returnValue(rxjs.Observable.of([{
             identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/1bb1e2b6/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js
index cd6e2eb..4cf6c5f 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js
@@ -37,7 +37,6 @@ var fdsCore = require('@fluid-design-system/core');
 var ngMoment = require('angular2-moment');
 var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
-var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
 var NfLoginComponent = 
require('nifi-registry/components/login/nf-registry-login.js');
 var NfUserLoginComponent = 
require('nifi-registry/components/login/dialogs/nf-registry-user-login.js');
@@ -74,7 +73,6 @@ describe('NfRegistryExplorer Component', function () {
             ],
             providers: [
                 NfRegistryService,
-                NfRegistryAuthService,
                 NfRegistryApi,
                 NfStorage,
                 {

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/1bb1e2b6/nifi-registry-web-ui/src/main/webapp/nf-registry.module.js
----------------------------------------------------------------------
diff --git a/nifi-registry-web-ui/src/main/webapp/nf-registry.module.js 
b/nifi-registry-web-ui/src/main/webapp/nf-registry.module.js
index a2d9671..cafe1f6 100644
--- a/nifi-registry-web-ui/src/main/webapp/nf-registry.module.js
+++ b/nifi-registry-web-ui/src/main/webapp/nf-registry.module.js
@@ -44,7 +44,6 @@ var NfRegistryDropletGridListViewer = 
require('nifi-registry/components/explorer
 var fdsCore = require('@fluid-design-system/core');
 var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
-var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
 var nfRegistryAuthGuardService = 
require('nifi-registry/services/nf-registry.auth-guard.service.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
 
@@ -98,7 +97,6 @@ NfRegistryModule.annotations = [
         ],
         providers: [
             NfRegistryService,
-            NfRegistryAuthService,
             nfRegistryAuthGuardService.NfRegistryUsersAdministrationAuthGuard,
             
nfRegistryAuthGuardService.NfRegistryWorkflowsAdministrationAuthGuard,
             nfRegistryAuthGuardService.NfRegistryLoginAuthGuard,

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/1bb1e2b6/nifi-registry-web-ui/src/main/webapp/nf-registry.routes.js
----------------------------------------------------------------------
diff --git a/nifi-registry-web-ui/src/main/webapp/nf-registry.routes.js 
b/nifi-registry-web-ui/src/main/webapp/nf-registry.routes.js
index 4235b0a..3fe831a 100644
--- a/nifi-registry-web-ui/src/main/webapp/nf-registry.routes.js
+++ b/nifi-registry-web-ui/src/main/webapp/nf-registry.routes.js
@@ -35,6 +35,11 @@ var NfRegistryRoutes = new ngRouter.RouterModule.forRoot([{
     component: NfRegistryExplorer,
     children: [
         {
+            path: '',
+            redirectTo: 'grid-list',
+            pathMatch: 'full'
+        },
+        {
             path: 'grid-list',
             component: NfRegistryGridListViewer,
             canActivate: 
[nfRegistryAuthGuardService.NfRegistryResourcesAuthGuard]

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/1bb1e2b6/nifi-registry-web-ui/src/main/webapp/nf-registry.spec.js
----------------------------------------------------------------------
diff --git a/nifi-registry-web-ui/src/main/webapp/nf-registry.spec.js 
b/nifi-registry-web-ui/src/main/webapp/nf-registry.spec.js
index a5e43c7..c9d90d6 100644
--- a/nifi-registry-web-ui/src/main/webapp/nf-registry.spec.js
+++ b/nifi-registry-web-ui/src/main/webapp/nf-registry.spec.js
@@ -38,7 +38,6 @@ var ngMoment = require('angular2-moment');
 var ngHttp = require('@angular/http');
 var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
-var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
 var NfLoginComponent = 
require('nifi-registry/components/login/nf-registry-login.js');
 var NfUserLoginComponent = 
require('nifi-registry/components/login/dialogs/nf-registry-user-login.js');
@@ -77,7 +76,6 @@ describe('NfRegistry Component', function () {
             ],
             providers: [
                 NfRegistryService,
-                NfRegistryAuthService,
                 NfRegistryApi,
                 NfStorage,
                 {

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/1bb1e2b6/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js
----------------------------------------------------------------------
diff --git a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js 
b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js
index 04ec818..9cde0d9 100644
--- a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js
+++ b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js
@@ -19,7 +19,6 @@ var NfStorage = 
require('nifi-registry/services/nf-storage.service.js');
 var ngCommonHttp = require('@angular/common/http');
 var fdsDialogsModule = require('@fluid-design-system/dialogs');
 var rxjs = require('rxjs/Observable');
-var ngRouter = require('@angular/router');
 var MILLIS_PER_SECOND = 1000;
 var headers = new Headers({'Content-Type': 'application/json'});
 
@@ -36,14 +35,12 @@ var config = {
  * @param nfStorage             A wrapper for the browser's local storage.
  * @param http                  The angular http module.
  * @param fdsDialogService      The FDS dialog service.
- * @param router                The angular router module.
  * @constructor
  */
-function NfRegistryApi(nfStorage, http, fdsDialogService, router) {
+function NfRegistryApi(nfStorage, http, fdsDialogService) {
     this.nfStorage = nfStorage;
     this.http = http;
     this.dialogService = fdsDialogService;
-    this.router = router;
 };
 
 NfRegistryApi.prototype = {
@@ -91,16 +88,11 @@ NfRegistryApi.prototype = {
             })
             .catch(function (error) {
                 self.dialogService.openConfirm({
-                    title: 'Error',
+                    title: 'Flow Not Found',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
-                }).afterClosed().subscribe(
-                    function (accept) {
-                        if (accept) {
-                            
self.router.navigateByUrl('/nifi-registry/explorer/grid-list/buckets/' + 
bucketId);
-                        }
-                    });
+                });
                 return rxjs.Observable.of(error);
             });
     },
@@ -125,12 +117,6 @@ NfRegistryApi.prototype = {
                 return response || [];
             })
             .catch(function (error) {
-                self.dialogService.openConfirm({
-                    title: 'Error',
-                    message: error.error,
-                    acceptButton: 'Ok',
-                    acceptButtonColor: 'fds-warn'
-                });
                 return rxjs.Observable.of(error);
             });
     },
@@ -224,16 +210,11 @@ NfRegistryApi.prototype = {
             })
             .catch(function (error) {
                 self.dialogService.openConfirm({
-                    title: 'Error',
+                    title: 'Bucket Not Found',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
-                }).afterClosed().subscribe(
-                    function (accept) {
-                        if (accept) {
-                            
self.router.navigateByUrl('/nifi-registry/explorer/grid-list');
-                        }
-                    });
+                });
                 return rxjs.Observable.of(error);
             });
     },
@@ -255,7 +236,7 @@ NfRegistryApi.prototype = {
             })
             .catch(function (error) {
                 self.dialogService.openConfirm({
-                    title: 'Error',
+                    title: 'Buckets Not Found',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
@@ -299,12 +280,12 @@ NfRegistryApi.prototype = {
             })
             .catch(function (error) {
                 self.dialogService.openConfirm({
-                    title: 'Error',
+                    title: 'User Not Found',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return rxjs.Observable.throw(error.error);
+                return rxjs.Observable.of(error);
             });
     },
 
@@ -394,7 +375,7 @@ NfRegistryApi.prototype = {
             })
             .catch(function (error) {
                 self.dialogService.openConfirm({
-                    title: 'Error',
+                    title: 'Users Not Found',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
@@ -439,7 +420,7 @@ NfRegistryApi.prototype = {
             })
             .catch(function (error) {
                 self.dialogService.openConfirm({
-                    title: 'Error',
+                    title: 'Groups Not Found',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
@@ -462,7 +443,7 @@ NfRegistryApi.prototype = {
             })
             .catch(function (error) {
                 self.dialogService.openConfirm({
-                    title: 'Error',
+                    title: 'Group Not Found',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
@@ -578,6 +559,12 @@ NfRegistryApi.prototype = {
                 return response;
             })
             .catch(function (error) {
+                self.dialogService.openConfirm({
+                    title: 'Error',
+                    message: error.error,
+                    acceptButton: 'Ok',
+                    acceptButtonColor: 'fds-warn'
+                });
                 return rxjs.Observable.of(error);
             });
     },
@@ -596,6 +583,12 @@ NfRegistryApi.prototype = {
                 return response;
             })
             .catch(function (error) {
+                self.dialogService.openConfirm({
+                    title: 'Error',
+                    message: error.error,
+                    acceptButton: 'Ok',
+                    acceptButtonColor: 'fds-warn'
+                });
                 return rxjs.Observable.of(error);
             });
     },
@@ -744,12 +737,8 @@ NfRegistryApi.prototype = {
                 return response;
             })
             .catch(function (error) {
-                // there is no anonymous access and we don't know this user - 
open the login page which handles login/registration/etc
-                if (error.status === 401) {
-                    self.nfStorage.removeItem('jwt');
-                    self.router.navigateByUrl('/nifi-registry/login');
-                }
                 return rxjs.Observable.of({
+                    error: error,
                     resourcePermissions: {
                         anyTopLevelResource: {
                             canRead: false,
@@ -785,8 +774,7 @@ NfRegistryApi.prototype = {
 NfRegistryApi.parameters = [
     NfStorage,
     ngCommonHttp.HttpClient,
-    fdsDialogsModule.FdsDialogService,
-    ngRouter.Router
+    fdsDialogsModule.FdsDialogService
 ];
 
 module.exports = NfRegistryApi;

Reply via email to