You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by li...@apache.org on 2008/08/20 19:29:47 UTC

svn commit: r687390 - in /geronimo/server/trunk/plugins/console/plugin-portlets/src/main: java/org/apache/geronimo/console/car/ resources/ webapp/WEB-INF/view/car/

Author: linsun
Date: Wed Aug 20 10:29:30 2008
New Revision: 687390

URL: http://svn.apache.org/viewvc?rev=687390&view=rev
Log:
divide plugins to application plugins and system plugins in the assembly list view

Modified:
    geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/AbstractListHandler.java
    geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/AssemblyListHandler.java
    geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/BaseImportExportHandler.java
    geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/ManagementHelper.java
    geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/PluginInfoBean.java
    geronimo/server/trunk/plugins/console/plugin-portlets/src/main/resources/pluginportlets.properties
    geronimo/server/trunk/plugins/console/plugin-portlets/src/main/resources/pluginportlets_zh.properties
    geronimo/server/trunk/plugins/console/plugin-portlets/src/main/webapp/WEB-INF/view/car/assemblylist.jsp

Modified: geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/AbstractListHandler.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/AbstractListHandler.java?rev=687390&r1=687389&r2=687390&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/AbstractListHandler.java (original)
+++ geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/AbstractListHandler.java Wed Aug 20 10:29:30 2008
@@ -35,7 +35,7 @@
 import org.apache.geronimo.kernel.repository.Dependency;
 
 /**
- * @version $Rev:$ $Date:$
+ * @version $Rev$ $Date$
  */
 public abstract class AbstractListHandler extends BaseImportExportHandler {
     public AbstractListHandler(String mode, String viewName) {
@@ -79,6 +79,14 @@
         }
 
         // sort the plugin list based on the selected table column
+        sortPlugins(plugins, request);
+
+        // save everything in the request
+        request.setAttribute("plugins", plugins);
+    }
+    
+    protected void sortPlugins(List<PluginInfoBean> plugins, RenderRequest request) {
+        // sort the plugin list based on the selected table column
         final String column = request.getParameter("column");
         Collections.sort(plugins, new Comparator<PluginInfoBean>() {
             public int compare(PluginInfoBean o1, PluginInfoBean o2) {
@@ -109,8 +117,5 @@
                 }
             }
         });
-
-        // save everything in the request
-        request.setAttribute("plugins", plugins);
     }
 }

Modified: geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/AssemblyListHandler.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/AssemblyListHandler.java?rev=687390&r1=687389&r2=687390&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/AssemblyListHandler.java (original)
+++ geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/AssemblyListHandler.java Wed Aug 20 10:29:30 2008
@@ -17,6 +17,10 @@
 package org.apache.geronimo.console.car;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
 
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
@@ -26,8 +30,13 @@
 import javax.portlet.WindowState;
 
 import org.apache.geronimo.console.MultiPageModel;
+import org.apache.geronimo.kernel.repository.Dependency;
 import org.apache.geronimo.system.plugin.PluginInstaller;
+import org.apache.geronimo.system.plugin.PluginInstallerGBean;
+import org.apache.geronimo.system.plugin.model.ArtifactType;
+import org.apache.geronimo.system.plugin.model.PluginArtifactType;
 import org.apache.geronimo.system.plugin.model.PluginListType;
