diff options
| author | Alex Rudyy <orudyy@apache.org> | 2015-02-04 14:33:38 +0000 |
|---|---|---|
| committer | Alex Rudyy <orudyy@apache.org> | 2015-02-04 14:33:38 +0000 |
| commit | b01427061008ed26afd5a08e18fe1d0ce81dbf25 (patch) | |
| tree | c9bc485326b74bded3431814526476a2ced40053 /qpid/java | |
| parent | 9bde51bb9e454cf54a71ae4b3f74ced95b68f5ae (diff) | |
| download | qpid-python-b01427061008ed26afd5a08e18fe1d0ce81dbf25.tar.gz | |
QPID-6360: [Java Broker] Extend the UI to support creation of alternate group providers and the new config based group provider plugin
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1657255 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java')
19 files changed, 577 insertions, 277 deletions
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/GroupManagingGroupProvider.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/GroupManagingGroupProvider.java new file mode 100644 index 0000000000..a961d77776 --- /dev/null +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/GroupManagingGroupProvider.java @@ -0,0 +1,24 @@ +/* + * 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. + */ +package org.apache.qpid.server.model; + +@ManagedAnnotation +public interface GroupManagingGroupProvider extends ManagedInterface +{ +} diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProvider.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProvider.java index d338dad300..631ed3e8f7 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProvider.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProvider.java @@ -20,12 +20,13 @@ */ package org.apache.qpid.server.model.adapter; +import org.apache.qpid.server.model.GroupManagingGroupProvider; import org.apache.qpid.server.model.GroupProvider; import org.apache.qpid.server.model.ManagedAttribute; import org.apache.qpid.server.model.ManagedObject; @ManagedObject( category = false, type = "GroupFile" ) -public interface FileBasedGroupProvider<X extends FileBasedGroupProvider<X>> extends GroupProvider<X> +public interface FileBasedGroupProvider<X extends FileBasedGroupProvider<X>> extends GroupProvider<X>, GroupManagingGroupProvider { String PATH="path"; diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java index 6728ba2fed..ecc166f8fc 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java @@ -30,6 +30,7 @@ import org.apache.qpid.server.model.AbstractConfiguredObject; import org.apache.qpid.server.model.Broker; import org.apache.qpid.server.model.ConfiguredObject; import org.apache.qpid.server.model.Group; +import org.apache.qpid.server.model.GroupManagingGroupProvider; import org.apache.qpid.server.model.GroupMember; import org.apache.qpid.server.model.GroupProvider; import org.apache.qpid.server.model.ManagedObject; @@ -38,7 +39,7 @@ import org.apache.qpid.server.model.State; import org.apache.qpid.server.model.StateTransition; @ManagedObject(category = false, type = GroupProviderImpl.CONFIG_TYPE) -public class GroupProviderImpl extends AbstractConfiguredObject<GroupProviderImpl> implements GroupProvider<GroupProviderImpl> +public class GroupProviderImpl extends AbstractConfiguredObject<GroupProviderImpl> implements GroupProvider<GroupProviderImpl>, GroupManagingGroupProvider { public static final String CONFIG_TYPE = "ManagedGroupProvider"; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/addGroupProvider.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/addGroupProvider.html new file mode 100644 index 0000000000..b622fe94d2 --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/addGroupProvider.html @@ -0,0 +1,66 @@ +<!-- + ~ 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. + --> + +<div class="dijitHidden"> + <div data-dojo-type="dijit/Dialog" data-dojo-props="title:'Add Store'" id="addGroupProvider"> + <div id="addGroupProvider.contentPane"> + <form id="addGroupProvider.form" method="post" data-dojo-type="dijit/form/Form"> + <div class="formBox"> + <div class="clear"> + <div class="formLabel-labelCell tableContainer-labelCell">Name*:</div> + <div class="formLabel-controlCell tableContainer-valueCell"> + <input type="text" id="addGroupProvider.name" + data-dojo-type="dijit/form/ValidationTextBox" + data-dojo-props=" + name: 'name', + placeHolder: 'group provider name', + required: true, + promptMessage: 'Name of group provider, must be unique', + title: 'Enter a unique group provider name per broker'" /> + </div> + </div> + <div class="clear"> + <div class="formLabel-labelCell tableContainer-labelCell">Type*:</div> + <div class="tableContainer-valueCell formLabel-controlCell"> + <select id="addGroupProvider.type" data-dojo-type="dijit/form/FilteringSelect" + data-dojo-props=" + name: 'type', + required: true, + placeHolder: 'group provider type', + promptMessage: 'Type of group provider', + title: 'Select type', + searchAttr: 'name'"> + </select> + </div> + </div> + <div class="clear"> + <div id="addGroupProvider.typeFields"></div> + </div> + </div> + </form> + <div class="clear"> + </div> + </div> + + <div class="dijitDialogPaneActionBar qpidDialogPaneActionBar"> + <button data-dojo-type="dijit/form/Button" id="addGroupProvider.addButton" data-dojo-props="label: 'Save'" type="submit"></button> + <button data-dojo-type="dijit/form/Button" id="addGroupProvider.cancelButton" data-dojo-props="label: 'Cancel'" ></button> + </div> + </div> +</div> diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/group/addGroupMember.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/group/addGroupMember.html index 0372468f91..e479e8cb74 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/group/addGroupMember.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/group/addGroupMember.html @@ -30,8 +30,9 @@ </table> <br/> - <!-- submit buttons --> - <input type="submit" value="Add Group Member" label="Add Group Member" dojoType="dijit.form.Button" /> + <div class="dijitDialogPaneActionBar"> + <input type="submit" value="Add Group Member" label="Add Group Member" dojoType="dijit.form.Button" /> + </div> </form> </div> </div> diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/group/showGroup.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/group/showGroup.html index 4fddf727d0..c84e794ac1 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/group/showGroup.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/group/showGroup.html @@ -23,8 +23,10 @@ <br/> <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Group Members'"> <div class="groupMembers"></div> - <button data-dojo-type="dijit.form.Button" class="addGroupMemberButton" type="button">Add Group Member</button> - <button data-dojo-type="dijit.form.Button" class="removeGroupMemberButton" type="button">Remove Group Members</button> + <div class="dijitDialogPaneActionBar"> + <button data-dojo-type="dijit.form.Button" class="addGroupMemberButton" type="button">Add Group Member</button> + <button data-dojo-type="dijit.form.Button" class="removeGroupMemberButton" type="button">Remove Group Members</button> + </div> </div> </div> diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/addGroup.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/addGroup.html index 8d3431808a..29ce2ebe6c 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/addGroup.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/addGroup.html @@ -30,8 +30,9 @@ </table> <br/> - <!-- submit buttons --> - <input type="submit" value="Create Group" label="Create Group" dojoType="dijit.form.Button" /> + <div class="dijitDialogPaneActionBar"> + <input type="submit" value="Create Group" label="Create Group" dojoType="dijit.form.Button" /> + </div> </form> </div> diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/add.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/add.html new file mode 100644 index 0000000000..7fc458cd4f --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/add.html @@ -0,0 +1,37 @@ +<!-- + - + - 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. + - + --> +<div> + <div class="clear"> + <div class="formLabel-labelCell tableContainer-labelCell">Path*:</div> + <div class="formLabel-controlCell tableContainer-valueCell"> + <input type="text" class="addGroupProviderPath" + data-dojo-type="dijit/form/ValidationTextBox" + data-dojo-props=" + name: 'path', + required: true, + placeHolder: 'path/to/group/file', + title: 'Enter path to file with groups', + promptMessage: 'Enter path to file with groups'"/> + </div> + </div> + + <div class="clear"></div> +</div> diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/show.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/show.html new file mode 100644 index 0000000000..740c65fd38 --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/show.html @@ -0,0 +1,25 @@ +<!-- + ~ 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. + --> +<div> + <div class="clear"> + <div class="formLabel-labelCell">Path to file:</div> + <div ><span class="path" ></span></div> + </div> + <div class="clear"></div> +</div> diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/showFileGroupManager.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/showGroupManagingGroupProvider.html index d266971ee2..62a6c7537c 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/showFileGroupManager.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/showGroupManagingGroupProvider.html @@ -19,16 +19,12 @@ - --> <div class="FileGroupManager"> - <div class="clear"> - <div class="formLabel-labelCell">Path:</div> - <div class="path"></div> - </div> - <div class="clear"></div> - <br/> <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Groups'"> <div class="groups"></div> - <button data-dojo-type="dijit.form.Button" class="addGroupButton">Add Group</button> - <button data-dojo-type="dijit.form.Button" class="deleteGroupButton">Delete Groups</button> + <div class="dijitDialogPaneActionBar"> + <button data-dojo-type="dijit.form.Button" class="addGroupButton">Add Group</button> + <button data-dojo-type="dijit.form.Button" class="deleteGroupButton">Delete Groups</button> + </div> </div> </div> diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js index 09473524b5..f739e52665 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js @@ -22,18 +22,24 @@ define(["dojo/_base/xhr", "dojo/parser", "dojo/query", "dojo/_base/connect", + "dojo/_base/array", + "dojo/_base/event", "qpid/common/properties", "qpid/common/updater", "qpid/common/util", + "qpid/common/metadata", "qpid/common/UpdatableStore", "dojox/grid/EnhancedGrid", "dijit/registry", - "dojo/_base/event", "dojox/html/entities", + "dojo/text!showGroupProvider.html", + "qpid/management/addGroupProvider", "dojox/grid/enhanced/plugins/Pagination", "dojox/grid/enhanced/plugins/IndirectSelection", "dojo/domReady!"], - function (xhr, parser, query, connect, properties, updater, util, UpdatableStore, EnhancedGrid, registry, event, entities) { + function (xhr, parser, query, connect, array, event, properties, updater, util, metadata, UpdatableStore, + EnhancedGrid, registry, entities, template, addGroupProvider) + { function GroupProvider(name, parent, controller) { this.name = name; @@ -45,38 +51,63 @@ define(["dojo/_base/xhr", return "GroupProvider: " + this.name ; }; - GroupProvider.prototype.open = function(contentPane) { + GroupProvider.prototype.open = function(contentPane) + { var that = this; this.contentPane = contentPane; - xhr.get({url: "showGroupProvider.html", - sync: true, - load: function(data) { - contentPane.containerNode.innerHTML = data; - parser.parse(contentPane.containerNode); - - that.groupProviderAdapter = new GroupProviderUpdater(contentPane.containerNode, that.modelObj, that.controller); - - updater.add( that.groupProviderAdapter ); - - that.groupProviderAdapter.update(); - - var deleteButton = query(".deleteGroupProviderButton", contentPane.containerNode)[0]; - var deleteWidget = registry.byNode(deleteButton); - connect.connect(deleteWidget, "onClick", - function(evt){ - event.stop(evt); - that.deleteGroupProvider(); - }); - }}); + contentPane.containerNode.innerHTML = template; + parser.parse(contentPane.containerNode); + + this.groupProviderUpdater = new GroupProviderUpdater(contentPane.containerNode, this.modelObj, this.controller); + + // load data + this.groupProviderUpdater.update(); + + this.deleteButton = registry.byNode(query(".deleteGroupProviderButton", contentPane.containerNode)[0]); + this.deleteButton.on("click", function(evt){ event.stop(evt); that.deleteGroupProvider(); }); + + this.editButton = registry.byNode(query(".editGroupProviderButton", contentPane.containerNode)[0]); + this.editButton.on("click", function(evt){ event.stop(evt); that.editGroupProvider(); }); + + var type = this.groupProviderUpdater.groupProviderData.type; + var providerDetailsNode = query(".providerDetails", contentPane.containerNode)[0]; + + require(["qpid/management/groupprovider/"+ encodeURIComponent(type.toLowerCase()) + "/show"], + function(DetailsUI) + { + that.groupProviderUpdater.details = new DetailsUI({containerNode: providerDetailsNode, parent: that}); + that.groupProviderUpdater.details.update(that.groupProviderUpdater.groupProviderData); + }); + + var managedInterfaces = metadata.getMetaData("GroupProvider", type).managedInterfaces; + if (managedInterfaces) + { + + var managedInterfaceUI = this.groupProviderUpdater.managedInterfaces; + + array.forEach(managedInterfaces, + function(managedInterface) + { + require(["qpid/management/groupprovider/" + encodeURIComponent(managedInterface)], + function(ManagedInterface) + { + managedInterfaceUI[ManagedInterface] = new ManagedInterface(providerDetailsNode, that.modelObj, that.controller); + managedInterfaceUI[ManagedInterface].update(that.groupProviderUpdater.groupProviderData); + }); + }); + } + + updater.add( this.groupProviderUpdater ); }; + GroupProvider.prototype.close = function() { - updater.remove( this.groupProviderAdapter ); + updater.remove( this.groupProviderUpdater ); }; GroupProvider.prototype.deleteGroupProvider = function() { var warnMessage = ""; - if (this.groupProviderAdapter.groupProviderData && this.groupProviderAdapter.groupProviderData.type.indexOf("File") != -1) + if (this.groupProviderUpdater.groupProviderData && this.groupProviderUpdater.groupProviderData.type.indexOf("File") != -1) { warnMessage = "NOTE: provider deletion will also remove the group file on disk.\n\n"; } @@ -96,7 +127,23 @@ define(["dojo/_base/xhr", util.xhrErrorHandler(this.failureReason); } } - }; + }; + + GroupProvider.prototype.editGroupProvider = function() + { + xhr.get( + { + url: this.groupProviderUpdater.query, + sync: true, + content: { actuals: true }, + handleAs: "json", + load: function(actualData) + { + addGroupProvider.show(actualData[0]); + } + } + ); + } function GroupProviderUpdater(node, groupProviderObj, controller) { @@ -105,27 +152,8 @@ define(["dojo/_base/xhr", this.type = query(".type", node)[0]; this.state = query(".state", node)[0]; this.query = "api/latest/groupprovider/"+encodeURIComponent(groupProviderObj.name); - this.typeUI ={"GroupFile": "FileGroupManager"}; - var that = this; - - xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"}) - .then(function(data) - { - that.groupProviderData = data[0]; - - util.flattenStatistics( that.groupProviderData ); - - that.updateHeader(); - - var ui = that.typeUI[that.groupProviderData.type]; - require(["qpid/management/groupprovider/"+ ui], - function(SpecificProvider) { - that.details = new SpecificProvider(query(".providerDetails", node)[0], groupProviderObj, controller); - that.details.update(); - }); - - }); - + this.managedInterfaces = {}; + this.details = null; } GroupProviderUpdater.prototype.updateHeader = function() @@ -138,6 +166,28 @@ define(["dojo/_base/xhr", GroupProviderUpdater.prototype.update = function() { var that = this; + xhr.get({url: this.query, sync: true, handleAs: "json"}).then(function(data) {that._update(data[0]);}); + }; + + GroupProviderUpdater.prototype._update = function(data) + { + this.groupProviderData = data; + util.flattenStatistics( this.groupProviderData ); + this.updateHeader(); + + if (this.details) + { + this.details.update(this.groupProviderData); + } + + for(var managedInterface in this.managedInterfaces) + { + var managedInterfaceUI = this.managedInterfaces[managedInterface]; + if (managedInterfaceUI) + { + managedInterfaceUI.update(this.groupProviderData); + } + } }; return GroupProvider; diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js index 82281ad3d3..f158b8ceb6 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js @@ -18,7 +18,7 @@ * under the License. * */ -define(["dojo/_base/lang", +define([ "dojo/_base/xhr", "dojo/dom", "dojo/dom-construct", @@ -26,8 +26,10 @@ define(["dojo/_base/lang", "dojo/parser", "dojo/_base/array", "dojo/_base/event", - 'dojo/_base/json', + 'dojo/json', "qpid/common/util", + "qpid/common/metadata", + "dojo/text!addGroupProvider.html", "dojo/store/Memory", "dojox/validate/us", "dojox/validate/web", @@ -42,140 +44,152 @@ define(["dojo/_base/lang", "dijit/layout/ContentPane", "dojox/layout/TableContainer", "dojo/domReady!"], - function (lang, xhr, dom, construct, registry, parser, array, event, json, util) { - - var addGroupProvider = {}; - - addGroupProvider.show = function(groupProvider) { - var fields = [{ - name: "name", - createWidget: function(groupProvider) { - return new dijit.form.ValidationTextBox({ - required: true, - value: groupProvider.name, - disabled: groupProvider.name ? true : false, - label: "Name*:", - regexp: "^[\x20-\x2e\x30-\x7F]{1,255}$", - promptMessage: "Name of group provider.", - placeHolder: "name", - name: "name"}); - } - }, { - name: "type", - createWidget: function(groupProvider) { - - var typeContainer = construct.create("div"); - - var typeListContainer = new dojox.layout.TableContainer({ - cols: 1, - "labelWidth": "300", - customClass: "formLabel", - showLabels: true, - orientation: "horiz" - }); - - typeContainer.appendChild(typeListContainer.domNode); - - var providers = []; - var fieldSetContainers = {}; - xhr.get({ - url: "service/helper?action=ListGroupProviderAttributes", - handleAs: "json", - sync: true - }).then( - function(data) { - var providerIndex = 0; - - for (var providerType in data) { - if (data.hasOwnProperty(providerType)) { - providers[providerIndex++] = {id: providerType, name: providerType}; - - var attributes = data[providerType].attributes; - var descriptions = data[providerType].descriptions; - - var layout = new dojox.layout.TableContainer( { - cols: 1, - "labelWidth": "300", - customClass: "formLabel", - showLabels: true, - orientation: "horiz" - }); - - for(var i=0; i < attributes.length; i++) { - if ("type" == attributes[i]) - { - continue; - } - var labelValue = attributes[i]; - if (descriptions && descriptions[attributes[i]]) - { - labelValue = descriptions[attributes[i]]; - } - var text = new dijit.form.TextBox({ - label: labelValue + ":", - name: attributes[i] - }); - layout.addChild(text); - } - - typeContainer.appendChild(layout.domNode); - fieldSetContainers[providerType] = layout; - } - } - }); - - var providersStore = new dojo.store.Memory({ data: providers }); - - var typeList = new dijit.form.FilteringSelect({ - required: true, - value: groupProvider.type, - store: providersStore, - label: "Type*:", - name: "type"}); - - typeListContainer.addChild(typeList); - - var onChangeHandler = function onChangeHandler(newValue){ - for (var i in fieldSetContainers) { - var container = fieldSetContainers[i]; - var descendants = container.getChildren(); - for(var i in descendants){ - var descendant = descendants[i]; - var propName = descendant.name; - if (propName) { - descendant.set("disabled", true); - } + function (xhr, dom, construct, registry, parser, array, event, json, util, metadata, template) + { + + var addGroupProvider = + { + init: function() + { + var that=this; + this.containerNode = construct.create("div", {innerHTML: template}); + parser.parse(this.containerNode); + + this.groupProviderName = registry.byId("addGroupProvider.name"); + this.groupProviderName.set("regExpGen", util.nameOrContextVarRegexp); + + this.dialog = registry.byId("addGroupProvider"); + this.addButton = registry.byId("addGroupProvider.addButton"); + this.cancelButton = registry.byId("addGroupProvider.cancelButton"); + this.cancelButton.on("click", function(e){that._cancel(e);}); + this.addButton.on("click", function(e){that._add(e);}); + + this.groupProviderTypeFieldsContainer = dom.byId("addGroupProvider.typeFields"); + this.groupProviderForm = registry.byId("addGroupProvider.form"); + + this.groupProviderType = registry.byId("addGroupProvider.type"); + this.groupProviderType.on("change", function(type){that._groupProviderTypeChanged(type);}); + + var supportedTypes = metadata.getTypesForCategory("GroupProvider"); + supportedTypes.sort(); + var supportedTypesStore = util.makeTypeStore(supportedTypes); + this.groupProviderType.set("store", supportedTypesStore); + }, + show: function(actualData) + { + this.initialData = actualData; + this.groupProviderForm.reset(); + + if (actualData) + { + this._destroyTypeFields(this.containerNode); + this._initFields(actualData); + } + this.groupProviderName.set("disabled", actualData == null ? false : true); + this.groupProviderType.set("disabled", actualData == null ? false : true); + this.dialog.set("title", actualData == null ? "Add Group Provider" : "Edit Group Provider - " + actualData.name) + this.dialog.show(); + }, + _initFields:function(data) + { + var type = data["type"]; + var attributes = metadata.getMetaData("GroupProvider", type).attributes; + for(var name in attributes) + { + var widget = registry.byId("addGroupProvider."+name); + if (widget) + { + widget.set("value", data[name]); } - container.domNode.style.display = "none"; - } - var container = fieldSetContainers[newValue]; - if (container) - { - container.domNode.style.display = "block"; - var descendants = container.getChildren(); - for(var i in descendants){ - var descendant = descendants[i]; - var propName = descendant.name; - if (propName) { - descendant.set("disabled", false); - } + } + }, + _cancel: function(e) + { + event.stop(e); + this.dialog.hide(); + }, + _add: function(e) + { + event.stop(e); + this._submit(); + }, + _submit: function() + { + if (this.groupProviderForm.validate()) + { + var success = false,failureReason=null; + + var groupProviderData = util.getFormWidgetValues(this.groupProviderForm, this.initialData); + var encodedName = encodeURIComponent(this.groupProviderName.value); + var jsonString = json.stringify(groupProviderData); + + try { + xhr.put( + { + url: "api/latest/groupprovider/" + encodedName, + sync: true, + handleAs: "json", + headers: { "Content-Type": "application/json"}, + putData: jsonString, + load: function(x) {success = true; }, + error: function(error) {success = false; failureReason = error;} + }); + } + catch (e) + { + console.warn(e); } - } - }; - typeList.on("change", onChangeHandler); - onChangeHandler(typeList.value); - return new dijit.layout.ContentPane({content: typeContainer, style:{padding: 0}}); - } - }]; - util.showSetAttributesDialog( - fields, - groupProvider ? groupProvider : {}, - "api/latest/groupprovider" + (name ? "/" + encodeURIComponent(name.name) : ""), - groupProvider ? "Edit group provider - " + groupProvider.name : "Add group provider", - "Group", - groupProvider && groupProvider.type ? groupProvider.type : "Group", - groupProvider ? false : true); + if (success == true) + { + this.dialog.hide(); + } + else + { + util.xhrErrorHandler(failureReason); + } + } + else + { + alert('Form contains invalid data. Please correct first'); + } + }, + _groupProviderTypeChanged: function(type) + { + this._destroyTypeFields(this.groupProviderTypeFieldsContainer); + if (type) + { + var that = this; + require([ "qpid/management/groupprovider/" + type.toLowerCase() + "/add"], function(typeUI) + { + try + { + typeUI.show({containerNode: that.groupProviderTypeFieldsContainer, parent: that, data: that.initialData}); + util.applyMetadataToWidgets(that.groupProviderTypeFieldsContainer, "GroupProvider", type); + } + catch(e) + { + console.warn(e); + } + }); + } + }, + _destroyTypeFields: function(typeFieldsContainer) + { + var widgets = registry.findWidgets(typeFieldsContainer); + array.forEach(widgets, function(item) { item.destroyRecursive();}); + construct.empty(typeFieldsContainer); + } }; + + try + { + addGroupProvider.init(); + } + catch(e) + { + console.warn(e); + } return addGroupProvider; + });
\ No newline at end of file diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/Group.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/Group.js index 8f63a8c935..8ac6be04cc 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/Group.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/group/Group.js @@ -34,11 +34,12 @@ define(["dojo/_base/xhr", "dojox/grid/EnhancedGrid", "dojo/data/ObjectStore", "qpid/management/group/addGroupMember", + "dojox/html/entities", "dojox/grid/enhanced/plugins/Pagination", "dojox/grid/enhanced/plugins/IndirectSelection", "dojo/domReady!"], function (xhr, parser, query, registry, connect, event, json, properties, updater, util, formatter, - UpdatableStore, JsonRest, EnhancedGrid, ObjectStore, addGroupMember) { + UpdatableStore, JsonRest, EnhancedGrid, ObjectStore, addGroupMember, entities) { function Group(name, parent, controller) { this.name = name; @@ -78,10 +79,8 @@ define(["dojo/_base/xhr", parser.parse(contentPane.containerNode); that.groupUpdater = new GroupUpdater(contentPane.containerNode, that, that.controller); - - updater.add( that.groupUpdater ); - that.groupUpdater.update(); + updater.add( that.groupUpdater ); var addGroupMemberButton = query(".addGroupMemberButton", contentPane.containerNode)[0]; connect.connect(registry.byNode(addGroupMemberButton), "onClick", @@ -128,7 +127,7 @@ define(["dojo/_base/xhr", "durable", "lifetimePolicy", "type"]); - + this.name.innerHTML = entities.encode(String(groupObj.getGroupName())); this.query = "api/latest/groupmember/"+ encodeURIComponent(groupObj.getGroupProviderName()) + "/" + encodeURIComponent(groupObj.getGroupName()); xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"}).then(function(data) diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/GroupManagingGroupProvider.js index 4ee411633f..ea12280d0d 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/GroupManagingGroupProvider.js @@ -34,6 +34,7 @@ define(["dojo/_base/xhr", "qpid/common/updater", "qpid/common/UpdatableStore", "dojox/grid/EnhancedGrid", + "dojo/text!groupprovider/showGroupManagingGroupProvider.html", "dojox/grid/enhanced/plugins/Pagination", "dojox/grid/enhanced/plugins/IndirectSelection", "dojox/validate/us", "dojox/validate/web", @@ -44,49 +45,17 @@ define(["dojo/_base/xhr", "dijit/form/Form", "dijit/form/DateTextBox", "dojo/domReady!"], - function (xhr, dom, parser, query, construct, connect, win, event, json, registry, entities, util, properties, updater, UpdatableStore, EnhancedGrid) { - function DatabaseGroupManager(containerNode, groupProviderObj, controller) { + function (xhr, dom, parser, query, construct, connect, win, event, json, registry, entities, util, properties, + updater, UpdatableStore, EnhancedGrid, template) + { + function GroupManagingGroupProvider(containerNode, groupProviderObj, controller) + { var node = construct.create("div", null, containerNode, "last"); var that = this; this.name = groupProviderObj.name; - xhr.get({url: "groupprovider/showFileGroupManager.html", - sync: true, - load: function(data) { - node.innerHTML = data; - parser.parse(node); - - - that.groupDatabaseUpdater= new GroupProviderUpdater(node, groupProviderObj, controller); - - updater.add( that.groupDatabaseUpdater); - - that.groupDatabaseUpdater.update(); - - - }}); - } - - DatabaseGroupManager.prototype.update = function() { - this.groupDatabaseUpdater.update(); - }; - - DatabaseGroupManager.prototype.close = function() { - updater.remove( this.groupDatabaseUpdater ); - }; - - function GroupProviderUpdater(node, groupProviderObj, controller) - { + node.innerHTML = template; + parser.parse(node); this.controller = controller; - this.query = "api/latest/groupprovider/"+encodeURIComponent(groupProviderObj.name); - this.name = groupProviderObj.name; - var that = this; - - xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"}) - .then(function(data) { - that.path = query(".path", node)[0]; - that.groupProviderData = data[0]; - - util.flattenStatistics( that.groupProviderData ); var groupDiv = query(".groups", node)[0]; @@ -95,7 +64,7 @@ define(["dojo/_base/xhr", keepSelection: true, plugins: { pagination: { - pageSizes: ["10", "25", "50", "100"], + pageSizes: [10, 25, 50, 100], description: true, sizeSwitch: true, pageStepper: true, @@ -106,10 +75,7 @@ define(["dojo/_base/xhr", indirectSelection: true }}; - - - that.groupsGrid = - new UpdatableStore(that.groupProviderData.groups, groupDiv, + this.groupsGrid = new UpdatableStore([], groupDiv, [ { name: "Group Name", field: "name", width: "100%" } ], function(obj) { connect.connect(obj.grid, "onRowDblClick", obj.grid, @@ -120,22 +86,13 @@ define(["dojo/_base/xhr", that.controller.show("group", name, groupProviderObj, theItem.id); }); }, gridProperties, EnhancedGrid); - - - var addGroupButton = query(".addGroupButton", node)[0]; - connect.connect(registry.byNode(addGroupButton), "onClick", function(evt){ addGroup.show(groupProviderObj.name) }); - - var deleteGroupButton = query(".deleteGroupButton", node)[0]; - var deleteWidget = registry.byNode(deleteGroupButton); - connect.connect(deleteWidget, "onClick", - function(evt){ - event.stop(evt); - that.deleteGroups(); - }); - }); + var addGroupButton = query(".addGroupButton", node)[0]; + registry.byNode(addGroupButton).on("click", function(evt){ addGroup.show(groupProviderObj.name) }); + var deleteWidget = registry.byNode(query(".deleteGroupButton", node)[0]); + deleteWidget.on("click", function(evt){ event.stop(evt); that.deleteGroups(); }); } - GroupProviderUpdater.prototype.deleteGroups = function() + GroupManagingGroupProvider.prototype.deleteGroups = function() { var grid = this.groupsGrid.grid; var data = grid.selection.getSelected(); @@ -169,22 +126,12 @@ define(["dojo/_base/xhr", } }; - GroupProviderUpdater.prototype.update = function() + GroupManagingGroupProvider.prototype.update = function(data) { - - var that = this; - - xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"}) - .then(function(data) { - that.groupProviderData = data[0]; - that.path.innerHTML = entities.encode(String(that.groupProviderData.path)); - util.flattenStatistics( that.groupProviderData ); - - that.groupsGrid.update(that.groupProviderData.groups); - - }); - - + if (data) + { + this.groupsGrid.update(data.groups); + } }; var addGroup = {}; @@ -258,5 +205,5 @@ define(["dojo/_base/xhr", registry.byId("addGroup").show(); }; - return DatabaseGroupManager; + return GroupManagingGroupProvider; }); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/add.js new file mode 100644 index 0000000000..f28f250134 --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/add.js @@ -0,0 +1,37 @@ +/* + * + * 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. + * + */ +define(["dojo/dom","dojo/query", "dojo/_base/array", "dijit/registry","qpid/common/util", "qpid/common/metadata"], + function (dom, query, array, registry, util, metadata) + { + + return { show: function(data) + { + var that=this; + util.parseHtmlIntoDiv(data.containerNode, "groupprovider/groupfile/add.html"); + if (data.data) + { + var pathWidget = registry.byNode(query(".addGroupProviderPath", data.containerNode)[0]); + pathWidget.set("value", data.data.path); + } + } + }; + } +); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/show.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/show.js new file mode 100644 index 0000000000..a559140898 --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/show.js @@ -0,0 +1,37 @@ +/* + * + * 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. + * + */ +define(["qpid/common/util", "dojo/domReady!"], + function (util, metadata) + { + + function GroupFile(data) + { + util.buildUI(data.containerNode, data.parent, "groupprovider/groupfile/show.html", ["path"], this); + } + + GroupFile.prototype.update = function(data) + { + util.updateUI(data, ["path"], this); + } + + return GroupFile; + } +); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/managedgroupprovider/add.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/managedgroupprovider/add.js new file mode 100644 index 0000000000..fd8e09dcda --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/managedgroupprovider/add.js @@ -0,0 +1,26 @@ +/* + * + * 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. + * + */ +define([], + function (dom, query, array, registry, util, metadata) + { + return { show: function(data) { /* nothing to do */ } }; + } +); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/managedgroupprovider/show.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/managedgroupprovider/show.js new file mode 100644 index 0000000000..ed6a0e155b --- /dev/null +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/managedgroupprovider/show.js @@ -0,0 +1,35 @@ +/* + * + * 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. + * + */ +define([], + function () + { + + function ManagedGroupProvider(data) + { + } + + ManagedGroupProvider.prototype.update = function(data) + { + } + + return ManagedGroupProvider; + } +); diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html index e095a0a427..3793a4407a 100644 --- a/qpid/java/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html +++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html @@ -35,9 +35,10 @@ <div class="clear"></div> <div class="providerDetails"></div> - + <br/> <div class="dijitDialogPaneActionBar"> - <input class="deleteGroupProviderButton" type="button" value="Delete Group provider" label="Delete Group Provider" dojoType="dijit.form.Button" /> + <input class="deleteGroupProviderButton" type="button" value="Delete" label="Delete" data-dojo-type="dijit.form.Button" /> + <input class="editGroupProviderButton" type="button" value="Edit" label="Edit" data-dojo-type="dijit.form.Button" data-dojo-props="disabled:true"/> </div> </div> </div> |
