Paul Martin
2016-04-07 91aad771ac411b317139bab1b862e9d9cfd4e59d
commit | author | age
bd0e83 1 /*
PM 2  * Copyright 2015 gitblit.com.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.gitblit.wicket.pages;
17
18 import java.text.DateFormat;
19 import java.text.SimpleDateFormat;
697905 20 import java.util.ArrayList;
bd0e83 21 import java.util.List;
PM 22
23 import org.apache.commons.io.FileUtils;
91aad7 24 import org.apache.wicket.PageParameters;
bd0e83 25 import org.apache.wicket.markup.html.basic.Label;
PM 26 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
27 import org.apache.wicket.markup.repeater.Item;
28 import org.apache.wicket.markup.repeater.data.DataView;
29 import org.apache.wicket.markup.repeater.data.ListDataProvider;
30
31 import com.gitblit.Constants;
91aad7 32 import com.gitblit.Keys;
bd0e83 33 import com.gitblit.models.FilestoreModel;
91aad7 34 import com.gitblit.models.FilestoreModel.Status;
bd0e83 35 import com.gitblit.models.UserModel;
697905 36 import com.gitblit.wicket.CacheControl;
bd0e83 37 import com.gitblit.wicket.FilestoreUI;
697905 38 import com.gitblit.wicket.GitBlitWebSession;
bd0e83 39 import com.gitblit.wicket.WicketUtils;
697905 40 import com.gitblit.wicket.CacheControl.LastModified;
bd0e83 41
PM 42 /**
43  * Page to display the current status of the filestore.
6069be 44  * Certain errors also displayed to aid in fault finding
bd0e83 45  *
PM 46  * @author Paul Martin
47  */
697905 48 @CacheControl(LastModified.ACTIVITY)
bd0e83 49 public class FilestorePage extends RootPage {
PM 50
91aad7 51     public FilestorePage(PageParameters params) {
PM 52         super(params);
bd0e83 53         setupPage("", "");
6069be 54
91aad7 55         int itemsPerPage = app().settings().getInteger(Keys.web.itemsPerPage, 20);
PM 56         if (itemsPerPage <= 1) {
57             itemsPerPage = 20;
58         }
59         
60         final int pageNumber = WicketUtils.getPage(params);
61         final String filter = WicketUtils.getSearchString(params);
62         
63         int prevPage = Math.max(0, pageNumber - 1);
64         int nextPage = pageNumber + 1;
65         boolean hasMore = false;
66         
697905 67         final UserModel user = (GitBlitWebSession.get().getUser() == null) ? UserModel.ANONYMOUS : GitBlitWebSession.get().getUser();
bd0e83 68         final long nBytesUsed = app().filestore().getFilestoreUsedByteCount();
PM 69         final long nBytesAvailable = app().filestore().getFilestoreAvailableByteCount();
697905 70         List<FilestoreModel> files = app().filestore().getAllObjects(user);
6069be 71
697905 72         if (files == null) {
PM 73             files = new ArrayList<FilestoreModel>();
74         }
91aad7 75
PM 76         long nOk = 0;
77         long nPending = 0;
78         long nInprogress = 0;
79         long nError = 0;
80         long nDeleted = 0;
697905 81         
91aad7 82         for (FilestoreModel file : files) {
PM 83             switch (file.getStatus()) {
84             case Available: { nOk++;} break;
85             case Upload_Pending: { nPending++; } break;
86             case Upload_In_Progress: { nInprogress++; } break;
87             case Deleted: { nDeleted++; } break;
88             default: { nError++; } break;
89             }
90         }
91         
92         
93         BookmarkablePageLink<Void> itemOk = new BookmarkablePageLink<Void>("filterByOk", FilestorePage.class,
94                 WicketUtils.newFilestorePageParameter(prevPage, SortBy.ok.name()));
95         
96         BookmarkablePageLink<Void> itemPending = new BookmarkablePageLink<Void>("filterByPending", FilestorePage.class,
97                 WicketUtils.newFilestorePageParameter(prevPage, SortBy.pending.name()));
98         
99         BookmarkablePageLink<Void> itemInprogress = new BookmarkablePageLink<Void>("filterByInprogress", FilestorePage.class,
100                 WicketUtils.newFilestorePageParameter(prevPage, SortBy.inprogress.name()));
101         
102         BookmarkablePageLink<Void> itemError = new BookmarkablePageLink<Void>("filterByError", FilestorePage.class,
103                 WicketUtils.newFilestorePageParameter(prevPage, SortBy.error.name()));
bd0e83 104
91aad7 105         BookmarkablePageLink<Void> itemDeleted = new BookmarkablePageLink<Void>("filterByDeleted", FilestorePage.class,
PM 106                 WicketUtils.newFilestorePageParameter(prevPage, SortBy.deleted.name()));
107         
108         
109         List<FilestoreModel> filteredResults = new ArrayList<FilestoreModel>(files.size());
110         
111         if (filter == null) {
112             filteredResults = files;
113         } else if (filter.equals(SortBy.ok.name())) {
114             WicketUtils.setCssClass(itemOk, "filter-on");
115             
116             for (FilestoreModel item : files) {
117                 if (item.getStatus() == Status.Available) {
118                     filteredResults.add(item);
119                 }
120             }
121         } else if (filter.equals(SortBy.pending.name())) {
122             WicketUtils.setCssClass(itemPending, "filter-on");
123             
124             for (FilestoreModel item : files) {
125                 if (item.getStatus() == Status.Upload_Pending) {
126                     filteredResults.add(item);
127                 }
128             }
129         } else if (filter.equals(SortBy.inprogress.name())) {
130             WicketUtils.setCssClass(itemInprogress, "filter-on");
131             
132             for (FilestoreModel item : files) {
133                 if (item.getStatus() == Status.Upload_In_Progress) {
134                     filteredResults.add(item);
135                 }
136             }
137         } else if (filter.equals(SortBy.error.name())) {
138             WicketUtils.setCssClass(itemError, "filter-on");
139             
140             for (FilestoreModel item : files) {
141                 if (item.isInErrorState()) {
142                     filteredResults.add(item);
143                 }
144             }
145         } else if (filter.equals(SortBy.deleted.name())) {
146             WicketUtils.setCssClass(itemDeleted, "filter-on");
147             
148             for (FilestoreModel item : files) {
149                 if (item.getStatus() == Status.Deleted) {
150                     filteredResults.add(item);
151                 }
152             }
153         }
154         
155         DataView<FilestoreModel> filesView = new DataView<FilestoreModel>("fileRow", 
156                 new ListDataProvider<FilestoreModel>(filteredResults) , itemsPerPage) {
bd0e83 157             private static final long serialVersionUID = 1L;
PM 158             private int counter;
159
160             @Override
161             protected void onBeforeRender() {
162                 super.onBeforeRender();
163                 counter = 0;
164             }
165
166             @Override
167             public void populateItem(final Item<FilestoreModel> item) {
168                 final FilestoreModel entry = item.getModelObject();
6069be 169
bd0e83 170                 DateFormat dateFormater = new SimpleDateFormat(Constants.ISO8601);
6069be 171
bd0e83 172                 UserModel user = app().users().getUserModel(entry.getChangedBy());
PM 173                 user = user == null ? UserModel.ANONYMOUS : user;
6069be 174
bd0e83 175                 Label icon = FilestoreUI.getStatusIcon("status", entry);
PM 176                 item.add(icon);
177                 item.add(new Label("on", dateFormater.format(entry.getChangedOn())));
178                 item.add(new Label("by", user.getDisplayName()));
6069be 179
bd0e83 180                 item.add(new Label("oid", entry.oid));
6069be 181                 item.add(new Label("size", FileUtils.byteCountToDisplaySize(entry.getSize())));
JM 182
bd0e83 183                 WicketUtils.setAlternatingBackground(item, counter);
PM 184                 counter++;
185             }
186
187         };
6069be 188
91aad7 189
PM 190         if (filteredResults.size() < itemsPerPage) {
191             filesView.setCurrentPage(0);
192             hasMore = false;
193         } else {
194             filesView.setCurrentPage(pageNumber - 1);
195             hasMore = true;
196         }
197
198         
bd0e83 199         add(filesView);
91aad7 200         
PM 201         
202         add(new BookmarkablePageLink<Void>("firstPageBottom", FilestorePage.class).setEnabled(pageNumber > 1));
203         add(new BookmarkablePageLink<Void>("prevPageBottom", FilestorePage.class,
204                 WicketUtils.newFilestorePageParameter(prevPage, filter)).setEnabled(pageNumber > 1));
205         add(new BookmarkablePageLink<Void>("nextPageBottom", FilestorePage.class,
206                 WicketUtils.newFilestorePageParameter(nextPage, filter)).setEnabled(hasMore));
207         
208
209         itemOk.add(FilestoreUI.getStatusIcon("statusOkIcon", FilestoreModel.Status.Available));
210         itemPending.add(FilestoreUI.getStatusIcon("statusPendingIcon", FilestoreModel.Status.Upload_Pending));
211         itemInprogress.add(FilestoreUI.getStatusIcon("statusInprogressIcon", FilestoreModel.Status.Upload_In_Progress));
212         itemError.add(FilestoreUI.getStatusIcon("statusErrorIcon", FilestoreModel.Status.Error_Unknown));
213         itemDeleted.add(FilestoreUI.getStatusIcon("statusDeletedIcon", FilestoreModel.Status.Deleted));
214         
215         itemOk.add(new Label("statusOkCount", String.valueOf(nOk)));
216         itemPending.add(new Label("statusPendingCount", String.valueOf(nPending)));
217         itemInprogress.add(new Label("statusInprogressCount", String.valueOf(nInprogress)));
218         itemError.add(new Label("statusErrorCount", String.valueOf(nError)));
219         itemDeleted.add(new Label("statusDeletedCount", String.valueOf(nDeleted)));
220         
221         add(itemOk);
222         add(itemPending);
223         add(itemInprogress);
224         add(itemError);
225         add(itemDeleted);
226         
227         add(new Label("spaceAvailable", String.format("%s / %s",
228                 FileUtils.byteCountToDisplaySize(nBytesUsed),
229                 FileUtils.byteCountToDisplaySize(nBytesAvailable))));
230         
231         BookmarkablePageLink<Void> helpLink = new BookmarkablePageLink<Void>("filestoreHelp", FilestoreUsage.class);
232         helpLink.add(new Label("helpMessage", getString("gb.filestoreHelp")));
233         add(helpLink);
234
bd0e83 235     }
91aad7 236         
PM 237     protected enum SortBy {
238         ok, pending, inprogress, error, deleted;
239     }
240     
241 }