View Javadoc

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   * Convert information from an S3 bucket into pojo's
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       * Return a NumberFormat that does not using grouping and always displays one fraction digit. This is used to
34       * display the size of S3 objects in kilobytes
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       * Convert "foo/bar/css/" into "foo/bar/css"<br>
46       * Convert "foo/bar/css" into "foo/bar"<br>
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       * Convert each DisplayRow object in the list to a String[] and add the String[] to the list of data
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       * Convert a DisplayRow object to a String[]
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       * Trim the prefix off of the text we display for this object.<br>
82       * Display "style.css" instead of "css/style.css"
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       * Convert a commonPrefix into a DisplayRow object for the UI
95       */
96      protected DisplayRow getDisplayRow(final String commonPrefix, final String prefix, final String delimiter) {
97  
98          // Create some UI friendly strings
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         // Store them in an object
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      * Convert the ObjectListing into a List of String arrays. Each array in the list represents one row in the html
131      * table we will be generating
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      * Convert an S3ObjectSummary into a DisplayRow object for the UI
165      */
166     protected DisplayRow getDisplayRow(final S3ObjectSummary summary, final String prefix, final String delimiter) {
167         String key = summary.getKey();
168 
169         // Create some UI friendly strings
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         // Store them in an object
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      * Convert a commonPrefix into a DisplayRow object for the UI
205      */
206     protected DisplayRow getUpOneDirectoryDisplayRow(final String prefix, final String delimiter) {
207         if (StringUtils.isEmpty(prefix)) {
208             return null;
209         }
210 
211         // Create some UI friendly strings
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         // Store them in an object
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      * If prefix is "foo/" and delimiter is "/" return "/"<br>
230      * If prefix is "foo/bar/" and delimiter is "/" return "foo/"
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 }