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 Repraesentation einer TLD ein 
015     * und laedt 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 erhaelt.
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            @Override
046            public void doStartElement(String uri, String name, String qName, Attributes atts) {
047                    if(qName.equals("Owner")) insideOwners=true;
048                    if(qName.equals("Buckets")) insideBuckets=true;
049                    if(qName.equals("Bucket")) startBucket();
050                    
051            }
052        
053            @Override
054            public void doEndElement(String uri, String name, String qName) throws SAXException {
055                    if(qName.equals("Owner")) insideOwners=false;
056                    if(qName.equals("Buckets")) insideBuckets=false;
057                    if(qName.equals("Bucket")) endBucket();
058            }
059            
060            
061            protected void setContent(String value) throws SAXException     {
062                    if(insideOwners){
063                            if(inside.equals("ID"))                                         ownerIdKey=value;
064                            else if(inside.equals("DisplayName"))           ownerDisplayName=value;
065                            
066                    }
067                    if(insideBuckets && insideBucket)       {
068                            // Name
069                            if(inside.equals("Name")) bucket.setName(value);
070                            // CreationDate
071                            else if(inside.equals("CreationDate")) {
072                                    try {
073                                            bucket.setCreation(S3.toDate(value,s3.getTimeZone()));
074                                    } 
075                                    catch (PageException e) {
076                                            throw new SAXException(e.getMessage());
077                                    }       
078                            }
079            }
080        }   
081            
082            
083            
084            /**
085             * Wird jedesmal wenn das Tag attribute beginnt aufgerufen, um intern in einen anderen Zustand zu gelangen.
086             */
087            private void startBucket()      {
088            insideBucket=true;
089            bucket=new Bucket(s3); 
090        }
091            
092            
093            /**
094             * Wird jedesmal wenn das Tag tag endet aufgerufen, um intern in einen anderen Zustand zu gelangen.
095             */
096            private void endBucket()        {
097                    bucket.setOwnerDisplayName(ownerDisplayName);
098                    bucket.setOwnerIdKey(ownerIdKey);
099                    buckets.add(bucket);
100            insideBucket=false;
101        }
102    
103            public Bucket[] getBuckets() {
104                    return (Bucket[]) buckets.toArray(new Bucket[buckets.size()]);
105            }
106    
107    }