+import org.apache.geronimo.system.plugin.model.PluginType;
 
 /**
  * Handler for the import export list screen.
@@ -70,6 +79,7 @@
         if(!loadFromServer(request)) {
             //todo: loading failed -- do something!
         }
+            
         request.setAttribute("column", column);
         request.setAttribute("relativeServerPath", relativeServerPath);
         request.setAttribute("groupId", groupId);
@@ -88,14 +98,56 @@
 
         // try to reuse the catalog data if it was already downloaded
         PluginListType data = getServerPluginList(request, pluginInstaller);
-
+        //try to reuse the server application list
+        List<String> appList = getApplicationModuleLists(request);
+        
         if(data == null || data.getPlugin() == null) {
             return false;
         }
 
-        listPlugins(request, pluginInstaller, data, false);
+        listPlugins(request, pluginInstaller, data, appList);
         request.getPortletSession(true).setAttribute(SERVER_CONFIG_LIST_SESSION_KEY, data);
+        request.getPortletSession(true).setAttribute(SERVER_APP_LIST_SESSION_KEY, appList);
         return true;
     }
+    
+    private void listPlugins(RenderRequest request, PluginInstaller pluginInstaller, PluginListType data, List<String> appList) {
+        List<PluginInfoBean> plugins = new ArrayList<PluginInfoBean>();
+
+        for (PluginType metadata: data.getPlugin()) {
+
+            // ignore plugins which have no artifacts defined
+            if (metadata.getPluginArtifact().isEmpty()) {
+                continue;
+            }
+
+            if (metadata.getCategory() == null) {
+                metadata.setCategory("Unspecified");
+            }
+
+            for (PluginArtifactType pluginArtifact : metadata.getPluginArtifact()) {
+                PluginInfoBean plugin = new PluginInfoBean();
+                plugin.setPlugin(metadata);
+                plugin.setPluginArtifact(pluginArtifact);
+                
+                //determine if the plugin is a system plugin or application plugin
+                ArtifactType artifact = pluginArtifact.getModuleId();
+                String configId = artifact.getGroupId() + "/" + artifact.getArtifactId() + "/" 
+                                  + artifact.getVersion() + "/" + artifact.getType();
+                for (String app : appList) {
+                    if (app.equals(configId)) {
+                        plugin.setIsSystemPlugin(false);
+                    }
+                }
+                
+                plugins.add(plugin);
+            }
+        }
+        
+        // sort the plugin list based on the selected table column
+        sortPlugins(plugins, request);
 
+        // save everything in the request
+        request.setAttribute("plugins", plugins);
+    }
 }
\ No newline at end of file

Modified: geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/BaseImportExportHandler.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/BaseImportExportHandler.java?rev=687390&r1=687389&r2=687390&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/BaseImportExportHandler.java (original)
+++ geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/BaseImportExportHandler.java Wed Aug 20 10:29:30 2008
@@ -18,6 +18,7 @@
 
 import java.io.IOException;
 import java.net.URL;
+import java.util.List;
 
 import javax.portlet.PortletRequest;
 import javax.portlet.PortletException;
@@ -42,6 +43,7 @@
     protected static final String CONFIG_LIST_SESSION_KEY = "console.plugins.ConfigurationList";
     protected static final String CONFIG_LIST_REPO_SESSION_KEY = "console.plugins.ConfigurationListRepo";
     protected static final String SERVER_CONFIG_LIST_SESSION_KEY = "console.plugins.ServerConfigurationList";
+    protected static final String SERVER_APP_LIST_SESSION_KEY = "console.plugins.ServerApplicationList";
     public static final String DOWNLOAD_RESULTS_SESSION_KEY = "console.plugins.DownloadResults";
     protected static final String INDEX_MODE = "index";
     protected static final String ADD_REPO_MODE = "addRepository";
@@ -89,6 +91,14 @@
         }
         return data;
     }
+    
+    protected List<String> getApplicationModuleLists(RenderRequest request) {
+        List<String> applicationLists = (List<String>)request.getPortletSession(true).getAttribute(SERVER_APP_LIST_SESSION_KEY);
+        if (applicationLists == null) {
+            applicationLists = ManagementHelper.getManagementHelper(request).getApplicationModuleLists();
+        }
+        return applicationLists;
+    }
 
     protected PluginListType getPluginsFromIds(String[] configIds, PluginListType list) throws PortletException {
         PluginListType installList = new PluginListType();

Modified: geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/ManagementHelper.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/ManagementHelper.java?rev=687390&r1=687389&r2=687390&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/ManagementHelper.java (original)
+++ geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/ManagementHelper.java Wed Aug 20 10:29:30 2008
@@ -21,7 +21,10 @@
 package org.apache.geronimo.console.car;
 
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import javax.enterprise.deploy.spi.DeploymentManager;
@@ -120,5 +123,29 @@
             return null;
         }
     }
+    
+    public List<String> getApplicationModuleLists() {
+        List<String> apps = new ArrayList<String>();
+        Set<AbstractName> gbeans = this.kernel.listGBeans((AbstractNameQuery) null);
+        for (Iterator<AbstractName> it = gbeans.iterator(); it.hasNext();) {
+            AbstractName name = (AbstractName) it.next();
+            if (isApplicationModule(name)) {
+                apps.add(name.getNameProperty("name"));
+            }
+        }
+       
+        return apps;
+        
+    }
+    
+    private static boolean isApplicationModule(AbstractName abstractName) {
+        String type = abstractName.getNameProperty("j2eeType");
+        String app = abstractName.getNameProperty("J2EEApplication");
+        String name = abstractName.getNameProperty("name");
+        if (type != null && (app == null || app.equals("null"))) {
+            return (type.equals("WebModule") || type.equals("J2EEApplication") || type.equals("EJBModule") || type.equals("AppClientModule") || type.equals("ResourceAdapterModule")) && !name.startsWith("geronimo/system");            
+        }
+        return false;
+    }
 
 }

Modified: geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/PluginInfoBean.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/PluginInfoBean.java?rev=687390&r1=687389&r2=687390&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/PluginInfoBean.java (original)
+++ geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/PluginInfoBean.java Wed Aug 20 10:29:30 2008
@@ -58,6 +58,7 @@
     protected PluginArtifactType pluginArtifact;
     protected boolean installable = true;
     protected String validationMessage;
+    protected boolean isSystemPlugin = true;
 
     public List<PropertyType> getArtifactAlias() {
         return artifactAlias;
@@ -240,7 +241,7 @@
     }
 
     public boolean isInstallable() {
-        return installable;
+        return this.installable;
     }
 
     public void setInstallable(boolean installable) {
@@ -248,10 +249,18 @@
     }
 
     public String getValidationMessage() {
-        return validationMessage;
+        return this.validationMessage;
     }
 
     public void setValidationMessage(String validationMessage) {
         this.validationMessage = validationMessage;
     }
+    
+    public boolean getIsSystemPlugin() {
+        return this.isSystemPlugin;
+    }
+    
+    public void setIsSystemPlugin(boolean isSystemPlugin) {
+        this.isSystemPlugin = isSystemPlugin;
+    }
 }
\ No newline at end of file

Modified: geronimo/server/trunk/plugins/console/plugin-portlets/src/main/resources/pluginportlets.properties
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/console/plugin-portlets/src/main/resources/pluginportlets.properties?rev=687390&r1=687389&r2=687390&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/console/plugin-portlets/src/main/resources/pluginportlets.properties (original)
+++ geronimo/server/trunk/plugins/console/plugin-portlets/src/main/resources/pluginportlets.properties Wed Aug 20 10:29:30 2008
@@ -69,14 +69,15 @@
 car.index.summary                             = <h2>Install Geronimo Plugins</h2> <p>This portlet lets you install Geronimo plugins. This can be used to install new features into a Geronimo server at runtime.</p> <p>Choose a local or remote repository to inspect for available Geronimo plugins.  The repository must have a <tt>geronimo-plugins.xml</tt> file in the root directory listing the available plugins in the repository.</p> <p>You can also download running configurations from another Geronimo server  just as if you're browsing and installing third-party plugins.  If you want to point to a remote Geronimo server,  enter a URL such as <tt>http://geronimo-server:8080/plugin/maven-repo/</tt>  and the enter the administrator username and password in the optional authentication fields.</p>
 car.index.updateRepositoryList                = Update Repository List
 car.index.validateConfig                      = Please select a configuration to export.
+car.list.applicationPlugin                    = Application plugins in local server:
 car.list.assemblyArtifactId                   = Assembly artifactId:
 car.list.assemblyFormat                       = Assembly format:
 car.list.assemblyGroupId                      = Assembly groupId:
 car.list.assemblyPath                         = Assembly target path:
 car.list.assemblyVersion                      = Assembly version:
 car.list.noPlugins                            = No plugins are listed at this repository.
-car.list.pluginLocal                          = Plugins in local server
 car.list.pluginRepo                           = Plugins listed at
+car.list.systemPlugin                         = System plugins in local server:
 car.pluginParams.JVMVersionsExp               = An optional list of JVM version prefixes supported by this plugin.  If no values are listed, the plugin can be installed in Geronimo running in any version of the JVM.  Otherwise, list one acceptable JVM version prefix per line, like "1.4.2&nbsp;\r\n&nbsp;1.5&nbsp;\r\n&nbsp;..." (ideally, of course, this means you've actually tested the plugin with Geronimo on each JVM version listed here).
 car.pluginParams.authorExp                    = The author of the plug, which may be a person, company, open source project, etc.
 car.pluginParams.categoryExp                  = The category this plugin falls into.  Plugins in the same category will be listed together. If this plugin is intended to be listed on geronimoplugins.com then you should use one of the category names there if any of them fit.  Otherwise, you can select this freely, or according to the categories acceptable to the repository where you plan to post this.

Modified: geronimo/server/trunk/plugins/console/plugin-portlets/src/main/resources/pluginportlets_zh.properties
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/console/plugin-portlets/src/main/resources/pluginportlets_zh.properties?rev=687390&r1=687389&r2=687390&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/console/plugin-portlets/src/main/resources/pluginportlets_zh.properties (original)
+++ geronimo/server/trunk/plugins/console/plugin-portlets/src/main/resources/pluginportlets_zh.properties Wed Aug 20 10:29:30 2008
@@ -68,14 +68,15 @@
 car.index.removePluginsExp                    = \u4E3A\u4E86\u5220\u9664\u4E00\u4E2A\u63D2\u4EF6\uFF0C\u5728\u53F3\u8FB9\u5BFC\u822A\u9762\u677F\u7684<b>\u5E94\u7528\u7A0B\u5E8F</b>\u4E0B\u76F8\u5E94\u7684\u7C7B\u522B\u4E2D\u627E\u5230\u63D2\u4EF6\u7684\u6A21\u5757\uFF0C\u5E76\u5378\u8F7D\u5B83\u3002
 car.index.summary                             = <h2>Install Geronimo Plugins</h2> <p>This portlet lets you install Geronimo plugins. This can be used to install new features into a Geronimo server at runtime.</p> <p>Choose a local or remote repository to inspect for available Geronimo plugins.  The repository must have a <tt>geronimo-plugins.xml</tt> file in the root directory listing the available plugins in the repository.</p> <p>You can also download running configurations from another Geronimo server  just as if you're browsing and installing third-party plugins.  If you want to point to a remote Geronimo server,  enter a URL such as <tt>http://geronimo-server:8080/plugin/maven-repo/</tt>  and the enter the administrator username and password in the optional authentication fields.</p>
 car.index.updateRepositoryList                = \u66F4\u65B0\u5B58\u50A8\u5E93\u5217\u8868
+car.list.applicationPlugin                    = Application plugins in local server:
 car.list.assemblyArtifactId                   = Assembly artifactId:
 car.list.assemblyFormat                       = Assembly format:
 car.list.assemblyGroupId                      = Assembly groupId:
 car.list.assemblyPath                         = Assembly target path:
 car.list.assemblyVersion                      = Assembly version:
 car.list.noPlugins                            = \u6B64\u7AD9\u70B9\u4E0B\u6CA1\u6709Plugin.
-car.list.pluginLocal                          = Plugins in local server
 car.list.pluginRepo                           = Plugins\u4F4D\u4E8E
+car.list.systemPlugin                         = System plugins in local server:
 car.pluginParams.JVMVersionsExp               = \u4E00\u4E2A\u53EF\u9009\u7684\u5217\u8868\uFF0C\u7528\u4E8E\u5217\u51FA\u8FD9\u4E2A\u63D2\u4EF6\u652F\u6301\u7684JVM\u7248\u672C\u7684\u524D\u7F00\u3002\u5982\u679C\u6CA1\u6709\u5217\u51FA\u4EFB\u4F55\u503C\u7684\u8BDD\uFF0C\u8FD9\u4E2A\u63D2\u4EF6\u53EF\u5B89\u88C5\u5728\u8FD0\u884C\u4E8E\u4EFB\u4F55\u7248\u672C\u7684JVM\u7684Geronimo\u4E2D\u3002\u4E0D\u7136\u7684\u8BDD\uFF0C\u6BCF\u4E00\u884C\u5217\u51FA\u4E00\u4E2A\u53EF\u63A5\u53D7\u7684JVM\u7248\u672C\u524D\u7F00\uFF0C\u5C31\u50CF"1.4.2&nbsp;\r\n&nbsp;1.5&nbsp;\r\n&nbsp;..." (\u5F53\u7136\uFF0C\u7406\u60F3\u60C5\u51B5\u4E0B\uFF0C\u8FD9\u610F\u5473\u7740\u5728\u8FD9\u91CC\u5217\u51FA\u7684JVN\u7248\u672C\u4E2D\uFF0C\u4F60\u786E\u5B9E\u5DF2\u7ECF\u6D4B\u8BD5\u8FC7\u8FD9\u4E2A\u63D2\u4EF6)\u3002
 car.pluginParams.authorExp                    = \u63D2\u4EF6\u7684\u4F5C\u8005\uFF0C\u8FD9\u53EF\u80FD\u662F\u4EBA\u540D\uFF0C\u516C\u53F8\u540D\uFF0C\u5F00\u6E90\u9879\u76EE\u7684\u540D\u79F0\u7B49\u7B49\u3002
 car.pluginParams.categoryExp                  = \u8FD9\u4E2A\u63D2\u4EF6\u5C5E\u4E8E\u7684\u7C7B\u522B\u3002\u540C\u4E00\u4E2A\u7C7B\u522B\u7684\u63D2\u4EF6\u4F1A\u4E00\u8D77\u5217\u51FA\u3002\u5982\u679C\u60F3\u8BA9\u8FD9\u4E2A\u63D2\u88AB\u5217\u5728geronimoplugins.com\u4E0B\u9762\uFF0C\u4F60\u5E94\u8BE5\u5728\u7C7B\u522B\u540D\u5B57\u4E2D\u5305\u542B\u5B83\u3002\u4E0D\u7136\uFF0C\u4F60\u53EF\u4EE5\u968F\u610F\u5730\u9009\u62E9\u7C7B\u522B\u7684\u540D\u5B57\uFF0C\u6216\u8005\u6839\u636E\u4F60\u6253\u7B97\u628A\u5B83\u653E\u5728\u4ED3\u5E93\u7684\u90A3\u4E2A\u7C7B\u522B\u4E0B\u9762\u6765\u9009\u53D6\u540D\u79F0\u3002

Modified: geronimo/server/trunk/plugins/console/plugin-portlets/src/main/webapp/WEB-INF/view/car/assemblylist.jsp
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/console/plugin-portlets/src/main/webapp/WEB-INF/view/car/assemblylist.jsp?rev=687390&r1=687389&r2=687390&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/console/plugin-portlets/src/main/webapp/WEB-INF/view/car/assemblylist.jsp (original)
+++ geronimo/server/trunk/plugins/console/plugin-portlets/src/main/webapp/WEB-INF/view/car/assemblylist.jsp Wed Aug 20 10:29:30 2008
@@ -78,12 +78,13 @@
   </td>
 </table>
 
-    <h3><fmt:message key="car.list.pluginLocal"/></h3>
+    
 
+    <h3><fmt:message key="car.list.applicationPlugin"/></h3>
 <table border="0" cellpadding="3">
 <tr>
   <th class="DarkBackground">&nbsp;</th>
-  <c:forEach var="column" items="Name,Version,Category">
+  <c:forEach var="column" items="ConfigId,Version,Category">
   <th class="DarkBackground"><a href='<portlet:actionURL>
 	                                   <portlet:param name="column" value="${column}"/>
 	                                   <portlet:param name="mode" value="index-after"/>
@@ -93,6 +94,40 @@
 <c:forEach var="plugin" items="${plugins}" varStatus="status">
 <c:set var="style" value="${status.index % 2 == 0 ? 'MediumBackground' : 'LightBackground'}"/>
 <c:set var="artifact" value="${plugin.pluginArtifact.moduleId}"/>
+<c:if test="${!plugin.isSystemPlugin}">
+<tr>
+  <td class="${style}">
+    <input type="checkbox" name="plugin" title="${artifact.groupId}/${artifact.artifactId}/${artifact.version}/${artifact.type}" value="${artifact.groupId}/${artifact.artifactId}/${artifact.version}/${artifact.type}"/>
+  </td>
+  <td class="${style}">
+    <a href='<portlet:actionURL>
+    <portlet:param name="configId" value="${artifact.groupId}/${artifact.artifactId}/${artifact.version}/${artifact.type}"/>
+    <portlet:param name="mode" value="assemblyView-before"/>
+    </portlet:actionURL>'>${artifact.groupId}/${artifact.artifactId}/${artifact.version}/${artifact.type}</a>
+  </td>
+  <td class="${style}">${artifact.version}</td>
+  <td class="${style}">${plugin.category}</td>
+</tr>
+</c:if>    
+</c:forEach>
+
+</table>
+
+    <h3><fmt:message key="car.list.systemPlugin"/></h3>
+<table border="0" cellpadding="3">
+<tr>
+  <th class="DarkBackground">&nbsp;</th>
+  <c:forEach var="column" items="ConfigId,Version,Category">
+  <th class="DarkBackground"><a href='<portlet:actionURL>
+	                                   <portlet:param name="column" value="${column}"/>
+	                                   <portlet:param name="mode" value="index-after"/>
+	                                  </portlet:actionURL>'>${column}</a></th>
+  </c:forEach>
+</tr>
+<c:forEach var="plugin" items="${plugins}" varStatus="status">
+<c:set var="style" value="${status.index % 2 == 0 ? 'MediumBackground' : 'LightBackground'}"/>
+<c:set var="artifact" value="${plugin.pluginArtifact.moduleId}"/>
+<c:if test="${plugin.isSystemPlugin}">
 <tr>
     <td class="${style}">
         <input type="checkbox" name="plugin" title="${artifact.groupId}/${artifact.artifactId}/${artifact.version}/${artifact.type}" value="${artifact.groupId}/${artifact.artifactId}/${artifact.version}/${artifact.type}"/>
@@ -101,11 +136,12 @@
     <a href='<portlet:actionURL>
       <portlet:param name="configId" value="${artifact.groupId}/${artifact.artifactId}/${artifact.version}/${artifact.type}"/>
       <portlet:param name="mode" value="assemblyView-before"/>
-    </portlet:actionURL>'>${plugin.name}</a>
+    </portlet:actionURL>'>${artifact.groupId}/${artifact.artifactId}/${artifact.version}/${artifact.type}</a>
   </td>
   <td class="${style}">${artifact.version}</td>
   <td class="${style}">${plugin.category}</td>
 </tr>
+</c:if>
 </c:forEach>
 </table>
     <input type="submit" value='<fmt:message key="car.common.assemble"/>' onclick="if(!checkAllVal('plugin')){return false;}else return true;"/>