001    package railo.commons.io.res.type.s3;
002    
003    import java.io.IOException;
004    import java.io.InputStream;
005    import java.util.List;
006    
007    import org.xml.sax.Attributes;
008    import org.xml.sax.SAXException;
009    
010    
011    public final class ACLFactory extends S3Factory {
012    
013            private boolean insideAccessControlList=false; 
014            private boolean insideGrant=false; 
015            private boolean insideGrantee=false; 
016            
017            private boolean insideOwners=false;
018    
019            private AccessControl ac; 
020            private AccessControlPolicy acp=new AccessControlPolicy();
021            private List<AccessControl> acl=acp.getAccessControlList();
022            private String type;
023            
024    
025            /**
026             * @param saxParser String Klassenpfad zum Sax Parser.
027             * @param file File Objekt auf die TLD.
028             * @throws IOException 
029             * @throws SAXException 
030             */
031            public ACLFactory(InputStream in,S3 s3) throws IOException, SAXException {
032                    super();
033                    init(in);
034            }
035    
036            public void doStartElement(String uri, String name, String qName, Attributes atts) {
037                    if(insideGrant) {
038                            if(qName.equals("Grantee")) {
039                                    for(int i=atts.getLength()-1;i>=0;i--){
040                                            if("type".equalsIgnoreCase(atts.getLocalName(i)))
041                                                    type=atts.getValue(i);
042                                    }
043                                    
044                                    
045                                    insideGrantee=true;
046                            }
047                    }
048                    else if(insideAccessControlList) {
049                            if(qName.equals("Grant")) startGrant();
050                    }
051                    else if(qName.equals("AccessControlList")) insideAccessControlList=true;
052                    else if(qName.equals("Owner")) insideOwners=true;
053                    
054            }
055        
056            public void doEndElement(String uri, String name, String qName) throws SAXException {
057                    if(insideGrant) {
058                            if(qName.equals("Grant")) endGrant();
059                            else if(qName.equals("Grantee")) insideGrantee=false;
060                    }
061                    else if(qName.equals("AccessControlList")) insideAccessControlList=false;
062                    else if(qName.equals("Owner")) insideOwners=false;
063            }
064            
065            
066            protected void setContent(String value) throws SAXException     {
067                    if(insideGrant) {
068                            if(insideGrantee){
069                                    if(inside.equals("ID"))                                         ac.setId(value);
070                                    else if(inside.equals("DisplayName"))           ac.setDisplayName(value);
071                                    else if(inside.equals("URI"))                           ac.setUri(value);
072                                    else if(inside.equals("Email"))                         ac.setEmail(value);
073                                    else if(inside.equals("EmailAddress"))          ac.setEmail(value);
074                                    
075                            }
076                            else {
077                                    if(inside.equals("Permission"))                         ac.setPermission(value);
078                            }
079            }
080                    else if(insideOwners) {
081                            if(inside.equals("ID"))                                         acp.setId(value);
082                            else if(inside.equals("DisplayName"))           acp.setDisplayName(value);
083                    }
084        }
085            
086            
087            /**
088             * Wird jedesmal wenn das Tag attribute beginnt aufgerufen, um intern in einen anderen Zustand zu gelangen.
089             */
090            private void startGrant()       {
091            insideGrant=true;
092            ac=new AccessControl(); 
093        }
094            
095            
096            /**
097             * Wird jedesmal wenn das Tag tag endet aufgerufen, um intern in einen anderen Zustand zu gelangen.
098             */
099            private void endGrant() {
100                    ac.setType(AccessControl.toType(type,AccessControl.TYPE_CANONICAL_USER));
101                    acl.add(ac);
102                    insideGrant=false;
103        }
104    
105            public AccessControlPolicy getAccessControlPolicy() {
106                    return acp;
107            }
108    
109    
110    }