1 package org.kuali.maven.mojo.s3;
2
3 import java.text.NumberFormat;
4 import java.util.ArrayList;
5 import java.util.Collections;
6 import java.util.Comparator;
7 import java.util.List;
8
9 import org.apache.commons.lang.StringUtils;
10
11 import com.amazonaws.services.s3.model.ObjectListing;
12 import com.amazonaws.services.s3.model.S3ObjectSummary;
13
14
15
16
17 public class S3DataConverter {
18 HtmlUtils html = new HtmlUtils();
19 NumberFormat nf = getNumberFormatInstance();
20 S3BucketContext context;
21 String browseKey;
22
23 public S3DataConverter() {
24 this(null);
25 }
26
27 public S3DataConverter(final S3BucketContext context) {
28 super();
29 this.context = context;
30 }
31
32
33
34
35
36 protected NumberFormat getNumberFormatInstance() {
37 NumberFormat nf = NumberFormat.getInstance();
38 nf.setMaximumFractionDigits(1);
39 nf.setMinimumFractionDigits(1);
40 nf.setGroupingUsed(false);
41 return nf;
42 }
43
44
45
46
47
48 protected String getTrimmedPrefix(final String prefix, final String delimiter) {
49 int pos = prefix.lastIndexOf(delimiter);
50 if (pos == -1) {
51 return prefix;
52 }
53 return prefix.substring(0, pos);
54 }
55
56
57
58
59 protected void addDisplayRows(final List<DisplayRow> displayRows, final List<String[]> data) {
60 for (DisplayRow displayRow : displayRows) {
61 addDisplayRow(displayRow, data);
62 }
63 }
64
65
66
67
68 protected void addDisplayRow(final DisplayRow displayRow, final List<String[]> data) {
69 if (displayRow == null) {
70 return;
71 }
72 String[] row = new String[4];
73 row[0] = displayRow.getImage();
74 row[1] = displayRow.getAhref();
75 row[2] = displayRow.getLastModified();
76 row[3] = displayRow.getSize();
77 data.add(row);
78 }
79
80
81
82
83
84 protected String getShow(final String key, final String prefix) {
85 if (prefix == null) {
86 return key;
87 }
88 int index = prefix.length();
89 String s = key.substring(index);
90 return s;
91 }
92
93
94
95
96 protected DisplayRow getDisplayRow(final String commonPrefix, final String prefix, final String delimiter) {
97
98
99 String image = html.getImage(context.getDirectoryImage());
100 String show = getShow(commonPrefix, prefix);
101 String dest = delimiter + commonPrefix;
102 String ahref = html.getHref(dest, show);
103 String date = "-";
104 String size = "-";
105
106
107 DisplayRow displayRow = new DisplayRow();
108 displayRow.setImage(image);
109 displayRow.setAhref(ahref);
110 displayRow.setLastModified(date);
111 displayRow.setSize(size);
112 displayRow.setShow(show);
113 return displayRow;
114 }
115
116 protected List<DisplayRow> getDirectoryDisplayRows(final ObjectListing objectListing, final String prefix,
117 final String delimiter) {
118 List<DisplayRow> displayRows = new ArrayList<DisplayRow>();
119 for (String commonPrefix : objectListing.getCommonPrefixes()) {
120 DisplayRow displayRow = getDisplayRow(commonPrefix, prefix, delimiter);
121 if (displayRow == null) {
122 continue;
123 }
124 displayRows.add(displayRow);
125 }
126 return displayRows;
127 }
128
129
130
131
132
133 public List<String[]> getData(final ObjectListing objectListing, final String prefix, final String delimiter) {
134 DisplayRow upOneDirectory = getUpOneDirectoryDisplayRow(prefix, delimiter);
135 List<DisplayRow> objectDisplayRows = getObjectDisplayRows(objectListing, prefix, delimiter);
136 List<DisplayRow> directoryDisplayRows = getDirectoryDisplayRows(objectListing, prefix, delimiter);
137 Comparator<DisplayRow> c = new DisplayRowComparator();
138 Collections.sort(directoryDisplayRows, c);
139 List<String[]> data = new ArrayList<String[]>();
140 addDisplayRow(upOneDirectory, data);
141 addDisplayRows(directoryDisplayRows, data);
142 addDisplayRows(objectDisplayRows, data);
143 return data;
144 }
145
146 protected boolean isDirectory(S3ObjectSummary summary, List<String> commonPrefixes, String prefix, String delimiter) {
147 String key = summary.getKey();
148 if (key.equals(prefix)) {
149 return true;
150 }
151 for (String commonPrefix : commonPrefixes) {
152 if (key.equals(commonPrefix)) {
153 return true;
154 }
155 String trimmedPrefix = getTrimmedPrefix(commonPrefix, delimiter);
156 if (key.equals(trimmedPrefix)) {
157 return true;
158 }
159 }
160 return false;
161 }
162
163
164
165
166 protected DisplayRow getDisplayRow(final S3ObjectSummary summary, final String prefix, final String delimiter) {
167 String key = summary.getKey();
168
169
170 String image = html.getImage(context.getFileImage());
171 String show = getShow(key, prefix);
172 String dest = delimiter + key;
173 String ahref = html.getHref(dest, show);
174 String date = context.getLastModifiedDateFormatter().format(summary.getLastModified());
175 String size = nf.format((summary.getSize() / 1024D)) + " KiB";
176
177
178 DisplayRow displayRow = new DisplayRow();
179 displayRow.setShow(show);
180 displayRow.setImage(image);
181 displayRow.setAhref(ahref);
182 displayRow.setLastModified(date);
183 displayRow.setSize(size);
184 return displayRow;
185 }
186
187 protected List<DisplayRow> getObjectDisplayRows(final ObjectListing objectListing, final String prefix,
188 final String delimiter) {
189 List<DisplayRow> displayRows = new ArrayList<DisplayRow>();
190 for (S3ObjectSummary summary : objectListing.getObjectSummaries()) {
191 if (isDirectory(summary, objectListing.getCommonPrefixes(), prefix, delimiter)) {
192 continue;
193 }
194 DisplayRow displayRow = getDisplayRow(summary, prefix, delimiter);
195 if (displayRow == null) {
196 continue;
197 }
198 displayRows.add(displayRow);
199 }
200 return displayRows;
201 }
202
203
204
205
206 protected DisplayRow getUpOneDirectoryDisplayRow(final String prefix, final String delimiter) {
207 if (StringUtils.isEmpty(prefix)) {
208 return null;
209 }
210
211
212 String image = "";
213 String show = ".." + delimiter;
214 String dest = getUpOneDirectoryDest(prefix, delimiter);
215 String ahref = html.getHref(dest, show);
216 String date = "";
217 String size = "";
218
219
220 DisplayRow displayRow = new DisplayRow();
221 displayRow.setImage(image);
222 displayRow.setAhref(ahref);
223 displayRow.setLastModified(date);
224 displayRow.setSize(size);
225 return displayRow;
226 }
227
228
229
230
231
232 protected String getUpOneDirectoryDest(String prefix, final String delimiter) {
233 if (prefix.endsWith(delimiter)) {
234 prefix = prefix.substring(0, prefix.length() - 1);
235 }
236 int pos = prefix.lastIndexOf(delimiter);
237 if (pos == -1) {
238 return delimiter + getBrowseKey();
239 } else {
240 return delimiter + prefix.substring(0, pos + 1);
241 }
242 }
243
244 public void setContext(final S3BucketContext context) {
245 this.context = context;
246 }
247
248 public S3BucketContext getContext() {
249 return context;
250 }
251
252 public String getBrowseKey() {
253 return browseKey;
254 }
255
256 public void setBrowseKey(final String browseHtml) {
257 this.browseKey = browseHtml;
258 }
259
260 }