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>&quot;f84bcc91f8fd1321a251311c7e9fbfce&quot;</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>&quot;f84bcc91f8fd1321a251311c7e9fbfce&quot;</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>&quot;f84bcc91f8fd1321a251311c7e9fbfce&quot;</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    }