-added row count config in statistics report
-added pagination in report


git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@701033 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Maria Odea B. Ching 2008-10-02 08:35:42 +00:00
parent 8dfa0492c0
commit 31d7e35159
3 changed files with 269 additions and 98 deletions

View File

@ -22,6 +22,8 @@
import com.opensymphony.webwork.interceptor.ServletRequestAware;
import com.opensymphony.xwork.Preparable;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
import org.apache.maven.archiva.database.ArchivaDAO;
import org.apache.maven.archiva.database.ArchivaDatabaseException;
@ -51,6 +53,8 @@
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
@ -123,9 +127,9 @@ public class GenerateReportAction
private List<String> availableRepositories;
private Date startDate;
private String startDate;
private Date endDate;
private String endDate;
private int reposSize;
@ -133,6 +137,11 @@ public class GenerateReportAction
private List<RepositoryStatistics> repositoryStatistics = new ArrayList<RepositoryStatistics>();
private DataLimits limits = new DataLimits();
private String[] datePatterns = new String[] { "MM/dd/yy", "MM/dd/yyyy", "MMMMM/dd/yyyy", "MMMMM/dd/yy",
"dd MMMMM yyyy", "dd/MM/yy", "dd/MM/yyyy", "yyyy/MM/dd" };
public void prepare()
{
repositoryIds = new ArrayList<String>();
@ -177,9 +186,48 @@ public Collection<String> getRepositoryIds()
*/
public String generateStatistics()
{
DataLimits limits = new DataLimits();
setDefaults();
if( rowCount < 10 )
{
addFieldError( "rowCount", "Row count must be larger than 10." );
return INPUT;
}
reposSize = selectedRepositories.size();
Date startDateInDateFormat = null;
Date endDateInDateFormat = null;
if( startDate == null || "".equals( startDate ) )
{
startDateInDateFormat = getDefaultStartDate();
}
else
{
try
{
startDateInDateFormat = DateUtils.parseDate( startDate, datePatterns );
}
catch ( ParseException e )
{
addFieldError( "startDate", "Invalid date format.");
return INPUT;
}
}
if( endDate == null || "".equals( endDate ) )
{
endDateInDateFormat = getDefaultEndDate();
}
else
{
try
{
endDateInDateFormat = DateUtils.parseDate( endDate, datePatterns );
}
catch ( ParseException e )
{
addFieldError( "endDate", "Invalid date format.");
return INPUT;
}
}
try
{
@ -197,7 +245,7 @@ public String generateStatistics()
try
{
List contentStats = repoContentStatsDao.queryRepositoryContentStatistics(
new RepositoryContentStatisticsByRepositoryConstraint( repo, startDate, endDate ) );
new RepositoryContentStatisticsByRepositoryConstraint( repo, startDateInDateFormat, endDateInDateFormat ) );
if( contentStats == null || contentStats.isEmpty() )
{
@ -206,7 +254,7 @@ public String generateStatistics()
continue;
}
repositoryStatistics.addAll( generator.generateReport( contentStats, repo, startDate, endDate, limits ) );
repositoryStatistics.addAll( generator.generateReport( contentStats, repo, startDateInDateFormat, endDateInDateFormat, limits ) );
}
catch ( ObjectNotFoundException oe )
{
@ -229,7 +277,7 @@ else if ( selectedRepositories.size() == 1 )
try
{
List<RepositoryContentStatistics> contentStats = repoContentStatsDao.queryRepositoryContentStatistics(
new RepositoryContentStatisticsByRepositoryConstraint( selectedRepo, startDate, endDate ) );
new RepositoryContentStatisticsByRepositoryConstraint( selectedRepo, startDateInDateFormat, endDateInDateFormat ) );
if( contentStats == null || contentStats.isEmpty() )
{
@ -242,7 +290,7 @@ else if ( selectedRepositories.size() == 1 )
int totalPages = ( limits.getTotalCount() / limits.getPerPageCount() ) + extraPage;
limits.setCountOfPages( totalPages );
repositoryStatistics = generator.generateReport( contentStats, selectedRepo, startDate, endDate, limits );
repositoryStatistics = generator.generateReport( contentStats, selectedRepo, startDateInDateFormat, endDateInDateFormat, limits );
}
catch ( ObjectNotFoundException oe )
{
@ -259,7 +307,23 @@ else if ( selectedRepositories.size() == 1 )
{
addFieldError( "availableRepositories", "Please select a repository (or repositories) from the list." );
return INPUT;
}
}
if( repositoryStatistics.isEmpty() )
{
return BLANK;
}
if( startDate.equals( getDefaultStartDate() ) )
{
startDate = null;
}
else
{
startDate = DateFormatUtils.format( startDateInDateFormat, "MM/dd/yyyy" );
}
endDate = DateFormatUtils.format( endDateInDateFormat, "MM/dd/yyyy" );
}
catch ( ArchivaReportException e )
{
@ -269,21 +333,19 @@ else if ( selectedRepositories.size() == 1 )
return SUCCESS;
}
private void setDefaults()
private Date getDefaultStartDate()
{
if( startDate == null )
{
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set( 1900, 1, 1, 0, 0, 0 );
startDate = cal.getTime();
}
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set( 1900, 1, 1, 0, 0, 0 );
if( endDate == null )
{
endDate = Calendar.getInstance().getTime();
}
return cal.getTime();
}
private Date getDefaultEndDate()
{
return Calendar.getInstance().getTime();
}
public String execute()
@ -525,22 +587,22 @@ public void setAvailableRepositories( List<String> availableRepositories )
this.availableRepositories = availableRepositories;
}
public Date getStartDate()
public String getStartDate()
{
return startDate;
}
public void setStartDate( Date startDate )
public void setStartDate( String startDate )
{
this.startDate = startDate;
}
public Date getEndDate()
public String getEndDate()
{
return endDate;
}
public void setEndDate( Date endDate )
public void setEndDate( String endDate )
{
this.endDate = endDate;
}
@ -574,4 +636,14 @@ public void setSelectedRepo( String selectedRepo )
{
this.selectedRepo = selectedRepo;
}
public DataLimits getLimits()
{
return limits;
}
public void setLimits( DataLimits limits )
{
this.limits = limits;
}
}

