]> source.dussan.org Git - archiva.git/commitdiff
[MRM-1440] add a system status page
authorBrett Porter <brett@apache.org>
Mon, 6 Dec 2010 13:17:48 +0000 (13:17 +0000)
committerBrett Porter <brett@apache.org>
Mon, 6 Dec 2010 13:17:48 +0000 (13:17 +0000)
git-svn-id: https://svn.apache.org/repos/asf/archiva/branches/archiva-1.3.x@1042625 13f79535-47bb-0310-9956-ffa450edef68

archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/SystemStatusAction.java [new file with mode: 0644]
archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml
archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/systemStatus.jsp [new file with mode: 0644]
archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/decorators/default.jsp

diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/SystemStatusAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/SystemStatusAction.java
new file mode 100644 (file)
index 0000000..9334fd4
--- /dev/null
@@ -0,0 +1,114 @@
+package org.apache.maven.archiva.web.action.admin;
+
+/*
+ * 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.
+ */
+
+import com.opensymphony.xwork2.Preparable;
+import org.apache.maven.archiva.configuration.ArchivaConfiguration;
+import org.apache.maven.archiva.configuration.Configuration;
+import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
+import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration;
+import org.apache.maven.archiva.configuration.functors.RepositoryConfigurationComparator;
+import org.apache.maven.archiva.database.ArchivaDAO;
+import org.apache.maven.archiva.database.constraints.MostRecentRepositoryScanStatistics;
+import org.apache.maven.archiva.model.RepositoryContentStatistics;
+import org.apache.maven.archiva.repository.scanner.RepositoryScanner;
+import org.apache.maven.archiva.security.ArchivaRoleConstants;
+import org.apache.maven.archiva.web.action.PlexusActionSupport;
+import org.apache.maven.archiva.web.util.ContextUtils;
+import org.apache.struts2.interceptor.ServletRequestAware;
+import org.codehaus.plexus.cache.Cache;
+import org.codehaus.plexus.redback.rbac.Resource;
+import org.codehaus.plexus.taskqueue.TaskQueue;
+import org.codehaus.redback.integration.interceptor.SecureAction;
+import org.codehaus.redback.integration.interceptor.SecureActionBundle;
+import org.codehaus.redback.integration.interceptor.SecureActionException;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * Shows system status information for the administrator.
+ *
+ * @version $Id$
+ * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="systemStatus" instantiation-strategy="per-lookup"
+ */
+public class SystemStatusAction
+    extends PlexusActionSupport
+    implements SecureAction
+{
+    /**
+     * @plexus.requirement role="org.codehaus.plexus.taskqueue.TaskQueue"
+     */
+    private Map<String,TaskQueue> queues;
+
+    /**
+     * @plexus.requirement role="org.codehaus.plexus.cache.Cache"
+     */
+    private Map<String,Cache> caches;
+
+    private String memoryStatus;
+
+    public SecureActionBundle getSecureActionBundle()
+        throws SecureActionException
+    {
+        SecureActionBundle bundle = new SecureActionBundle();
+
+        bundle.setRequiresAuthentication( true );
+        bundle.addRequiredAuthorization( ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION, Resource.GLOBAL );
+
+        return bundle;
+    }
+
+    public String execute()
+    {
+        Runtime runtime = Runtime.getRuntime();
+        runtime.gc();
+        long total = runtime.totalMemory();
+        long used = total - runtime.freeMemory();
+        long max = runtime.maxMemory();
+        memoryStatus = formatMemory(used) + "/" + formatMemory(total) + " (Max: " + formatMemory(max) + ")";
+        
+        return SUCCESS;
+    }
+
+    private static String formatMemory( long l )
+    {
+      return  l / ( 1024 * 1024 ) + "M";
+    }
+
+    public String getMemoryStatus()
+    {
+        return memoryStatus;
+    }
+
+    public Map<String, Cache> getCaches()
+    {
+        return caches;
+    }
+
+    public Map<String, TaskQueue> getQueues()
+    {
+        return queues;
+    }
+}
index 1760450a5fa983105891e9fd0b3c48a81922189a..ce7d090b9d53e8df1ee4219ffc68958f22ab6c3a 100644 (file)
       </result>
     </action>
 
+    <action name="systemStatus" class="systemStatus">
+      <result name="success">/WEB-INF/jsp/admin/systemStatus.jsp</result>
+    </action>
+
     <!-- .\ LEGACY SUPPORT \.__________________________________________ -->
 
     <action name="legacyArtifactPath" class="legacyArtifactPathAction" method="input">
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/systemStatus.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/systemStatus.jsp
new file mode 100644 (file)
index 0000000..438aa4d
--- /dev/null
@@ -0,0 +1,85 @@
+<%--
+  ~ 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.
+  --%>
+
+<%@ page contentType="text/html; charset=UTF-8" %>
+<%@ taglib prefix="s" uri="/struts-tags" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+
+<html>
+<head>
+  <title>Administration - System Status</title>
+  <s:head/>
+</head>
+
+<body>
+
+<h1>Administration - System Status</h1>
+
+<div id="contentArea">
+
+  <s:actionerror/>
+  <s:actionmessage/>
+
+  <h2>Queues</h2>
+
+  <table>
+    <tr>
+      <th>Queue</th>
+      <th>Size</th>
+    </tr>
+    <c:forEach var="queueEntry" items="${queues}">
+      <c:set var="queue" value="${queueEntry.value.queueSnapshot}"/>
+      <tr>
+        <td>${queueEntry.key}</td>
+        <td>${fn:length(queue)}</td>
+      </tr>
+    </c:forEach>
+  </table>
+
+  <h2>Caches</h2>
+
+  <table>
+    <tr>
+      <th>Cache</th>
+      <th>Size</th>
+      <th>Hits</th>
+      <th>Misses</th>
+      <th>Hit Ratio</th>
+      <th>&nbsp;</th>
+    </tr>
+    <c:forEach var="cacheEntry" items="${caches}">
+      <tr>
+        <td>${cacheEntry.key}</td>
+        <td>${cacheEntry.value.statistics.size}</td>
+        <td>${cacheEntry.value.statistics.cacheHits}</td>
+        <td>${cacheEntry.value.statistics.cacheMiss}</td>
+        <td><fmt:formatNumber value="${cacheEntry.value.statistics.cacheHitRate}" pattern="#%"/></td>
+        <td><a href="javascript:alert('Not yet implemented')">Flush</a></td>
+      </tr>
+    </c:forEach>
+  </table>
+
+  <h2>Memory</h2>
+
+  <p>${memoryStatus}</p>
+
+</body>
+</html>
index 1f0defa04c78400c70397618a56258dd0ba76794..bd9a5f5ef4d1856b7b270d1f35776fb58b5ed73c 100644 (file)
         </li>
         <li class="none">
           <my:currentWWUrl action="database" namespace="/admin">Database</my:currentWWUrl>
+        </li>
+        <li class="none">
+          <my:currentWWUrl action="systemStatus" namespace="/admin">System Statu</my:currentWWUrl>
         </li>
           <%-- TODO: future options here.
                * Repository Syncing Connectors. (rsync, ftp, scp, etc...)