001 package railo.commons.io.res.type.s3; 002 003 import java.io.IOException; 004 import java.io.InputStream; 005 import java.util.ArrayList; 006 import java.util.List; 007 008 import org.xml.sax.Attributes; 009 import org.xml.sax.SAXException; 010 011 import railo.runtime.exp.PageException; 012 import railo.runtime.op.Caster; 013 014 public final class ContentFactory extends S3Factory { 015 016 private boolean insideContents=false; 017 private boolean insideOwners=false; 018 019 private Content content; 020 private List contents=new ArrayList(); 021 private final S3 s3; 022 private String bucketName; 023 private boolean isTruncated; 024 025 026 /** 027 * @param saxParser String Klassenpfad zum Sax Parser. 028 * @param file File Objekt auf die TLD. 029 * @throws IOException 030 * @throws SAXException 031 */ 032 public ContentFactory(InputStream in,S3 s3) throws IOException, SAXException { 033 super(); 034 this.s3=s3; 035 init(in); 036 } 037 038 public void doStartElement(String uri, String name, String qName, Attributes atts) { 039 if(qName.equals("Contents")) startContents(); 040 if(qName.equals("Owner")) insideOwners=true; 041 042 } 043 044 public void doEndElement(String uri, String name, String qName) throws SAXException { 045 if(qName.equals("Contents")) endContents(); 046 if(qName.equals("Owner")) insideOwners=false; 047 048 } 049 050 051 protected void setContent(String value) throws SAXException { 052 if(insideContents) { 053 if(insideOwners){ 054 if(inside.equals("ID")) content.setOwnerIdKey(value); 055 else if(inside.equals("DisplayName")) content.setOwnerDisplayName(value); 056 057 } 058 else { 059 try { 060 if(inside.equals("Key")) { 061 content.setKey(value); 062 } 063 else if(inside.equals("LastModified")) content.setLastModified( 064 S3.toDate(value,s3.getTimeZone()).getTime()); 065 else if(inside.equals("ETag")) content.setETag(value); // MUST HTML Encoder 066 else if(inside.equals("Size")) content.setSize(Caster.toLongValue(value,0L)); 067 else if(inside.equals("StorageClass")) content.setStorageClass(value); 068 } 069 catch (PageException e) { 070 throw new SAXException(e.getMessage()); 071 } 072 } 073 074 } 075 else { 076 if(inside.equals("Name")) bucketName=value; 077 else if(inside.equals("IsTruncated")) isTruncated=Caster.toBooleanValue(value,false); 078 079 } 080 081 } 082 /* 083 084 085 <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 086 <Contents> 087 <Owner> 088 <ID>5f8fc1a3e7f09e6e1bf5f7d7d0dfadfd0efc2e0afbf7789836f3ab67b2dddfdf</ID> 089 <DisplayName>michael.streit</DisplayName> 090 </Owner> 091 <StorageClass>STANDARD</StorageClass> 092 </Contents> 093 <Contents> 094 <Key>susi2</Key> 095 <LastModified>2008-03-05T14:10:43.000Z</LastModified> 096 <ETag>"f84bcc91f8fd1321a251311c7e9fbfce"</ETag><Size>156169</Size><Owner><ID>5f8fc1a3e7f09e6e1bf5f7d7d0dfadfd0efc2e0afbf7789836f3ab67b2dddfdf</ID><DisplayName>michael.streit</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents></ListBucketResult> 097 098 */ 099 100 101 102 /** 103 * Wird jedesmal wenn das Tag attribute beginnt aufgerufen, um intern in einen anderen Zustand zu gelangen. 104 */ 105 private void startContents() { 106 insideContents=true; 107 content=new Content(s3); 108 } 109 110 111 /** 112 * Wird jedesmal wenn das Tag tag endet aufgerufen, um intern in einen anderen Zustand zu gelangen. 113 */ 114 private void endContents() { 115 content.setBucketName(bucketName); 116 content.setTruncated(isTruncated); 117 contents.add(content); 118 insideContents=false; 119 } 120 121 public Content[] getContents() { 122 return (Content[]) contents.toArray(new Content[contents.size()]); 123 } 124 /* 125 126 127 <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 128 <Name>halloWelt</Name> 129 <Prefix></Prefix> 130 <Marker></Marker> 131 <MaxKeys>1000</MaxKeys> 132 <IsTruncated>false</IsTruncated> 133 <Contents> 134 <Key>susi</Key> 135 <LastModified>2008-03-05T14:10:41.000Z</LastModified> 136 <ETag>"f84bcc91f8fd1321a251311c7e9fbfce"</ETag> 137 <Size>156169</Size> 138 <Owner> 139 <ID>5f8fc1a3e7f09e6e1bf5f7d7d0dfadfd0efc2e0afbf7789836f3ab67b2dddfdf</ID> 140 <DisplayName>michael.streit</DisplayName> 141 </Owner> 142 <StorageClass>STANDARD</StorageClass> 143 </Contents> 144 <Contents> 145 <Key>susi2</Key> 146 <LastModified>2008-03-05T14:10:43.000Z</LastModified> 147 <ETag>"f84bcc91f8fd1321a251311c7e9fbfce"</ETag><Size>156169</Size><Owner><ID>5f8fc1a3e7f09e6e1bf5f7d7d0dfadfd0efc2e0afbf7789836f3ab67b2dddfdf</ID><DisplayName>michael.streit</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents></ListBucketResult> 148 149 */ 150 151 /** 152 * @return the isTruncated 153 */ 154 public boolean isTruncated() { 155 return isTruncated; 156 } 157 }