diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/InstalledPluginResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/InstalledPluginResource.java deleted file mode 100644 index eecbe39806..0000000000 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/InstalledPluginResource.java +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Copyright (c) 2010, Sebastian Sdorra - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of SCM-Manager; nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * http://bitbucket.org/sdorra/scm-manager - * - */ - - - -package sonia.scm.api.rest.resources; - -//~--- non-JDK imports -------------------------------------------------------- - -import com.google.inject.Inject; -import com.google.inject.Singleton; - -import sonia.scm.plugin.PluginInformation; -import sonia.scm.plugin.PluginManager; - -//~--- JDK imports ------------------------------------------------------------ - -import java.util.Collection; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; - -/** - * - * @author Sebastian Sdorra - */ -@Singleton -@Path("plugins/installed") -public class InstalledPluginResource -{ - - /** - * Constructs ... - * - * - * @param pluginManager - */ - @Inject - public InstalledPluginResource(PluginManager pluginManager) - { - Collection pluginCollection = - pluginManager.getInstalled(); - - if (pluginCollection != null) - { - plugins = pluginCollection.toArray(new PluginInformation[0]); - } - else - { - plugins = new PluginInformation[0]; - } - } - - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @return - */ - @GET - @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) - public PluginInformation[] getPlugins() - { - return plugins; - } - - //~--- fields --------------------------------------------------------------- - - /** Field description */ - private PluginInformation[] plugins; -} diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AvailablePluginResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/PluginResource.java similarity index 64% rename from scm-webapp/src/main/java/sonia/scm/api/rest/resources/AvailablePluginResource.java rename to scm-webapp/src/main/java/sonia/scm/api/rest/resources/PluginResource.java index 56259b7fb0..6eb71cbd33 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AvailablePluginResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/PluginResource.java @@ -38,8 +38,8 @@ package sonia.scm.api.rest.resources; import com.google.inject.Inject; import com.google.inject.Singleton; +import sonia.scm.plugin.DefaultPluginManager; import sonia.scm.plugin.PluginInformation; -import sonia.scm.plugin.PluginManager; //~--- JDK imports ------------------------------------------------------------ @@ -58,8 +58,8 @@ import javax.ws.rs.core.Response; * @author Sebastian Sdorra */ @Singleton -@Path("plugins/available") -public class AvailablePluginResource +@Path("plugins") +public class PluginResource { /** @@ -69,7 +69,7 @@ public class AvailablePluginResource * @param pluginManager */ @Inject - public AvailablePluginResource(PluginManager pluginManager) + public PluginResource(DefaultPluginManager pluginManager) { this.pluginManager = pluginManager; } @@ -85,7 +85,7 @@ public class AvailablePluginResource * @return */ @POST - @Path("{id}") + @Path("install/{id}") public Response install(@PathParam("id") String id) { pluginManager.install(id); @@ -93,6 +93,40 @@ public class AvailablePluginResource return Response.ok().build(); } + /** + * Method description + * + * + * @param id + * + * @return + */ + @POST + @Path("uninstall/{id}") + public Response uninstall(@PathParam("id") String id) + { + pluginManager.uninstall(id); + + return Response.ok().build(); + } + + /** + * Method description + * + * + * @param id + * + * @return + */ + @POST + @Path("update/{id}") + public Response update(@PathParam("id") String id) + { + pluginManager.update(id); + + return Response.ok().build(); + } + //~--- get methods ---------------------------------------------------------- /** @@ -103,10 +137,64 @@ public class AvailablePluginResource */ @GET @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) - public PluginInformation[] getAvailablePlugins() + public PluginInformation[] getAll() + { + return getArray(pluginManager.getAll()); + } + + /** + * Method description + * + * + * @return + */ + @GET + @Path("available") + @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) + public PluginInformation[] getAvailable() + { + return getArray(pluginManager.getAvailable()); + } + + /** + * Method description + * + * + * @return + */ + @GET + @Path("updates") + @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) + public PluginInformation[] getAvailableUpdates() + { + return getArray(pluginManager.getAvailableUpdates()); + } + + /** + * Method description + * + * + * @return + */ + @GET + @Path("installed") + @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) + public PluginInformation[] getInstalled() + { + return getArray(pluginManager.getInstalled()); + } + + /** + * Method description + * + * + * @param pluginCollection + * + * @return + */ + private PluginInformation[] getArray( + Collection pluginCollection) { - Collection pluginCollection = - pluginManager.getAvailable(); PluginInformation[] plugins = null; if (pluginCollection != null) @@ -124,5 +212,5 @@ public class AvailablePluginResource //~--- fields --------------------------------------------------------------- /** Field description */ - private PluginManager pluginManager; + private DefaultPluginManager pluginManager; } diff --git a/scm-webapp/src/main/webapp/resources/js/sonia.plugin.js b/scm-webapp/src/main/webapp/resources/js/sonia.plugin.js index bd9c688ff3..b9329291d1 100644 --- a/scm-webapp/src/main/webapp/resources/js/sonia.plugin.js +++ b/scm-webapp/src/main/webapp/resources/js/sonia.plugin.js @@ -37,7 +37,7 @@ Sonia.plugin.Store = Ext.extend(Sonia.rest.JsonStore, { constructor: function(config) { var baseConfig = { root: 'plugin-information', - fields: [ 'name', 'author', 'description', 'url', 'version', 'groupId', 'artifactId' ], + fields: [ 'name', 'author', 'description', 'url', 'version', 'state', 'groupId', 'artifactId' ], sortInfo: { field: 'name' } @@ -59,47 +59,55 @@ Sonia.plugin.DefaultColumns = [ ] -// installed plugins grid - -Sonia.plugin.InstalledGrid = Ext.extend(Sonia.rest.Grid, { - - initComponent: function(){ - - var pluginStore = new Sonia.plugin.Store({ - url: restUrl + 'plugins/installed.json' - }); - - var columns = []; - columns = columns.concat( columns, Sonia.plugin.DefaultColumns ); - columns.push( - {id: 'Url', header: 'Url', dataIndex: 'url', renderer: this.renderUrl, width: 250} - ); - - var pluginColModel = new Ext.grid.ColumnModel({ - defaults: { - sortable: true, - scope: this, - width: 125 - }, - columns: columns - }); - - var config = { - autoExpandColumn: 'description', - store: pluginStore, - colModel: pluginColModel, - emptyText: 'No plugin is installed' - }; - - - Ext.apply(this, Ext.apply(this.initialConfig, config)); - Sonia.plugin.InstalledGrid.superclass.initComponent.apply(this, arguments); +Sonia.plugin.installPlugin = function(pluginId){ + if ( debug ){ + console.debug( 'install plugin ' + pluginId ); } -}); + var loadingBox = Ext.MessageBox.show({ + title: 'Please wait', + msg: 'Installing Plugin.', + width: 300, + wait: true, + animate: true, + progress: true, + closable: false + }); + + Ext.Ajax.request({ + url: restUrl + 'plugins/install/' + pluginId + '.json', + method: 'POST', + scope: this, + success: function(){ + if ( debug ){ + console.debug('plugin successfully installed'); + } + loadingBox.hide(); + Ext.MessageBox.alert('Plugin successfully installed', + 'Restart the applicationserver to activate the plugin.'); + }, + failure: function(){ + if ( debug ){ + console.debug('plugin installation failed'); + } + alert( 'failure' ); + loadingBox.hide(); + } + }); +} + +Sonia.plugin.uninstallPlugin = function(pluginId){ + if ( debug ){ + console.debug('not implemented'); + } +} + +Sonia.plugin.updatePlugin = function(pluginId){ + if ( debug ){ + console.debug('not implemented'); + } +} -// register xtype -Ext.reg('installedPluginsGrid', Sonia.plugin.InstalledGrid); // loading window @@ -127,22 +135,17 @@ Sonia.plugin.LoadingWindow = Ext.extend(Ext.Window,{ }); -// available plugins grid +// plugin grid -Sonia.plugin.AvailableGrid = Ext.extend(Sonia.rest.Grid,{ +Sonia.plugin.Grid = Ext.extend(Sonia.rest.Grid, { + + actionLinkTemplate: '{0}', initComponent: function(){ var pluginStore = new Sonia.plugin.Store({ - url: restUrl + 'plugins/available.json' + url: restUrl + 'plugins.json' }); - - var columns = []; - columns = columns.concat( columns, Sonia.plugin.DefaultColumns ); - columns.push( - {id: 'Url', header: 'Url', dataIndex: 'url', renderer: this.renderUrl, width: 250}, - {id: 'Install', header: 'Install', renderer: this.renderInstallLink, width: 60} - ); var pluginColModel = new Ext.grid.ColumnModel({ defaults: { @@ -150,70 +153,46 @@ Sonia.plugin.AvailableGrid = Ext.extend(Sonia.rest.Grid,{ scope: this, width: 125 }, - columns: columns + columns: [ + {id: 'name', header: 'Name', dataIndex: 'name'}, + {id: 'author', header: 'Author', dataIndex: 'author'}, + {id: 'description', header: 'Description', dataIndex: 'description'}, + {id: 'version', header: 'Version', dataIndex: 'version'}, + {id: 'state', header: 'State', dataIndex: 'state', width: 80}, + {id: 'action', header: 'Action', renderer: this.renderActionColumn}, + {id: 'Url', header: 'Url', dataIndex: 'url', renderer: this.renderUrl, width: 150} + ] }); var config = { autoExpandColumn: 'description', store: pluginStore, colModel: pluginColModel, - emptyText: 'No plugin available' + emptyText: 'No plugins avaiable' }; - this.on('cellclick', this.cellClick); Ext.apply(this, Ext.apply(this.initialConfig, config)); - Sonia.plugin.AvailableGrid.superclass.initComponent.apply(this, arguments); + Sonia.plugin.Grid.superclass.initComponent.apply(this, arguments); }, - renderInstallLink: function(){ - return 'Install' - }, - - cellClick: function(grid, rowIndex, columnIndex, e){ - if(columnIndex==grid.getColumnModel().getIndexById('Install')){ - var record = grid.getStore().getAt(rowIndex); - this.installPlugin(Sonia.plugin.GetPluginId(record.data)); + renderActionColumn: function(val, meta, record){ + var out = ""; + var data = record.data; + var id = Sonia.plugin.GetPluginId(data); + if ( data.state == 'AVAILABLE' ){ + out = String.format(this.actionLinkTemplate, 'Install', 'Sonia.plugin.installPlugin(\'' + id + '\')'); + } else if ( data.state == 'INSTALLED' ){ + out = String.format(this.actionLinkTemplate, 'Uninstall', 'Sonia.plugin.uninstallPlugin(\'' + id + '\')'); + } else if ( data.state == 'UPDATE_AVAILABLE' ){ + out = String.format(this.actionLinkTemplate, 'Update', 'Sonia.plugin.updatePlugin(\'' + id + '\')'); + out += ', ' + out += String.format(this.actionLinkTemplate, 'Uninstall', 'Sonia.plugin.uninstallPlugin(\'' + id + '\')'); } - }, - - installPlugin: function(pluginId){ - if ( debug ){ - console.debug( 'install plugin ' + pluginId ); - } - - var loadingBox = Ext.MessageBox.show({ - title: 'Please wait', - msg: 'Installing Plugin.', - width: 300, - wait: true, - animate: true, - progress: true, - closable: false - }); - - Ext.Ajax.request({ - url: restUrl + 'plugins/available/' + pluginId + '.json', - method: 'POST', - scope: this, - success: function(){ - if ( debug ){ - console.debug('plugin successfully installed'); - } - loadingBox.hide(); - Ext.MessageBox.alert('Plugin successfully installed', - 'Restart the applicationserver to activate the plugin.'); - }, - failure: function(){ - if ( debug ){ - console.debug('plugin installation failed'); - } - alert( 'failure' ); - loadingBox.hide(); - } - }); + return out; } - + }); -Ext.reg('availablePluginsGrid', Sonia.plugin.AvailableGrid); +// register xtype +Ext.reg('pluginGrid', Sonia.plugin.Grid); diff --git a/scm-webapp/src/main/webapp/resources/js/sonia.scm.js b/scm-webapp/src/main/webapp/resources/js/sonia.scm.js index cdd533088c..032def4ea2 100644 --- a/scm-webapp/src/main/webapp/resources/js/sonia.scm.js +++ b/scm-webapp/src/main/webapp/resources/js/sonia.scm.js @@ -134,19 +134,10 @@ Ext.onReady(function(){ fn: function(){ addTabPanel('repositoryConfig', 'repositoryConfig', 'Repository Config'); } - }] - },{ - id: 'navPlugins', - title: 'Plugins', - items: [{ - label: 'Installed', - fn: function(){ - addTabPanel('installedPlugins', 'installedPluginsGrid', 'Installed Plugins') - } },{ - label: 'Available', + label: 'Plugins', fn: function(){ - addTabPanel('availablePlugins', 'availablePluginsGrid', 'Available Plugins') + addTabPanel('plugins', 'pluginGrid', 'Plugins'); } }] },{