/* * Copyright 2015 gitblit.com. * * Licensed 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 com.gitblit.wicket.pages; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.wicket.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.markup.repeater.data.ListDataProvider; import com.gitblit.Constants; import com.gitblit.Keys; import com.gitblit.models.FilestoreModel; import com.gitblit.models.FilestoreModel.Status; import com.gitblit.models.UserModel; import com.gitblit.wicket.CacheControl; import com.gitblit.wicket.FilestoreUI; import com.gitblit.wicket.GitBlitWebSession; import com.gitblit.wicket.WicketUtils; import com.gitblit.wicket.CacheControl.LastModified; /** * Page to display the current status of the filestore. * Certain errors also displayed to aid in fault finding * * @author Paul Martin */ @CacheControl(LastModified.ACTIVITY) public class FilestorePage extends RootPage { public FilestorePage(PageParameters params) { super(params); setupPage("", ""); int itemsPerPage = app().settings().getInteger(Keys.web.itemsPerPage, 20); if (itemsPerPage <= 1) { itemsPerPage = 20; } final int pageNumber = WicketUtils.getPage(params); final String filter = WicketUtils.getSearchString(params); int prevPage = Math.max(0, pageNumber - 1); int nextPage = pageNumber + 1; boolean hasMore = false; final UserModel user = (GitBlitWebSession.get().getUser() == null) ? UserModel.ANONYMOUS : GitBlitWebSession.get().getUser(); final long nBytesUsed = app().filestore().getFilestoreUsedByteCount(); final long nBytesAvailable = app().filestore().getFilestoreAvailableByteCount(); List files = app().filestore().getAllObjects(user); if (files == null) { files = new ArrayList(); } long nOk = 0; long nPending = 0; long nInprogress = 0; long nError = 0; long nDeleted = 0; for (FilestoreModel file : files) { switch (file.getStatus()) { case Available: { nOk++;} break; case Upload_Pending: { nPending++; } break; case Upload_In_Progress: { nInprogress++; } break; case Deleted: { nDeleted++; } break; default: { nError++; } break; } } BookmarkablePageLink itemOk = new BookmarkablePageLink("filterByOk", FilestorePage.class, WicketUtils.newFilestorePageParameter(prevPage, SortBy.ok.name())); BookmarkablePageLink itemPending = new BookmarkablePageLink("filterByPending", FilestorePage.class, WicketUtils.newFilestorePageParameter(prevPage, SortBy.pending.name())); BookmarkablePageLink itemInprogress = new BookmarkablePageLink("filterByInprogress", FilestorePage.class, WicketUtils.newFilestorePageParameter(prevPage, SortBy.inprogress.name())); BookmarkablePageLink itemError = new BookmarkablePageLink("filterByError", FilestorePage.class, WicketUtils.newFilestorePageParameter(prevPage, SortBy.error.name())); BookmarkablePageLink itemDeleted = new BookmarkablePageLink("filterByDeleted", FilestorePage.class, WicketUtils.newFilestorePageParameter(prevPage, SortBy.deleted.name())); List filteredResults = new ArrayList(files.size()); if (filter == null) { filteredResults = files; } else if (filter.equals(SortBy.ok.name())) { WicketUtils.setCssClass(itemOk, "filter-on"); for (FilestoreModel item : files) { if (item.getStatus() == Status.Available) { filteredResults.add(item); } } } else if (filter.equals(SortBy.pending.name())) { WicketUtils.setCssClass(itemPending, "filter-on"); for (FilestoreModel item : files) { if (item.getStatus() == Status.Upload_Pending) { filteredResults.add(item); } } } else if (filter.equals(SortBy.inprogress.name())) { WicketUtils.setCssClass(itemInprogress, "filter-on"); for (FilestoreModel item : files) { if (item.getStatus() == Status.Upload_In_Progress) { filteredResults.add(item); } } } else if (filter.equals(SortBy.error.name())) { WicketUtils.setCssClass(itemError, "filter-on"); for (FilestoreModel item : files) { if (item.isInErrorState()) { filteredResults.add(item); } } } else if (filter.equals(SortBy.deleted.name())) { WicketUtils.setCssClass(itemDeleted, "filter-on"); for (FilestoreModel item : files) { if (item.getStatus() == Status.Deleted) { filteredResults.add(item); } } } DataView filesView = new DataView("fileRow", new ListDataProvider(filteredResults) , itemsPerPage) { private static final long serialVersionUID = 1L; private int counter; @Override protected void onBeforeRender() { super.onBeforeRender(); counter = 0; } @Override public void populateItem(final Item item) { final FilestoreModel entry = item.getModelObject(); DateFormat dateFormater = new SimpleDateFormat(Constants.ISO8601); UserModel user = app().users().getUserModel(entry.getChangedBy()); user = user == null ? UserModel.ANONYMOUS : user; Label icon = FilestoreUI.getStatusIcon("status", entry); item.add(icon); item.add(new Label("on", dateFormater.format(entry.getChangedOn()))); item.add(new Label("by", user.getDisplayName())); item.add(new Label("oid", entry.oid)); item.add(new Label("size", FileUtils.byteCountToDisplaySize(entry.getSize()))); WicketUtils.setAlternatingBackground(item, counter); counter++; } }; if (filteredResults.size() < itemsPerPage) { filesView.setCurrentPage(0); hasMore = false; } else { filesView.setCurrentPage(pageNumber - 1); hasMore = true; } add(filesView); add(new BookmarkablePageLink("firstPageBottom", FilestorePage.class).setEnabled(pageNumber > 1)); add(new BookmarkablePageLink("prevPageBottom", FilestorePage.class, WicketUtils.newFilestorePageParameter(prevPage, filter)).setEnabled(pageNumber > 1)); add(new BookmarkablePageLink("nextPageBottom", FilestorePage.class, WicketUtils.newFilestorePageParameter(nextPage, filter)).setEnabled(hasMore)); itemOk.add(FilestoreUI.getStatusIcon("statusOkIcon", FilestoreModel.Status.Available)); itemPending.add(FilestoreUI.getStatusIcon("statusPendingIcon", FilestoreModel.Status.Upload_Pending)); itemInprogress.add(FilestoreUI.getStatusIcon("statusInprogressIcon", FilestoreModel.Status.Upload_In_Progress)); itemError.add(FilestoreUI.getStatusIcon("statusErrorIcon", FilestoreModel.Status.Error_Unknown)); itemDeleted.add(FilestoreUI.getStatusIcon("statusDeletedIcon", FilestoreModel.Status.Deleted)); itemOk.add(new Label("statusOkCount", String.valueOf(nOk))); itemPending.add(new Label("statusPendingCount", String.valueOf(nPending))); itemInprogress.add(new Label("statusInprogressCount", String.valueOf(nInprogress))); itemError.add(new Label("statusErrorCount", String.valueOf(nError))); itemDeleted.add(new Label("statusDeletedCount", String.valueOf(nDeleted))); add(itemOk); add(itemPending); add(itemInprogress); add(itemError); add(itemDeleted); add(new Label("spaceAvailable", String.format("%s / %s", FileUtils.byteCountToDisplaySize(nBytesUsed), FileUtils.byteCountToDisplaySize(nBytesAvailable)))); BookmarkablePageLink helpLink = new BookmarkablePageLink("filestoreHelp", FilestoreUsage.class); helpLink.add(new Label("helpMessage", getString("gb.filestoreHelp"))); add(helpLink); } protected enum SortBy { ok, pending, inprogress, error, deleted; } }