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    
013    /**
014     * Die Klasse TagLibFactory liest die XML Repr�sentation einer TLD ein 
015     * und l�dt diese in eine Objektstruktur. 
016     * Sie tut dieses mithilfe eines Sax Parser.
017     * Die Klasse kann sowohl einzelne Files oder gar ganze Verzeichnisse von TLD laden.
018     */
019    public final class BucketFactory extends S3Factory {
020            
021            private boolean insideBuckets=false;
022            private boolean insideBucket=false;
023            private final S3 s3;
024            
025            private Bucket bucket; 
026            private final List buckets=new ArrayList();
027            private boolean insideOwners;
028            private String ownerIdKey;
029            private String ownerDisplayName; 
030    
031    
032            /**
033             * Privater Konstruktor, der als Eingabe die TLD als File Objekt erh�lt.
034             * @param saxParser String Klassenpfad zum Sax Parser.
035             * @param file File Objekt auf die TLD.
036             * @throws IOException 
037             * @throws SAXException 
038             */
039            public BucketFactory(InputStream in, S3 s3) throws IOException, SAXException {
040                    super();
041                    this.s3=s3;
042                    init(in);
043            }
044    
045            /**
046             * Geerbte Methode von org.xml.sax.ContentHandler, 
047             * wird bei durchparsen des XML, beim Auftreten eines Start-Tag aufgerufen.
048             *  
049             * @see org.xml.sax.ContentHandler#startElement(String, String, String, Attributes)
050             */
051            public void doStartElement(String uri, String name, String qName, Attributes atts) {
052                    if(qName.equals("Owner")) insideOwners=true;
053                    if(qName.equals("Buckets")) insideBuckets=true;
054                    if(qName.equals("Bucket")) startBucket();
055                    
056            }
057        
058            /**
059             * Geerbte Methode von org.xml.sax.ContentHandler, 
060             * wird bei durchparsen des XML, beim auftreten eines End-Tag aufgerufen.
061             *  
062             * @see org.xml.sax.ContentHandler#endElement(String, String, String)
063             */
064            public void doEndElement(String uri, String name, String qName) throws SAXException {
065                    if(qName.equals("Owner")) insideOwners=false;
066                    if(qName.equals("Buckets")) insideBuckets=false;
067                    if(qName.equals("Bucket")) endBucket();
068            }
069            
070            
071            protected void setContent(String value) throws SAXException     {
072                    if(insideOwners){
073                            if(inside.equals("ID"))                                         ownerIdKey=value;
074                            else if(inside.equals("DisplayName"))           ownerDisplayName=value;
075                            
076                    }
077                    if(insideBuckets && insideBucket)       {
078                            // Name
079                            if(inside.equals("Name")) bucket.setName(value);
080                            // CreationDate
081                            else if(inside.equals("CreationDate")) {
082                                    try {
083                                            bucket.setCreation(S3.toDate(value,s3.getTimeZone()));
084                                    } 
085                                    catch (PageException e) {
086                                            throw new SAXException(e.getMessage());
087                                    }       
088                            }
089            }
090        }   
091            
092            
093            
094            /**
095             * Wird jedesmal wenn das Tag attribute beginnt aufgerufen, um intern in einen anderen Zustand zu gelangen.
096             */
097            private void startBucket()      {
098            insideBucket=true;
099            bucket=new Bucket(s3); 
100        }
101            
102            
103            /**
104             * Wird jedesmal wenn das Tag tag endet aufgerufen, um intern in einen anderen Zustand zu gelangen.
105             */
106            private void endBucket()        {
107                    bucket.setOwnerDisplayName(ownerDisplayName);
108                    bucket.setOwnerIdKey(ownerIdKey);
109                    buckets.add(bucket);
110            insideBucket=false;
111        }
112    
113            public Bucket[] getBuckets() {
114                    return (Bucket[]) buckets.toArray(new Bucket[buckets.size()]);
115            }
116    
117    }