View File

@ -39,6 +39,7 @@
<ww:datepicker label="Start Date" name="startDate" id="startDate"/>
<ww:datepicker label="End Date" name="endDate" id="endDate"/>
<ww:textfield label="Row Count" name="rowCount" />
<ww:submit value="View Statistics"/>
</ww:form>

View File

@ -30,84 +30,182 @@
<body>
<h1>Statistics Report</h1>
<c:url var="imgNextPageUrl" value="/images/icon_next_page.gif"/>
<c:url var="imgPrevPageUrl" value="/images/icon_prev_page.gif"/>
<c:url var="imgPrevPageDisabledUrl" value="/images/icon_prev_page_disabled.gif"/>
<c:url var="imgNextPageDisabledUrl" value="/images/icon_next_page_disabled.gif"/>
<div id="contentArea">
<%-- TODO: fix problem in date format! --%>
<%-- Pagination - start --%>
<p>
<%-- Set Prev & Next icons --%>
<c:set var="prevPageUrl">
<ww:url action="generateStatisticsReport" namespace="/report">
<ww:param name="selectedRepositories" value="%{'${selectedRepositories}'}"/>
<ww:param name="rowCount" value="%{'${rowCount}'}"/>
<ww:param name="startDate" value="%{'${startDate}'}"/>
<ww:param name="endDate" value="%{'${endDate}'}"/>
<ww:param name="page" value="%{'${page - 1}'}"/>
</ww:url>
</c:set>
<c:set var="nextPageUrl">
<ww:url action="generateStatisticsReport" namespace="/report">
<ww:param name="selectedRepositories" value="%{'${selectedRepositories}'}"/>
<ww:param name="rowCount" value="%{'${rowCount}'}"/>
<ww:param name="startDate" value="%{'${startDate}'}"/>
<ww:param name="endDate" value="%{'${endDate}'}"/>
<ww:param name="page" value="%{'${page + 1}'}"/>
</ww:url>
</c:set>
<c:choose>
<c:when test="${reposSize > 1}">
<c:when test="${page == 1}">
<img src="${imgPrevPageDisabledUrl}"/>
</c:when>
<c:otherwise>
<a href="${prevPageUrl}">
<img src="${imgPrevPageUrl}"/>
</a>
</c:otherwise>
</c:choose>
<%-- Google-style pagination --%>
<c:choose>
<c:when test="${limits.countOfPages > 11}">
<c:choose>
<c:when test="${(page - 5) < 0}">
<c:set var="beginVal">0</c:set>
<c:set var="endVal">10</c:set>
</c:when>
<c:when test="${(page + 5) > (limits.countOfPages - 1)}">
<c:set var="beginVal">${(limits.countOfPages -1) - 10}</c:set>
<c:set var="endVal">${limits.countOfPages - 1}</c:set>
</c:when>
<c:otherwise>
<c:set var="beginVal">${page - 5}</c:set>
<c:set var="endVal">${page + 5}</c:set>
</c:otherwise>
</c:choose>
</c:when>
<c:otherwise>
<c:set var="beginVal">0</c:set>
<c:set var="endVal">${limits.countOfPages - 1}</c:set>
</c:otherwise>
</c:choose>
<c:forEach var="i" begin="${beginVal}" end="${endVal}">
<c:choose>
<c:when test="${i != (page - 1)}">
<c:set var="specificPageUrl">
<ww:url action="generateStatisticsReport" namespace="/report">
<ww:param name="selectedRepositories" value="%{'${selectedRepositories}'}"/>
<ww:param name="rowCount" value="%{'${rowCount}'}"/>
<ww:param name="startDate" value="%{'${startDate}'}"/>
<ww:param name="endDate" value="%{'${endDate}'}"/>
<ww:param name="page" value="%{'${page + 1}'}"/>
</ww:url>
</c:set>
<a href="${specificPageUrl}">${i + 1}</a>
</c:when>
<c:otherwise>
<b>${i + 1}</b>
</c:otherwise>
</c:choose>
</c:forEach>
<c:choose>
<c:when test="${page == limits.countOfPages}">
<img src="${imgNextPageDisabledUrl}"/>
</c:when>
<c:otherwise>
<a href="${nextPageUrl}">
<img src="${imgNextPageUrl}"/>
</a>
</c:otherwise>
</c:choose>
</p>
<%-- Pagination - end --%>
<c:choose>
<c:when test="${reposSize > 1}">
<h1>Latest Statistics Comparison Report</h1>
<table class="infoTable" border="1">
<tr>
<th>Repository</th>
<th>Total File Count</th>
<th>Total Size</th>
<th>Artifact Count</th>
<th>Group Count</th>
<th>Project Count</th>
<th>Plugins</th>
<th>Archetypes</th>
<th>Jars</th>
<th>Wars</th>
<th>Deployments</th>
<th>Downloads</th>
</tr>
<h1>Latest Statistics Comparison Report</h1>
<table class="infoTable" border="1">
<tr>
<th>Repository</th>
<th>Total File Count</th>
<th>Total Size</th>
<th>Artifact Count</th>
<th>Group Count</th>
<th>Project Count</th>
<th>Plugins</th>
<th>Archetypes</th>
<th>Jars</th>
<th>Wars</th>
<th>Deployments</th>
<th>Downloads</th>
</tr>
<c:forEach var="stats" items="${repositoryStatistics}">
<tr>
<td>${stats.repositoryId}</td>
<td align="right">${stats.fileCount}</td>
<td align="right">${stats.totalSize}</td>
<td align="right">${stats.artifactCount}</td>
<td align="right">${stats.groupCount}</td>
<td align="right">${stats.projectCount}</td>
<td align="right">${stats.pluginCount}</td>
<td align="right">${stats.archetypeCount}</td>
<td align="right">${stats.jarCount}</td>
<td align="right">${stats.warCount}</td>
<td align="right">${stats.deploymentCount}</td>
<td align="right">${stats.downloadCount}</td>
</tr>
</c:forEach>
</table>
</c:when>
<c:otherwise>
<c:forEach var="stats" items="${repositoryStatistics}">
<tr>
<td>${stats.repositoryId}</td>
<td align="right">${stats.fileCount}</td>
<td align="right">${stats.totalSize}</td>
<td align="right">${stats.artifactCount}</td>
<td align="right">${stats.groupCount}</td>
<td align="right">${stats.projectCount}</td>
<td align="right">${stats.pluginCount}</td>
<td align="right">${stats.archetypeCount}</td>
<td align="right">${stats.jarCount}</td>
<td align="right">${stats.warCount}</td>
<td align="right">${stats.deploymentCount}</td>
<td align="right">${stats.downloadCount}</td>
</tr>
</c:forEach>
</table>
</c:when>
<c:otherwise>
<h1>Statistics for Repository '${selectedRepo}'</h1>
<table class="infoTable" border="1">
<tr>
<th>Date of Scan</th>
<th>Total File Count</th>
<th>Total Size</th>
<th>Artifact Count</th>
<th>Group Count</th>
<th>Project Count</th>
<th>Plugins</th>
<th>Archetypes</th>
<th>Jars</th>
<th>Wars</th>
<th>Deployments</th>
<th>Downloads</th>
</tr>
<h1>Statistics for Repository '${selectedRepo}'</h1>
<table class="infoTable" border="1">
<tr>
<th>Date of Scan</th>
<th>Total File Count</th>
<th>Total Size</th>
<th>Artifact Count</th>
<th>Group Count</th>
<th>Project Count</th>
<th>Plugins</th>
<th>Archetypes</th>
<th>Jars</th>
<th>Wars</th>
<th>Deployments</th>
<th>Downloads</th>
</tr>
<c:forEach var="stats" items="${repositoryStatistics}">
<tr>
<td align="right">${stats.dateOfScan}</td>
<td align="right">${stats.fileCount}</td>
<td align="right">${stats.totalSize}</td>
<td align="right">${stats.artifactCount}</td>
<td align="right">${stats.groupCount}</td>
<td align="right">${stats.projectCount}</td>
<td align="right">${stats.pluginCount}</td>
<td align="right">${stats.archetypeCount}</td>
<td align="right">${stats.jarCount}</td>
<td align="right">${stats.warCount}</td>
<td align="right">${stats.deploymentCount}</td>
<td align="right">${stats.downloadCount}</td>
</tr>
</c:forEach>
</table>
</c:otherwise>
<c:forEach var="stats" items="${repositoryStatistics}">
<tr>
<td align="right">${stats.dateOfScan}</td>
<td align="right">${stats.fileCount}</td>
<td align="right">${stats.totalSize}</td>
<td align="right">${stats.artifactCount}</td>
<td align="right">${stats.groupCount}</td>
<td align="right">${stats.projectCount}</td>
<td align="right">${stats.pluginCount}</td>
<td align="right">${stats.archetypeCount}</td>
<td align="right">${stats.jarCount}</td>
<td align="right">${stats.warCount}</td>
<td align="right">${stats.deploymentCount}</td>
<td align="right">${stats.downloadCount}</td>
</tr>
</c:forEach>
</table>
</c:otherwise>
</c:choose>
</div>