1 /** 2 * Copyright 2004-2014 The Kuali Foundation 3 * 4 * Licensed under the Educational Community 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.opensource.org/licenses/ecl2.php 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 org.kuali.common.aws.cloudfront; 17 18 import java.text.SimpleDateFormat; 19 import java.util.List; 20 21 import org.apache.commons.lang.StringUtils; 22 import org.kuali.common.util.Counter; 23 import org.kuali.common.util.Str; 24 import org.kuali.common.util.html.HtmlUtils; 25 26 import com.amazonaws.services.s3.model.S3ObjectSummary; 27 28 /** 29 * Convert information from an S3 bucket into pojo's 30 */ 31 public class DefaultListingConverterService implements ListingConverterService { 32 33 /** 34 * Convert "foo/bar/css/" into "foo/bar/css"<br> 35 * Convert "foo/bar/css" into "foo/bar"<br> 36 */ 37 protected String getTrimmedPrefix(String prefix, String delimiter) { 38 return Str.removeSuffix(prefix, delimiter); 39 } 40 41 /** 42 * Convert each DisplayRow object in the list to a String[] and add the String[] to the list of data 43 */ 44 protected void addDisplayRows(List<DisplayRow> displayRows, List<String[]> data) { 45 for (DisplayRow displayRow : displayRows) { 46 addDisplayRow(displayRow, data); 47 } 48 } 49 50 /** 51 * Convert a DisplayRow object to a String[] 52 */ 53 protected void addDisplayRow(DisplayRow displayRow, List<String[]> data) { 54 if (displayRow == null) { 55 return; 56 } 57 String[] row = new String[4]; 58 row[0] = displayRow.getImage(); 59 row[1] = displayRow.getAhref(); 60 row[2] = displayRow.getLastModified(); 61 row[3] = displayRow.getSize(); 62 data.add(row); 63 } 64 65 /** 66 * Trim the prefix off of the text we display for this object.<br> 67 * Display "style.css" instead of "css/style.css" 68 */ 69 protected String getShow(String key, String prefix) { 70 if (prefix == null) { 71 return key; 72 } 73 int index = prefix.length(); 74 String s = key.substring(index); 75 return s; 76 } 77 78 /** 79 * Convert a commonPrefix into a DisplayRow object for the UI 80 */ 81 protected DisplayRow getDisplayRow(String commonPrefix, IndexDataContext context, Counter indent) { 82 /** 83 * // Create some UI friendly strings String image = HtmlUtils.getImage(context.getConverterContext().getDirImage(), indent); String show = getShow(commonPrefix, 84 * context.getListing().getPrefix()); String dest = context.getBucketContext().getDelimiter() + commonPrefix; String ahref = HtmlUtils.getHref(dest, show, indent); String 85 * date = "-"; String size = "-"; 86 * 87 * // Store them in an object DisplayRow displayRow = new DisplayRow(); displayRow.setImage(image); displayRow.setAhref(ahref); displayRow.setLastModified(date); 88 * displayRow.setSize(size); displayRow.setShow(show); return displayRow; 89 **/ 90 return null; 91 } 92 93 protected List<DisplayRow> getDirectoryDisplayRows(IndexDataContext context, Counter indent) { 94 /** 95 * List<DisplayRow> displayRows = new ArrayList<DisplayRow>(); for (String commonPrefix : context.getListing().getCommonPrefixes()) { DisplayRow displayRow = 96 * getDisplayRow(commonPrefix, context, indent); if (displayRow == null) { continue; } displayRows.add(displayRow); } return displayRows; 97 **/ 98 return null; 99 } 100 101 @Override 102 public List<String[]> getIndexData(IndexDataContext context) { 103 /** 104 * ListingConverterContext lcc = context.getConverterContext(); ObjectListing listing = context.getListing(); 105 * 106 * SimpleDateFormat formatter = CloudFrontUtils.getSimpleDateFormat(lcc.getDateDisplayFormat(), lcc.getDateDisplayTimeZone()); Counter indent = new Counter(); DisplayRow 107 * upOneDirectory = getUpOneDirectoryDisplayRow(context, listing.getPrefix(), indent); List<DisplayRow> objectDisplayRows = getObjectDisplayRows(context, indent, 108 * formatter); List<DisplayRow> directoryDisplayRows = getDirectoryDisplayRows(context, indent); Comparator<DisplayRow> comparator = new DisplayRowComparator(); 109 * Collections.sort(directoryDisplayRows, comparator); List<String[]> indexData = new ArrayList<String[]>(); addDisplayRow(upOneDirectory, indexData); 110 * addDisplayRows(directoryDisplayRows, indexData); addDisplayRows(objectDisplayRows, indexData); return indexData; 111 **/ 112 return null; 113 } 114 115 protected boolean isDirectory(S3ObjectSummary summary, List<String> commonPrefixes, String prefix, String delimiter) { 116 String key = summary.getKey(); 117 if (StringUtils.equals(key, prefix)) { 118 return true; 119 } 120 for (String commonPrefix : commonPrefixes) { 121 if (StringUtils.equals(key, commonPrefix)) { 122 return true; 123 } 124 String trimmedPrefix = Str.removeSuffix(commonPrefix, delimiter); 125 if (StringUtils.equals(key, trimmedPrefix)) { 126 return true; 127 } 128 } 129 return false; 130 } 131 132 /** 133 * Convert an S3ObjectSummary into a DisplayRow object for the UI 134 */ 135 protected DisplayRow getDisplayRow(IndexDataContext context, S3ObjectSummary summary, Counter indent, SimpleDateFormat formatter) { 136 /** 137 138 String delimiter = context.getBucketContext().getDelimiter(); 139 140 String key = summary.getKey(); 141 142 // Create some UI friendly strings 143 String image = HtmlUtils.getImage(context.getConverterContext().getFileImage(), indent); 144 String show = getShow(key, context.getListing().getPrefix()); 145 String dest = delimiter + key; 146 String ahref = HtmlUtils.getHref(dest, show, indent); 147 String date = formatter.format(summary.getLastModified()); 148 String size = FormatUtils.getSize(summary.getSize()); 149 150 // Store them in an object 151 DisplayRow displayRow = new DisplayRow(); 152 displayRow.setShow(show); 153 displayRow.setImage(image); 154 displayRow.setAhref(ahref); 155 displayRow.setLastModified(date); 156 displayRow.setSize(size); 157 return displayRow; 158 **/ 159 return null; 160 } 161 162 protected List<DisplayRow> getObjectDisplayRows(IndexDataContext context, Counter indent, SimpleDateFormat formatter) { 163 /** 164 String delimiter = context.getBucketContext().getDelimiter(); 165 ObjectListing listing = context.getListing(); 166 List<DisplayRow> displayRows = new ArrayList<DisplayRow>(); 167 for (S3ObjectSummary summary : listing.getObjectSummaries()) { 168 if (isDirectory(summary, listing.getCommonPrefixes(), listing.getPrefix(), delimiter)) { 169 continue; 170 } 171 DisplayRow displayRow = getDisplayRow(context, summary, indent, formatter); 172 if (displayRow == null) { 173 continue; 174 } 175 displayRows.add(displayRow); 176 } 177 return displayRows; 178 **/ 179 return null; 180 } 181 182 /** 183 * Convert a commonPrefix into a DisplayRow object for the UI 184 */ 185 protected DisplayRow getUpOneDirectoryDisplayRow(IndexDataContext context, String prefix, Counter indent) { 186 187 String delimiter = context.getBucketContext().getDelimiter(); 188 String browseKey = context.getConverterContext().getBrowseKey(); 189 190 if (StringUtils.isEmpty(prefix)) { 191 return null; 192 } 193 194 // Create some UI friendly strings 195 String image = ""; 196 String show = ".." + delimiter; 197 String dest = getUpOneDirectoryDest(prefix, delimiter, browseKey); 198 String ahref = HtmlUtils.getHref(dest, show, indent); 199 String date = ""; 200 String size = ""; 201 202 // Store them in an object 203 DisplayRow displayRow = new DisplayRow(); 204 displayRow.setImage(image); 205 displayRow.setAhref(ahref); 206 displayRow.setLastModified(date); 207 displayRow.setSize(size); 208 return displayRow; 209 } 210 211 /** 212 * If prefix is "foo/" and delimiter is "/" return "/"<br> 213 * If prefix is "foo/bar/" and delimiter is "/" return "foo/" 214 */ 215 protected String getUpOneDirectoryDest(String prefix, String delimiter, String browseKey) { 216 if (prefix.endsWith(delimiter)) { 217 prefix = prefix.substring(0, prefix.length() - 1); 218 } 219 int pos = prefix.lastIndexOf(delimiter); 220 if (pos == -1) { 221 return delimiter + browseKey; 222 } else { 223 return delimiter + prefix.substring(0, pos + 1); 224 } 225 } 226 227 }